iOS开发中控制屏幕旋转的编写方法小结

丑女野山核桃仁

丑女野山核桃仁

2016-02-19 10:56

清醒时做事,糊涂时读书,大怒时睡觉,无聊时关注图老师为大家准备的精彩内容。下面为大家推荐iOS开发中控制屏幕旋转的编写方法小结,无聊中的都看过来。

在iOS5.1 和 之前的版本中, 我们通常利用 shouldAutorotateToInterfaceOrientation: 来单独控制某个UIViewController的旋屏方向支持,比如:
代码如下:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 

    return (interfaceOrientation == UIInterfaceOrientationPortrait); 

但是在iOS6中,这个方法被废弃了,使用无效。
shouldAutorotateToInterfaceOrientation:
Returns a Boolean value indicating whether the view controller supports the specified orientation. (Deprecated in iOS 6.0. Override the supportedInterfaceOrientations andpreferredInterfaceOrientationForPresentation methods instead.)

实践后会发现,通过supportedInterfaceOrientations的单独控制是无法锁定屏幕的。
代码如下:

-(NSUInteger)supportedInterfaceOrientations 

    return UIInterfaceOrientationMaskPortrait; 

多次实验后总结出控制屏幕旋转支持方向的方法如下:
子类化UINavigationController,增加方法
代码如下:

- (BOOL)shouldAutorotate 

    return self.topViewController.shouldAutorotate; 

 
- (NSUInteger)supportedInterfaceOrientations 

    return self.topViewController.supportedInterfaceOrientations; 


并且设定其为程序入口,或指定为 self.window.rootViewController
随后添加自己的view controller,如果想禁止某个view controller的旋屏:(支持全部版本的控制)
代码如下:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 

    return (interfaceOrientation == UIInterfaceOrientationPortrait); 

 
-(BOOL)shouldAutorotate 

    return NO; 

 
-(NSUInteger)supportedInterfaceOrientations 

    return UIInterfaceOrientationMaskPortrait; 

如果想又开启某个view controller的全部方向旋屏支持:
代码如下:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 

    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown); 

 
-(NSUInteger)supportedInterfaceOrientations 

    return UIInterfaceOrientationMaskAllButUpsideDown; 

 
-(BOOL)shouldAutorotate 

    return YES; 

从而实现了对每个view controller的单独控制。

顺便提一下,如果整个应用所有view controller都不支持旋屏,那么干脆:
代码如下:

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window 

     return UIInterfaceOrientationMaskPortrait; 


横竖屏切换,视图乱了怎么办?
首先,我们必须了解一下下列4种状态,它们被用来描述设备旋转方向:

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

对于旋屏的处理,大致分为如下几种情况和思路:
也许,你不需要旋屏支持,而希望锁定屏幕
代码如下:

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 

    return NO; 


也许,你需要支持旋屏,或者支持部分方向的旋屏
代码如下:

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {  
       return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown); 

也许,你的view有张背景图,旋屏时系统帮助你拉伸了图片,但是却没有管你的其它部件,比如button,你希望直接改变button的大小和位置
代码如下:

-(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 

    if (UIInterfaceOrientationIsPortrait(toInterfaceOrientation)) { 
        NSLog(@"现在是竖屏"); 
        [btn setFrame:CGRectMake(213, 442, 340, 46)]; 
    } 
    if (UIInterfaceOrientationIsLandscape(toInterfaceOrientation)) { 
        NSLog(@"现在是横屏"); 
        [btn setFrame:CGRectMake(280, 322, 460, 35)]; 
    } 


也许,你并不希望用绝对坐标去约束控件,而是希望让它通过旋转自己适应屏幕的旋转
代码如下:

- (void)viewDidLoad 

    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 
    UIDevice *device = [UIDevice currentDevice];  
    [device beginGeneratingDeviceOrientationNotifications]; 
    //利用 NSNotificationCenter 获得旋转信号 UIDeviceOrientationDidChangeNotification 
    NSNotificationCenter *ncenter = [NSNotificationCenter defaultCenter];  
    [ncenter addObserver:self selector:@selector(orientationChanged) name:UIDeviceOrientationDidChangeNotification object:device]; 

 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 

    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown); 

 
-(void)rotation_btn:(float)n 

    UIButton *robtn = self.btn; 
    robtn.transform = CGAffineTransformMakeRotation(n*M_PI/180.0); 

 
-(void)orientationChanged 

    UIDeviceOrientation orientaiton = [[UIDevice currentDevice] orientation]; 
     
    switch (orientaiton) { 
        caseUIDeviceOrientationPortrait:              
            [self  rotation_btn:0.0]; 
            break; 
        caseUIDeviceOrientationPortraitUpsideDown:   
            [self  rotation_btn:90.0*2]; 
            break; 
        caseUIDeviceOrientationLandscapeLeft:      
            [self  rotation_btn:90.0*3]; 
            break; 
        caseUIDeviceOrientationLandscapeRight:   
            [self  rotation_btn:90.0]; 
            break; 
        default: 
            break; 
    } 


也许,你需要autoresizesSubviews = YES
也许,你希望横竖屏有不同的布局效果,需要准备2份Subview,在不同状态去替换
当然不要忘记,需要调节设定图示中的1、2处,

来帮助我们完成自己想要的适应效果。Example 动画呈现的很清晰,^_^ 我就不再啰嗦了。

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)
展开更多 50%)
分享

猜你喜欢

iOS开发中控制屏幕旋转的编写方法小结

编程语言 网络编程
iOS开发中控制屏幕旋转的编写方法小结

iOS开发中使用屏幕旋转功能的相关方法

编程语言 网络编程
iOS开发中使用屏幕旋转功能的相关方法

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

iOS的UI开发中Button的基本编写方法讲解

编程语言 网络编程
iOS的UI开发中Button的基本编写方法讲解

详解iOS的UI开发中控制器的创建方法

编程语言 网络编程
详解iOS的UI开发中控制器的创建方法

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

iOS开发中对文件目录的访问及管理的基本方法小结

编程语言 网络编程
iOS开发中对文件目录的访问及管理的基本方法小结

Android开发 旋转屏幕导致Activity重建解决方法

编程语言 网络编程
Android开发 旋转屏幕导致Activity重建解决方法

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

电脑系统中的虚拟内存设置非常大有什么影响

电脑系统中的虚拟内存设置非常大有什么影响

手机通过电脑上网电脑变WIFI

手机通过电脑上网电脑变WIFI
下拉加载更多内容 ↓