美文网首页
iOS开发 屏幕适配(AutoLayout)

iOS开发 屏幕适配(AutoLayout)

作者: Leoeoo | 来源:发表于2021-12-30 16:36 被阅读0次

注意事项

1.translatesAutoresizingMaskIntoConstraints

在使用AutoLayout时,必须先把当前视图的translatesAutoresizingMaskIntoConstraints设置为NO。如不设置,可能会照成约束冲突。

如果视图是通过xib创建的,可以在xib中设置Layoutinferred(Constraints):

image.png

或通过代码设置:

view.translatesAutoresizingMaskIntoConstraints = NO;

2. setNeedsLayout、layoutIfNeeded、setNeedsUpdateConstraints、updateConstraintsIfNeeded关系

-setNeedsLayout方法: 标记为需要重新布局,异步调用layoutIfNeeded刷新布局,不立即刷新,但layoutSubviews一定会被调用

-layoutIfNeeded方法:如果,有需要刷新的标记,立即调用layoutSubviews进行布局(如果没有标记,不会调用layoutSubviews)

-setNeedsUpdateConstraints方法: 标记为需要更新约束,异步调用updateViewConstraints刷新布局,不立即刷新,但updateViewConstraints一定会被调用

-updateConstraintsIfNeeded方法:如果,有需要刷新的约束,立即调用updateViewConstraints进行布局(如果没有标记,不一定会调用layoutSubviews)

如想要在父视图的layoutSubviews中更新子视图的布局,但是父视图的layoutSubviews没有回调,只回调了子视图的layoutSubviews
可在子视图的layoutSubviews中强制调用父视图的layoutIfNeededsetNeedsLayout

- (void)layoutSubviews {
    [super layoutSubviews];
    [self.superview layoutIfNeeded];
}

3.AutoLayout动画

  • 动画前调用父视图的setNeedsLayout来刷新子视图(自身)的布局,以保证动画前布局正确。(非必须)
  • 在设置完动画的布局后调用父视图的setNeedsLayout,进行动画。

例:

UIView *view = [[UIView alloc] init];
view.backgroundColor = [UIColor redColor];
view.translatesAutoresizingMaskIntoConstraints = NO;
[self.view addSubview:view];
    
NSLayoutConstraint *left = [NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeLeading multiplier:1.0 constant:10];
NSLayoutConstraint *top = [NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTop multiplier:1.0 constant:100];
NSLayoutConstraint *right = [NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTrailing multiplier:1.0 constant:-10];
[self.view addConstraints:@[left, top, right]];
NSLayoutConstraint *height = [NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:0 constant:300];
[view addConstraint:height];
    
// 强制布局完成,因为view添加到父视图上后还没布局完成接着就调用了动画,所以在这里强制更新布局,以保证动画的起点正确。
[view.superview layoutIfNeeded];
    
[UIView animateWithDuration:2 animations:^{
    [self.view removeConstraints:@[left, top, right]];
    [view removeConstraint:height];
        
    NSLayoutConstraint *left = [NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeLeading multiplier:1.0 constant:100];
    NSLayoutConstraint *top = [NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTop multiplier:1.0 constant:100];
    NSLayoutConstraint *right = [NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTrailing multiplier:1.0 constant:-10];
    [self.view addConstraints:@[left, top, right]];
    NSLayoutConstraint *height = [NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:0 constant:300];
    [view addConstraint:height];
    // 开启动画
    [view.superview layoutIfNeeded];
}];
AutoLayout动画.gif

其他文章
iOS-屏幕适配(AutoLayout)

相关文章

  • iOS开发 屏幕适配(AutoLayout)

    注意事项 1.translatesAutoresizingMaskIntoConstraints 在使用AutoL...

  • 版本适配

    屏幕适配 代码适配 Masonry UIView+AutoLayout 可视化适配 autoLayout 系统适配...

  • 断点调试Autolayout

    对于 iOS 和 OS X 开发者来说,Autolayout已经逐渐变成一个至关重要的开发工具。它让多屏幕适配变得...

  • iPhone X屏幕适配

    iPhone X开发设计屏幕适配。iPhone X(10)屏幕分辨率与适配,iOS开发适配与UI设计问题。 htt...

  • AutoLayout in UITableVIew及控件显示的优

    现在IOS的屏幕尺寸也有很多,为了方便屏幕适配,autolayout能在我们在UI布局方面节省很多工作量,今天就讲...

  • 关于iOS屏幕适配小结

    屏幕适配 屏幕适配的四种方式 frame和bounds Autoresizing AutoLayout 和 mas...

  • Masonry学习理解

    iOS中进行屏幕适配,使用的是AutoLayout。在纯代码中可以使用第三方Masonry添加约束进行适配,而使用...

  • iOS判断刘海屏幕机型

    原文iOS刘海手机屏幕的适配判断是不是iphone x齐刘海屏幕iOS开发 iPhoneX以上机型适配判断判断iP...

  • iOS之Masonry代码解析

    背景 iOS平台上Autolayout布局对于屏幕的适配简直就是一把利剑,如果用xib或Storyboard进行布...

  • 使用 xib 自动对屏幕适配

    在 iOS开发过程中,开发人员一般会使用纯代码适配或者AutoLayout来进行适配.现在开发人员主要是使用Aut...

网友评论

      本文标题:iOS开发 屏幕适配(AutoLayout)

      本文链接:https://www.haomeiwen.com/subject/qhoiqrtx.html