美文网首页
iOS-autoresizingMask模拟自动布局

iOS-autoresizingMask模拟自动布局

作者: 清無 | 来源:发表于2016-09-06 15:09 被阅读83次
autoresizingMask

最近才发现UIView的autoresizingMask属性竟有如此神奇的功效:可以实现类似autoLayout的效果,比起写一堆的NSLayoutContraint代码,这个属性似乎解决了这个问题。

摘注

自动尺寸调整行为
当您改变视图的边框矩形时,其内嵌子视图的位置和尺寸往往也需要改变,以适应原始视图的新尺寸。如果视图的autoresizesSubviews属性声明被设置为YES,则其子视图会根据autoresizingMask属性的值自动进行尺寸调整。简单配置一下视图的自动尺寸调整掩码常常就能使应用程序得到合适的行为;否则,应用程序就必须通过重载layoutSubviews方法来提供自己的实现。

设置视图的自动尺寸调整行为的方法是通过位OR操作符将期望的自动尺寸调整常量连结起来,并将结果赋值给视图的autoresizingMask属性。表2-1列举了自动尺寸调整常量,并描述这些常量如何影响给定视图的尺寸和位置。

举例来说,如果要使一个视图和其父视图左下角的相对位置保持不变,可以加入UIViewAutoresizingFlexibleRightMargin 和UIViewAutoresizingFlexibleTopMargin常量,并将结果赋值给autoresizingMask属性。当同一个轴向有 多个部分被设置为可变时,尺寸调整的裕量会被平均分配到各个部分上。

  • UIViewAutoresizingNone

这个常量如果被设置,视图将不进行自动尺寸调整。

  • UIViewAutoresizingFlexibleHeight

这个常量如果被设置,视图的高度将和父视图的高度一起成比例变化。否则,视图的高度将保持不变。

  • UIViewAutoresizingFlexibleWidth

这个常量如果被设置,视图的宽度将和父视图的宽度一起成比例变化。否则,视图的宽度将保持不变。

  • UIViewAutoresizingFlexibleLeftMargin

这个常量如果被设置,视图的左边界将随着父视图宽度的变化而按比例进行调整。否则,视图和其父视图的左边界的相对位置将保持不变。

  • UIViewAutoresizingFlexibleRightMargin

这个常量如果被设置,视图的右边界将随着父视图宽度的变化而按比例进行调整。否则,视图和其父视图的右边界的相对位置将保持不变。

  • UIViewAutoresizingFlexibleBottomMargin

这个常量如果被设置,视图的底边界将随着父视图高度的变化而按比例进行调整。否则,视图和其父视图的底边界的相对位置将保持不变。

  • UIViewAutoresizingFlexibleTopMargin

这个常量如果被设置,视图的上边界将随着父视图高度的变化而按比例进行调整。否则,视图和其父视图的上边界的相对位置将保持不变。

如果您通过Interface Builder配置视图,则可以用Size查看器的Autosizing控制来设置每个视图的自动尺寸调整行为。上图中的灵活宽度及高度常量和 Interface Builder中位于同样位置的弹簧具有同样的行为,但是空白常量的行为则是正好相反。换句话说,如果要将灵活右空白的自动尺寸调整行为应用到 Interface Builder的某个视图,必须使相应方向空间的Autosizing控制为空,而不是放置一个支柱。幸运的是,Interface Builder通过动画显示了您的修改对视图自动尺寸调整行为的影响。

如果视图的autoresizesSubviews属性被设置为 NO,则该视图的直接子视图的所有自动尺寸调整行为将被忽略。类似地,如果一个子视图的自动尺寸调整掩码被设置为 UIViewAutoresizingNone,则该子视图的尺寸将不会被调整,因而其直接子视图的尺寸也不会被调整。

请注意:为了使自动尺寸调整的行为正确,视图的transform属性必须设置为恒等变换;其它变换下的尺寸自动调整行为是未定义的。

自动尺寸调整行为可以适合一些布局的要求,但是如果您希望更多地控制视图的布局,可以在适当的视图类中重载layoutSubviews方法。

Demo

-(instancetype)initWithFrame:(CGRect)frame{
    self = [super initWithFrame:frame];
    if (self) {
        self.backgroundColor = [UIColor blackColor];
        self.autoresizesSubviews = true;
        self.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleWidth;
        
        CGRect redFrame = CGRectMake(0, 0, CGRectGetWidth(frame)/3, CGRectGetHeight(frame));
        UIView *redView = [[UIView alloc] initWithFrame:redFrame];
        redView.backgroundColor = [UIColor redColor];
        redView.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleRightMargin; //宽/高度、上/左边距不变
        
        CGFloat space = 20;
        CGRect greenFrame = CGRectMake(CGRectGetMaxX(redFrame)+space, 0, CGRectGetWidth(frame)/3*2-space, CGRectGetHeight(frame));
        UIView *greenView = [[UIView alloc] initWithFrame:greenFrame];
        greenView.backgroundColor = [UIColor greenColor];
        greenView.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleWidth; //高度、上/左/右边距不变
        
        [self addSubview:redView];
        [self addSubview:greenView];
    }
    return self;
}

相关文章

  • iOS-autoresizingMask模拟自动布局

    最近才发现UIView的autoresizingMask属性竟有如此神奇的功效:可以实现类似autoLayout的...

  • iOS开发之 自动布局

    iOS开发之自动布局AutoLayout 目录: 1 iOS自动布局简介2 iOS自动布局AutoLayout(代...

  • 【OC梳理】自动布局

    自动布局基础篇 关于自动布局的基本使用,参考网上的文章即可,如:iOS开发-自动布局篇:史上最牛的自动布局教学! ...

  • iOS 布局方案

    布局方案 绝对布局 自动布局

  • 初见FLEX

    FLEX布局 一种新的布局方式,flex布局 flex布局与方向无关 flex布局可以实现空间自动分配、自动对齐。...

  • 通过storyboard来自动布局ScrollView(不依靠代

    在做自动布局之前首先大家都知道一个自动布局,自动布局在我理解就是为了适配任何的屏幕。每一个控件的自动布局都是为了确...

  • iOS原生布局简介

    自动布局核心公式 自动布局构造函数 自动布局类函数 VFL可视化格式语言 H 水平方向 V 垂直方向 | 边界 [...

  • Flex——告别CSS布局

    Flex 布局可以实现空间自动分配、自动对齐Flex 适用于简单的线性布局,复杂布局使用 Grid 布局注意:设为...

  • 最轻巧的自动布局--ZXPAutoLayout框架

    最轻巧的自动布局--ZXPAutoLayout框架 最轻巧的自动布局--ZXPAutoLayout框架

  • IOS开发 自动布局子视图

    本节学习内容: 1.自动子视图布局的概念 2.自动布局视图的创建 3.自动布局子视图的实现 【ViewContro...

网友评论

      本文标题:iOS-autoresizingMask模拟自动布局

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