ios 动画竖屏切换到横屏

在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状态和旋转后的状态,三种状态如下所示:

ios 动画竖屏切换到横屏_第1张图片
转屏前、后状态

上图中有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) {        
    }];

动画转屏时,设备的原点依然是左上角。

你可能感兴趣的:(ios 动画竖屏切换到横屏)