iOS AutoLayout与AutoSizing

2024-08-29 08:48
文章标签 ios autolayout autosizing

本文主要是介绍iOS AutoLayout与AutoSizing,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

iOS AutoLayout与AutoSizing:自动布局,想说爱你真不容易

在iPhone Retina发布之前,还没有AutoLayout,因为屏幕只有一种尺寸。
当iPhone Retina发布之后,我没有用上AutoLayout,因为屏幕尺寸是用点来表示,布局写起来没什么不同。
当iPhone 5发布之后,屏幕尺寸终于加长了,但是由于有AutoSizing,所以我还是可以不用AutoLayout。
现在,iPhone 6和6 Plus发布了,屏幕又大了,我不得不开始考虑是否要使用AutoLayout。

1. Autolayout 与 Autosizing的区别

虽然自iOS6之后,苹果推荐我们使用Autolayout布局,并且在Xib和Storyboard中默认帮我们打开了这个选项,但是在开发过程中,我们偏向于使用Autosizing,并且手动取消掉Autolayout,原因在于,Autolayout太繁琐复杂,而Autosizing简单并且能满足大部分的需求。

Autosizing适用的情况

当父视图被拉伸的时候,子视图能够适配父视图的新大小。其原理是,子视图有一个masks,用于指定与父视图上下左右边缘的距离,以及自身宽高的关系。

比如,指定子视图的右边缘紧跟着父视图的右边缘,那么父视图变大之后,子视图还是贴在父视图的右边。

这在大部分简单布局情况下非常有效。

Autosizing的不足

使用Autosizing,有一个前提,就是子视图的Frame是固定的,至少宽高是固定的,或者跟随着父视图的Frame变化。但是,如果希望多个子视图与父视图的边距固定,大小自动调整,Autosizing就爱莫能助了。

原因在于:Autosizing无法智能计算多个子View各自的Frame

比如,我们希望在竖屏下布局是这样:

autosizing portrait

并且在横屏下布局是这样:

autosizing landscape

除了手写代码调整Frame,单独用Autosizing是无法做到的。这时候就需要借助强大的Autolayout了。

Autolayout的优点

Autolayout使用约束来决定每个View的坐标、大小,约束可以针对SuperView,也可以针对其他任意一个SubView。

使用自动布局,你可以表达出视图与视图之间的关系,而不是明确地指定每个视图的Frame。通过约束,视图会自动计算它们应该呆在哪个位置,只要约束足够多,它们也能自动计算自己的大小。

只要指定了约束,无论屏幕大小怎么变化,它们都能自适应,这就是Autolayout的优点:妈妈再也不用担心你手写布局代码啦!也不用担心你为了适配各种屏幕大小而加班了。

Autolayout的缺点

Autolayout唯一的缺点就在于:过于复杂,较难上手。

使用Autolayout,还是Autosizing?

取决于项目需求。如果Autosizing完全能满足开发需求,那么就没必要使用复杂的Autolayout。但是,如果你已经被适配各种屏幕大小折腾得不成人形了,那么就要早日投入到Autolayout的怀抱了。

Autolayout的使用

首先要改变自己对布局的思考方式。你应该忘掉Frame,需要考虑的是subView A与subView B的上下左右的关系,以及与superView的关系。

借助XCode

在Xcode5之后,苹果已经尽力让开发者能更方便地使用Autolayout了。
通过Xcode–>Editor–>Pin/Align菜单为视图添加约束即可。

在XCode中除了通过菜单,还可以通过可视化的方式添加约束:

autolayout add constraint

如果你添加的约束不足以表达某个View的位置大小,XCode还会以黄色的辅助线发出警告,十分好用。

手写约束Constraint

XCode虽然强大,但是有时候我们也许希望借助代码来写Constraint。

加入你希望一个子view跟随父view的大小,但是与边距有10个点的距离:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
UIView *superview = self;

UIView *view1 = [[UIView alloc] init];
view1.translatesAutoresizingMaskIntoConstraints = NO;
view1.backgroundColor = [UIColor greenColor];
[superview addSubview:view1];

UIEdgeInsets padding = UIEdgeInsetsMake(10, 10, 10, 10);

[superview addConstraints:@[

    //view1 constraints
    [NSLayoutConstraint constraintWithItem:view1
                                 attribute:NSLayoutAttributeTop
                                 relatedBy:NSLayoutRelationEqual
                                    toItem:superview
                                 attribute:NSLayoutAttributeTop
                                multiplier:1.0
                                  constant:padding.top],

    [NSLayoutConstraint constraintWithItem:view1
                                 attribute:NSLayoutAttributeLeft
                                 relatedBy:NSLayoutRelationEqual
                                    toItem:superview
                                 attribute:NSLayoutAttributeLeft
                                multiplier:1.0
                                  constant:padding.left],

    [NSLayoutConstraint constraintWithItem:view1
                                 attribute:NSLayoutAttributeBottom
                                 relatedBy:NSLayoutRelationEqual
                                    toItem:superview
                                 attribute:NSLayoutAttributeBottom
                                multiplier:1.0
                                  constant:-padding.bottom],

    [NSLayoutConstraint constraintWithItem:view1
                                 attribute:NSLayoutAttributeRight
                                 relatedBy:NSLayoutRelationEqual
                                    toItem:superview
                                 attribute:NSLayoutAttributeRight
                                multiplier:1
                                  constant:-padding.right],

 ]];

每个约束都是这样的长长一串代码,设想一下需要添加6个约束的话……

幸好有了这个开源库:Masonry。

使用这个库,代码添加约束就可以简介如下:

