質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Q&A

解決済

1回答

613閲覧

KVOを用いた値の監視について

tontoon

総合スコア12

Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

0グッド

0クリップ

投稿2017/10/23 16:22

編集2017/10/23 16:28

<環境>
Xcode 9.0.1
Objective-C

<解決したいこと>
Observerで値の監視をする

<本文>
ご覧いただきましてありがとうございます。

動画を再生させるアプリをMVMovieControllerを用いて開発していたのですが、
この度iOS11でAVViewControllerを使用することにしました。

KVOを用いた値の監視をしたいのですが、
Observerに登録できず困っています。

かなり古い記事ですが下記のURLを参考に実装していました。
stakoverflow: fullscreenの監視について

動作確認用に小さなプロジェクトも作ってみました。
AVPlayerViewController - sample project

以下、上記プロジェクト内のコード抜粋です。

Objectice

1- (void)viewDidLoad { 2 [super viewDidLoad]; 3 4 // set observer 5 [_videoView.playerVC.contentOverlayView addObserver:self 6 forKeyPath:@"bounds" 7 options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld 8 context:NULL]; 9 10 NSURL *url = [NSURL URLWithString:@"https://s3-ap-northeast-1.amazonaws.com/hls-sample/index.m3u8"]; 11 [_videoView createMoviePlayer:url]; 12} 13 14- (void)viewDidDisappear:(BOOL)animated { 15 [super viewDidDisappear:animated]; 16 [self removeObserver]; 17} 18 19#pragma mark - observer 20 21- (void)observeValueForKeyPath:(NSString *)keyPath 22 ofObject:(id)object 23 change:(NSDictionary<NSString *, id> *)change 24 context:(void *)context { 25 26 if (object == _videoView.playerVC.contentOverlayView) { 27 if ([keyPath isEqualToString:@"bounds"]) { 28 29 CGRect oldBounds = [change[NSKeyValueChangeOldKey] CGRectValue]; 30 CGRect newBounds = [change[NSKeyValueChangeNewKey] CGRectValue]; 31 BOOL wasFullscreen = CGRectEqualToRect(oldBounds, [UIScreen mainScreen].bounds); 32 BOOL isFullscreen = CGRectEqualToRect(newBounds, [UIScreen mainScreen].bounds); 33 34 if (isFullscreen && !wasFullscreen) { 35 NSLog(@"bocome fullscreen"); 36 } else if (!isFullscreen && wasFullscreen) { 37 NSLog(@"exited fullscreen"); 38 } 39 } 40 } 41}

iOS10未満だと期待通りの動作するのですが、
iOS11でのみ動かすことができていません。

何かしらヒント・アドバイスを頂けたら幸いです。よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

_videoView.playerVCがnilなので登録できていないのでは?
[_videoView createMoviePlayer:url];の後で登録するとどうでしょうか?

投稿2017/10/24 01:00

fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tontoon

2017/10/24 02:25

ご回答ありがとうございます。おっしゃる通りnilになっており、AVPlayer生成後に処理を移動したら登録できました!確認不足でした、申し訳ないです。 また、iOS11からはAVPlayerをfullscreenにするとviewDidDisappearが呼ばれるようです。監視を続けるには別の方法が必要になりそうですね、、、
fuzzball

2017/10/24 05:21

viewDidLoadとviewDidDisappearでは「対」になっていないので、どちらにしても修正の必要はありますね。 親ViewControllerで管理するとか、VideoViewのinit/deallocで処理するとか?(適当に書いてます)
tontoon

2017/10/24 23:29

そうですね、その点は修正します。色々試した結果、今回はフラグ持たせて状態管理することとしました。 いつも大変お世話になっております。お忙しい中ご教示頂きありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問