在iOS APP中有个别页面需要从竖屏切换到横屏,网上有很多切屏方法,但最后大多是要调用私有API实现,强制改变设备的orientation,其方法如下:
SEL selector = NSSelectorFromString(@\"setOrientation:\");
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[UIDevice instanceMethodSignatureForSelector:selector]];
[invocation setSelector:selector];
[invocation setTarget:[UIDevice currentDevice]];
[invocation setArgument:&orientation atIndex:2];
[invocation invoke];
我所在公司的所有APP都在用这种强行改变设备orientation的方式,目前这样是能通过appStore的审核,但总觉得这种方式不是很安全,保不准那天就被苹果干掉了。观察了市面上主流视频播放APP,其竖屏切换到横屏时大多是采用动画的形式,所以猜测了下动画转屏的实现方式。
要实现动画转屏,必须先观察竖屏时APP画面状态,画面在旋转前的frame状态和旋转后的状态,三种状态如下所示:
上图中有APP处于竖屏播放状态,点击全屏按钮后重设播放页面frame、以及旋转到横屏播放状态的示意图。视图旋转是以中心点进行的,所以旋转前的frame按上图中间的方式计算。
知道如何计算横屏状态view的frame,接下来就好办了,直接旋转M_PI_2即可。
self.originFrame = self.view.frame;
CGFloat height = [[UIScreen mainScreen] bounds].size.width;
CGFloat width = [[UIScreen mainScreen] bounds].size.height;
CGRect frame = CGRectMake((height - width) / 2, (width - height) / 2, width, height);
self.frame = frame;
[UIView animateWithDuration:0.3f animations:^{
self.frame = frame;
[self.view setTransform:CGAffineTransformMakeRotation(M_PI_2)];
} completion:^(BOOL finished) {
}];
动画转屏时,设备的原点依然是左上角。