web-dev-qa-db-ja.com

呼び出されないiOS8インターフェイスの回転メソッド

willAnimateRotationToInterfaceOrientation:duration:非推奨 iOS8では、viewWillTransitionToSize:withTransitionCoordinator:代わりに

ただし、iOS8のView Controllerではこのメソッドは呼び出されません。このコールバックが機能するためには、他に何か実装する必要がありますか?

ドキュメントに何も見つかりません。私が見つけることができた唯一のものは、それが新しいUIContentContainerプロトコルに属しているということでした。ただし、これをコントローラーのプロトコルに明示的に追加しても、機能しません。

何か案は?

32
tschubotz

viewWillTransitionToSize:withTransitionCoordinator:は、インターフェイスが実際にサイズを変更する場合、つまり90度回転した場合にのみ機能するようです。レイアウトにマスクがあり、180度回転しても横向きしか許可されていない場合、インターフェイスのサイズは変わらないため、このメソッドは呼び出されないようです。

代わりにUIDeviceOrientationDidChangeNotification通知に登録することで、アプリでこれを回避しました:

(私のView ControllerのviewWillAppear):

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(deviceOrientationDidChange:) name:UIDeviceOrientationDidChangeNotification object:nil];
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];

(私のviewWillDisappearにある[[登録解除]を忘れないでください])

[[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIDeviceOrientationDidChangeNotification object:nil];

俺の deviceOrientationDidChange:は次のようになります。

- (void)deviceOrientationDidChange:(NSNotification *)notification {
    UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
    [self willRotateToInterfaceOrientation:orientation duration:1.0];
}
38
line72

docs に従って、superを呼び出すことを忘れないでください

- (void)viewWillTransitionToSize:(CGSize)size
       withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];

    // ...
}

そうしないと、子View Controllerはメッセージを転送しません。

36
Robert

私はこの質問がこの時点で少し古いことを知っていますが、問題に出くわすかもしれない人にとっては、この問題は別の方法で解決されると思います。 addSubview(controller.view)を使用してDIFFERENTコントローラーの一部であるビューをロードしようとしている場合、そのコントローラーも親に追加する必要があります(おそらく、追加しているビューのコントローラー)。コントローラーを親に追加しない場合、サイズ変更の更新を受け取ることはありません。後で、AppleのAPIが変更された理由がわかりました。 iPad Proでは、マルチタスク機能により、SizeClassを回転させることなく変更できます。これにより、メソッドも呼び出されます。

viewWillTransitionToSize(size: CGSize, 
        withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator)

親クラスで、上記のメソッドをオーバーライドする場合は、必ずsuperを呼び出してください。そうしないと、壁に頭を打つ別の方法が見つかります...

7
Sepui