48 (OC)* 适配iPad和iPhone、以及横竖屏适配。

一:核心方法

1.三个方法

1.1:开始就会触发

  - (void)viewWillLayoutSubviews;

1.2:开始就会触发 

   - (void)viewDidLayoutSubviews;

1.3:设备旋转的时候会触发。在UIScreen的bounds和size(下面方法中的参数)。按照size为主。  

  - (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id <UIViewControllerTransitionCoordinator>)coordinator;

   

2:viewLayoutSubviews  触发条件

1、init初始化不会触发layoutSubviews
2、addSubview会触发layoutSubviews
3、设置view的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化
4、滚动一个UIScrollView会触发layoutSubviews
5、旋转Screen会触发父UIView上的layoutSubviews事件
6、改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件
 
 
 

二:获取设备反向

typedefNS_ENUM(NSInteger, UIDeviceOrientation) {
  UIDeviceOrientationUnknown,      // 0
  UIDeviceOrientationPortrait,        // 1:设备垂直竖向方向放置, 并且home键在下方
  UIDeviceOrientationPortraitUpsideDown,  // 2:设备垂直竖向方向放置, 并且home键在上方
  UIDeviceOrientationLandscapeLeft,     // 3:设备垂直横向方向放置, 并且home键在右方
  UIDeviceOrientationLandscapeRight,       // 4: 设备垂直横向方向放置, 并且home键在左方
  UIDeviceOrientationFaceUp,       // 5: 设备水平放置, 屏幕在上方
  UIDeviceOrientationFaceDown       // 6:设备水平放置, 屏幕在下方
} (TVOS不可用)
 

三:判断屏幕横屏/竖屏

方法一:  使用- (void)viewWillLayoutSubviews;方法:

- (void)viewWillLayoutSubviews

{

     [self shouldRotateToOrientation:(UIDeviceOrientation)[UIApplication sharedApplication].statusBarOrientation];

}

-(void)shouldRotateToOrientation:(UIDeviceOrientation)orientation 
{ if (orientation == UIDeviceOrientationPortrait ||orientation == UIDeviceOrientationPortraitUpsideDown) { // 竖屏 } else { // 横屏 }
}

方法二:

  • 使用- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id <UIViewControllerTransitionCoordinator>)coordinator
    • size: 屏幕翻转后的新的尺寸;
    • coordinator: 屏幕翻转过程中的一些信息,比如翻转时间等;
#pragma mark - 屏幕翻转就会调用
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{// 记录当前是横屏还是竖屏
  BOOLisLandscape = size.width == kLandscapeWidth;
  // 翻转的时间
  CGFloatduration = [coordinator transitionDuration];
   [UIViewanimateWithDuration:duration animations:^{
      // 1.设置dockview的frame
      [self.dockView rotateToLandscape:isLandscape];
      // 2.屏幕翻转后(设置完dockview的frame)要重新设置contentView的x值
       self.contentView.x = self.dockView.width;
   }];
}

四:代码地址:
 
 
个人小小的建议:建议把View封装起来。之后再设备变换的时候,修改自定义的view的frame。
 
 
 
备注:
 
参考地址

 
 
 
 
  
 

posted on 2018-08-09 11:34  风zk  阅读(657)  评论(0编辑  收藏  举报

导航