手记

iOS 强制横屏、部分横屏等功能实践

需求如下:

1.app整体只能竖屏,部分页面才可以横屏
2.app整体只能竖屏,部分页面也是竖屏,但是点击某个按钮可以使当前页面变为横屏,如全屏视频播放键。

需求1解决方法:

1.在targets - general中设置设备支持方向如下,确保设备各个方法均支持

屏幕快照 2016-12-08 下午6.41.26.png

2.在appdelegate的.h文件声明属性来标记当前设备方向

@property (assign , nonatomic)UIInterfaceOrientation interfaceOrientation;

在appdelegate的.m文件中:

- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(nullable UIWindow *)window {    
    if(self.interfaceOrientation == UIInterfaceOrientationUnknown) { // 直播间用
        return UIInterfaceOrientationMaskAllButUpsideDown;
    } else if(self.interfaceOrientation == UIInterfaceOrientationLandscapeRight) { 
//交易页面横屏用
        return UIInterfaceOrientationMaskLandscapeRight;
    } else {        return UIInterfaceOrientationMaskPortrait;
    }
}

3.在需要横屏的ViewController的ViewWillApper方法里面:

 

 Appdelegate *delegate =p.p1[UIApplication sharedApplication].delegate;
delegate.canRotate = YES;

需求2解决方法:

方法1:
1.在targets - general中设置设备支持方向如下,确保整体都是竖屏

屏幕快照 2016-12-08 下午6.30.25.png


2.在横屏(如button点击)事件处,代码如下

- (void)fullScreenBtnAction {    if (_isNormalOrientation) {   // 如果当前是默认的竖屏
        //注:当前self是UIView对象,如果是VC,则为self.view.....
        self.frame = CGRectMake(0, 0, kScreenSize.height, kScreenSize.width);        CGRect frame = [UIScreen mainScreen].applicationFrame;        // transfrom会以当前center为锚点旋转,所以旋转后位置有偏移,需要处理
        CGPoint center = CGPointMake(frame.origin.x + ceil(frame.size.width/2), frame.origin.y + ceil(frame.size.height/2));        self.center = center;       
        //取状态栏旋转时间//        CGFloat duration = [UIApplication sharedApplication].statusBarOrientationAnimationDuration;
        [UIView beginAnimations:nil context:nil];
        [UIView setAnimationDuration: 0.3];        self.transform = CGAffineTransformMakeRotation(M_PI_2);
        [UIView commitAnimations];
    } else {
        [UIView beginAnimations:nil context:nil];
        [UIView setAnimationDuration: 0.3];        self.transform = CGAffineTransformIdentity;
        [UIView commitAnimations];        //_originRect是进入横屏前self的frame
        self.frame = _originRect;
    }
    _isNormalOrientation = !_isNormalOrientation; //更改状态}

***方法2:
1.在targets - general中设置设备支持方向如下,确保设备各个方法均支持 (弃用  可不设置)


屏幕快照 2016-12-08 下午6.41.26.png


2.在appdelegate的.h文件声明属性interfaceOrientation标记方向

@property (assign , nonatomic)UIInterfaceOrientation interfaceOrientation;

在appdelegate的.m文件中实现设备方向方法:

- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(nullable UIWindow *)window {    
    if(self.interfaceOrientation == UIInterfaceOrientationUnknown) { // 直播间用
        return UIInterfaceOrientationMaskAllButUpsideDown;
    } else if(self.interfaceOrientation == UIInterfaceOrientationLandscapeRight) { //交易页面横屏用
        return UIInterfaceOrientationMaskLandscapeRight;
    } else {        return UIInterfaceOrientationMaskPortrait;
    }
}
  1. 横竖屏转换:

//转换到竖屏- (void)rotateToPortraitScreenWithInvocation {
    AppDelegate *delegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
    
    SEL selector = NSSelectorFromString(@"setOrientation:");    
    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[UIDevice instanceMethodSignatureForSelector:selector]];
    
    [invocation setSelector:selector];
    
    [invocation setTarget:[UIDevice currentDevice]];    
    int val = UIDeviceOrientationPortrait;
    
    [invocation setArgument:&val atIndex:2];
    
    [invocation invoke];
    
    delegate.interfaceOrientation = UIInterfaceOrientationPortrait;
}//转换到横屏模式- (void)rotateToLandscapWithIncovation {
    AppDelegate *delegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
    
    delegate.interfaceOrientation = UIInterfaceOrientationUnknown;
    
    SEL selector = NSSelectorFromString(@"setOrientation:");    
    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[UIDevice instanceMethodSignatureForSelector:selector]];
    
    [invocation setSelector:selector];
    
    [invocation setTarget:[UIDevice currentDevice]];    
    int val = UIInterfaceOrientationLandscapeRight;
    
    [invocation setArgument:&val atIndex:2];
    
    [invocation invoke];
}



补充后来自己又折腾的几个Demo:
https://github.com/3KK3/AppdelegateMethodHorizDemo/tree/master



作者:CoderYZY
链接:https://www.jianshu.com/p/95cdf3262bc6


0人推荐
随时随地看视频
慕课网APP