1
2
3
[view1 mas_makeConstraints:^(MASConstraintMaker *make) {
    make.edges.equalTo(superview).with.insets(padding);
}];

更新约束

比如,我们自己实现了一个图文混排的TextView,添加到Xib时我们还不知道其高度,需要在代码中计算,那么就需要在代码里更新约束,如:

1
2
3
4
5
6
7
8
9
10
@property (strong, nonatomic) IBOutlet NSLayoutConstraint *richTextHeightConstraint;

...

- (void)relayout
{
    self.richTextHeightConstraint.constant = self.richTextView.frame.size.height;

    [self needsUpdateConstraints];
}

关键还是实践

多说无益,贵在实践。只要有意识地去使用了一次,自然就会了。

参考链接

  • Beginning Auto Layout Tutorial in iOS 7: Part 1
  • Beginning Auto Layout Tutorial in iOS 7: Part 2
  • 开始iOS 7中自动布局教程 一
  • 开始iOS 7中自动布局教程 二
  • 从此爱上iOS Autolayout
原文作者:  lslin
原文链接:  http://blog.lessfun.com/blog/2014/10/17/ios-autolayout-vs-autosizing/
版权声明:自由转载-非商用-非衍生-保持署名 |  Creative Commons BY-NC-ND 3.0

这篇关于iOS AutoLayout与AutoSizing的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1117400

相关文章

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

【iOS】MVC模式

MVC模式 MVC模式MVC模式demo MVC模式 MVC模式全称为model(模型)view(视图)controller(控制器),他分为三个不同的层分别负责不同的职责。 View:该层用于存放视图,该层中我们可以对页面及控件进行布局。Model:模型一般都拥有很好的可复用性,在该层中,我们可以统一管理一些数据。Controlller:该层充当一个CPU的功能,即该应用程序

iOS剪贴板同步到Windows剪贴板(无需安装软件的方案)

摘要 剪贴板同步能够提高很多的效率,免去复制、发送、复制、粘贴的步骤,只需要在手机上复制,就可以直接在电脑上 ctrl+v 粘贴,这方面在 Apple 设备中是做的非常好的,Apple 设备之间的剪贴板同步功能(Universal Clipboard)确实非常方便,它可以在 iPhone、iPad 和 Mac 之间无缝传输剪贴板内容,从而大大提高工作效率。 但是,iPhone 如何和 Wind

iOS项目发布提交出现invalid code signing entitlements错误。

1、进入开发者账号,选择App IDs,找到自己项目对应的AppId,点击进去编辑, 2、看下错误提示出现  --Specifically, value "CVYZ6723728.*" for key "com.apple.developer.ubiquity-container-identifiers" in XX is not supported.-- 这样的错误提示 将ubiquity

我的第一次份实习工作-iOS实习生-第三个月

第三个月 这个月有一个考核项目,是一个电子书阅读器,组长说很重要,是我的实习考核项目。 我的项目XTReader,这是我参考网上的一些代码,和模仿咪咕阅读做的,功能还不完善,数据的部分是用聚合数据做的。要收费的。   还有阅读页面,基本功能实现了一下。使用了autolayout,自适应布局,也是第一次用网络,第一次用数据库,第一次用自动布局。还有很多不足。 做了一周多,有个问题一直没

我的第一次份实习工作-iOS实习生-公司使用过的软件

bittorrentsync 素材,文件同步软件 cornerstone svn 软件开发合作 mark man 测量坐标的软件 SQLLite Manager 数据库操作软件

我的第一次份实习工作-iOS实习生-第二个月

第二个月 来公司过了一个月了。每天早上9点上班,到晚上6.30下班,上下班要指纹打卡,第一个月忘了打卡好多次(),然后还要去补打卡单。公司这边还安排了,工资卡办理,招商银行卡。开了一次新员工大会,认识了公司的一些过往,公司的要求等,还加了一下公司的企业QQ,还有其他的羽毛球群,篮球群。我加了下羽毛球群,也去打了一两次。第二个月的感受,感觉跟组里面的交流跟沟通都好少,基本上还有好多人不认识。想想也

我的第一次份实习工作-iOS实习生-第一个月

实习时间:2015-08-20 到 2015-12-25  实习公司;福建天棣互联有限公司 实习岗位:iOS开发实习生 第一个月: 第一天来公司,前台报道后,人资带我去我工作的地方。到了那,就由一个组长带我,当时还没有我的办公桌,组长在第三排给我找了一个位置,擦了下桌子,把旁边的准备的电脑帮我装了下,因为学的是iOS,实习生就只能用黑苹果了,这是我实习用的电脑。 帮我装了一下电脑后,开机

iOS如何隐藏系统状态栏

这里主要说明一下iOS7系统给状态栏的适配及隐藏带来的改变。 变化一: 不隐藏状态栏的情况下,StatusBar会直接显示在当前页面上,当前页面的会延伸到 StatusBar下方,顶到最上头。 这种显示方式在iOS7上是无法改变的,也无法通过设置或者配置类达到iOS6的状态栏效果。       所以在iOS7上进行页面布局的时候要考虑

ios %.2f是四舍五入吗?

实事上这个“四舍五入”并不是数学上的“四舍五入”,而是“四舍六入五成双”,英文中被称为”round half to even”或”Banker’s rounding”。 “四舍六入五成双”是指,当保留精度的下一位不是5时,按正常的四舍五入;当保留精度的下一位是5时,如果5的后面为0则舍弃;而如果5的后面还有大于0的部分时,则无论5的前一位是奇数还是偶数,都进行进位。 1.当保留精度的下一位不是