源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

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

  • 时间:2020-05-17 09:06 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:iOS开发中控制屏幕旋转的编写方法小结
在iOS5.1 和 之前的版本中, 我们通常利用 shouldAutorotateToInterfaceOrientation: 来单独控制某个UIViewController的旋屏方向支持,比如:
[u]复制代码[/u] 代码如下:
- (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的单独控制是无法锁定屏幕的。
[u]复制代码[/u] 代码如下:
-(NSUInteger)supportedInterfaceOrientations  {      return UIInterfaceOrientationMaskPortrait;  } 
多次实验后总结出控制屏幕旋转支持方向的方法如下: 子类化UINavigationController,增加方法
[u]复制代码[/u] 代码如下:
- (BOOL)shouldAutorotate  {      return self.topViewController.shouldAutorotate;  }    - (NSUInteger)supportedInterfaceOrientations  {      return self.topViewController.supportedInterfaceOrientations;  } 
并且设定其为程序入口,或指定为 self.window.rootViewController 随后添加自己的view controller,如果想禁止某个view controller的旋屏:(支持全部版本的控制)
[u]复制代码[/u] 代码如下:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation  {      return (interfaceOrientation == UIInterfaceOrientationPortrait);  }    -(BOOL)shouldAutorotate  {      return NO;  }    -(NSUInteger)supportedInterfaceOrientations  {      return UIInterfaceOrientationMaskPortrait;  } 
如果想又开启某个view controller的全部方向旋屏支持:
[u]复制代码[/u] 代码如下:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation  {      return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);  }    -(NSUInteger)supportedInterfaceOrientations  {      return UIInterfaceOrientationMaskAllButUpsideDown;  }    -(BOOL)shouldAutorotate  {      return YES;  } 
从而实现了对每个view controller的单独控制。 顺便提一下,如果整个应用所有view controller都不支持旋屏,那么干脆:
[u]复制代码[/u] 代码如下:
- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window  {       return UIInterfaceOrientationMaskPortrait;  } 
横竖屏切换,视图乱了怎么办? 首先,我们必须了解一下下列4种状态,它们被用来描述设备旋转方向: [img]http://files.jb51.net/file_images/article/201510/2015102495412717.png?201592495425[/img] 对于旋屏的处理,大致分为如下几种情况和思路: 也许,你不需要旋屏支持,而希望锁定屏幕
[u]复制代码[/u] 代码如下:
-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation  {      return NO;  } 
也许,你需要支持旋屏,或者支持部分方向的旋屏
[u]复制代码[/u] 代码如下:
-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {          return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);  } 
也许,你的view有张背景图,旋屏时系统帮助你拉伸了图片,但是却没有管你的其它部件,比如button,你希望直接改变button的大小和位置
[u]复制代码[/u] 代码如下:
-(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)];      }  } 
也许,你并不希望用绝对坐标去约束控件,而是希望让它通过旋转自己适应屏幕的旋转
[u]复制代码[/u] 代码如下:
- (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处, [img]http://files.jb51.net/file_images/article/201510/2015102495438507.png?201592495451[/img] 来帮助我们完成自己想要的适应效果。Example 动画呈现的很清晰,^_^ 我就不再啰嗦了。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部