ポートレートモードにロックされているアプリを開発しています。ただし、1つのビューは、さまざまなメディアタイプのフルスクリーンの「プレーヤー」として機能します。
メディアを再生するためのサブビューをUIView
持つサブクラスを使用しています。UIWebview
これは、表示スタックの上にフルスクリーンで表示されます。私の問題は、このビューのみを横向きのコンテンツ(ビデオやPDFなど)に対して回転させることで発生します。
回転を行うために、initメソッドでオブザーバーを設定しています。
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(deviceRotated:)
name:UIDeviceOrientationDidChangeNotification
object:nil];
そしてそのように回転します:
- (void)deviceRotated:(NSNotification *)notification {
UIDeviceOrientation orientation = [[notification object] orientation];
if (orientation == UIDeviceOrientationLandscapeLeft) {
[UIView animateWithDuration:0.6f delay:0.0 options:UIViewAnimationCurveEaseInOut
animations:^{ [self.webView setTransform:CGAffineTransformMakeRotation(M_PI / 2.0)]; }
completion:nil];
}
else if (orientation == UIDeviceOrientationLandscapeRight) {
[UIView animateWithDuration:0.6f delay:0.0 options:UIViewAnimationCurveEaseInOut
animations:^{ [self.webView setTransform:CGAffineTransformMakeRotation(M_PI / -2.0)]; }
completion:nil];
}
else if (orientation == UIDeviceOrientationPortraitUpsideDown) {
[UIView animateWithDuration:0.6f delay:0.0 options:UIViewAnimationCurveEaseInOut
animations:^{ [self.webView setTransform:CGAffineTransformMakeRotation(M_PI)]; }
completion:nil];
}
else if (orientation == UIDeviceOrientationPortrait) {
[UIView animateWithDuration:0.6f delay:0.0 options:UIViewAnimationCurveEaseInOut
animations:^{ [self.webView setTransform:CGAffineTransformMakeRotation(0.0)]; }
completion:nil];
}
}
self.webView
回転するときにフレームサイズを変更する必要があることはわかっていますが、奇妙な結果が得られています。
コンテナビューを長さのある大きな「正方形」として設定し、Webビューを中央に配置しようとしました[[UIScreen mainscreen] bounds].size.height
が、動きが一貫していません。回転前の寸法から幅と高さの値が設定されているようです。
また、柔軟な高さと幅を設定しようとしましautoResizingMask
たが、コンテナビューが画面外にあるため、Webビューも画面外に拡大されます。