在过去只有iphone4的时候,可以在代码里将一个可视单元的位置写死,这样是没问题的,但随着iPhone5,6的发布,屏幕尺寸有了越来越多种可能。这就要求App的UI控件具有在不同屏幕尺寸的设备上具有一定动态的可调性,实现较好的UI展示效果。

    结合使用Auto Layout和Size Classes可对UI可视单元的父子关系,兄弟视图关系进行全方位的调整,而且调整精度更高。不仅能确定一个View的位置尺寸的变化依据是什么还能对 这些依据加以不同的优先级,即先满足什么条件,再满足什么条件,对于重要的位置尺寸给予优先保证,这样整个APP就具有极强的动态可调性,可以满足不同设 备,不同应用场景下的需求。
一,Auto Layout(自动布局)
自动布局是iOS 6发布后引入的一个全新的布局特性,其目的是弥补以往autoresizing的布局方面的不足之处,使未来面对更多尺寸适配时,界面布局可以跟好的适配。
它通过内定的Constraint(约束)和各项条件来计算出合理的布局,Constraint的设定非常灵活,实现一种布局的方法可以通过多个Constraint套来完成。而不需要设定具体控件坐标x多少,y多少,Frame、Center和autoresing等。
1,在StoryBoard中使用自动布局
我们以如下的界面来演示(可以看到由于自动布局,不管在横屏还是竖屏都很好的实行屏幕自适应)
 
(1)先拖入一个Text Filed并设置约束(距上方距离为20,距左右距离为5)
 
(2)拖入一个Button并设置约束(距下方距离为5,水平居中)
 
(3)拖入一个Text View并设置约束(距上方即TextField距离为20,距下方即Button距离为20,距左右两侧为5)
 
(4)在左侧的列表栏目可以看到对应生成的约束,同时如果约束设置不正确会显示红色圆圈
 
 
(5)而选择具体的View组件,在右边的Size Inspector控制面板中可以进行约束的修改和删除 
2,使用纯代码来实现自动布局
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
46
47
48
49
50
51
52
53
import UIKit
 
class ViewController: UIViewController {
 
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
         
        //创建组件
        var textField = UITextField(frame: CGRectZero) //这里不再需要刻意制定x,y坐标
        textField.borderStyle = UITextBorderStyle.RoundedRect
        self.view.addSubview(textField)
         
        var button = UIButton.buttonWithType(UIButtonType.System) as UIButton;
        button.setTitle("按钮", forState:UIControlState.Normal)
        button.backgroundColor = UIColor(red: 55/255, green: 186/255, blue: 89/255, alpha: 0.5)
        self.view.addSubview(button)
         
        var textView = UITextView(frame: CGRectZero)
        textView.text="hangge.com"
        textView.backgroundColor = UIColor(red: 55/255, green: 186/255, blue: 89/255, alpha: 0.5)
        self.view.addSubview(textView)
         
        //使用Auto Layout的方式来布局
        textField.setTranslatesAutoresizingMaskIntoConstraints(false)
        button.setTranslatesAutoresizingMaskIntoConstraints(false)
        textView.setTranslatesAutoresizingMaskIntoConstraints(false)
         
        //创建一个控件数组
        var views:NSMutableDictionary = NSMutableDictionary()
        views.setValue(textField, forKey: "textField")
        views.setValue(button, forKey: "button")
        views.setValue(textView, forKey: "textView")
         
        //创建一个水平居中约束(按钮)
        var constraint:NSLayoutConstraint = NSLayoutConstraint(item: button, attribute: .CenterX,
            relatedBy: .Equal, toItem: self.view, attribute: .CenterX, multiplier: 1.0, constant: 0.0)
        self.view.addConstraint(constraint)
        //创建水平方向约束
        self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat(
            "H:|-5-[textField]-5-|", options: nil, metrics: nil, views: views))
        self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat(
            "H:|-5-[textView]-5-|", options: nil, metrics: nil, views: views))
        //创建垂直方向约束
        self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat(
            "V:|-20-[textField]-20-[textView]-20-[button]-20-|", options:nil,
            metrics: nil, views: views))
    }
 
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}

二,Size Classes(适配各类型的屏幕)

1,说明
(1)iOS8中新增了Size
Classes特性,是对老式UI思路的全新抽象,把所有设备(iPhone4、5、6、iPad、Apple
Watch)屏幕抽象成屏幕Size的变化,把屏幕的宽和高分成三种情况:紧凑(Compact)、任意(Any)和正常(Regular),这样宽和高
3*3共9种布局。
(2)每种Size都可以设置特定的一套布局,如果不特殊指定,默认是在(宽任意,高任意)
(3)通过Size Classes和Auto Layout的结合,可以很完美适配各种不同的分辨率。先用Size Classes将屏幕分类后,再用Auto Layout执行布局。
2,Size Classes主要的几种设备类型
Compact Width | Compact Height:横屏iPhone
Compact Width | Regular Height:竖屏iPhone
Regular Width | Regular Height:任意方向的iPad
Regular Width | Regular Height:未知设备
Any Width | Any Height:任意宽高
3,使用样例
比如我要把一个按钮放在页面的最下方并居中。但要求在竖屏下按钮宽度自适应(距两边框5像素),而在横屏下按钮使用固定宽度(150像素)
效果图如下:
 
(1)首先我们在默认类型下设置按钮水平居中,以及距下边框的距离
 
 
(2)给按钮添加两个新约束(对应iPhone的横屏和竖屏)
 
(3)选择wC hR布局,并设置约束(竖屏宽度自适应,距两侧5像素)
  
 
(4)选择wC hC布局,并设置约束(iPhone横屏状态下宽度固定)

Swift - 使用Auto Layout和Size Classes实现页面自适应弹性布局的更多相关文章

  1. 关于IOS的屏幕适配(iPhone)——Auto Layout和Size Classes

    Auto Layout和Size Classes搭配使用极大的方便了开发者,具体如何使用Auto Layout和Size Classes大家可以参考其他文章或者书籍,这里只提一点,在我们设置Size ...

  2. Swift语言Auto Layout入门教程:上篇

    原文:Beginning Auto Layout Tutorial in Swift: Part 1/2,译者:@TurtleFromMars 开始用自动布局约束的方式思考吧! 更新记录:该教程由Br ...

  3. 从 Auto Layout 的布局算法谈性能

    这是使用 ASDK 性能调优系列的第二篇文章,前一篇文章中讲到了如何提升 iOS 应用的渲染性能,你可以点击 这里 了解这部分的内容. http://t.cn/Rc4KbUC 在上一篇文章中,我们提到 ...

  4. 深入理解Auto Layout 第一弹

    本文转载至 http://zhangbuhuai.com/2015/07/16/beginning-auto-layout-part-1/ By 张不坏 2015-07-16 更新日期:2015-07 ...

  5. 有了Auto Layout,为什么你还是害怕写UITabelView的自适应布局?

    本文转载至 http://www.cnblogs.com/ios122/p/4832859.html Apple 算是最重视应用开发体验的公司了.从Xib到StoryBoard,从Auto Layou ...

  6. 【转】有了Auto Layout,为什么你还是害怕写UITabelView的自适应布局?

      Apple 算是最重视应用开发体验的公司了.从Xib到StoryBoard,从Auto Layout到Size Class,每一次的更新,都会给iOS应用的开发带来不小的便利.但是,对于绝对多数i ...

  7. swift 约束 - SnapKit 适配iPhoneX 安全区 和苹果自带的VFL ,auto layout 安全区适配

    这里tableview 是从最顶上的安全区适配的, nextBtn是最下边从安全区设置的,如果是在中间的view还是原来的写法,看2 1.安全区适配适用于Vc里面, 如果是自定义的view或封装的vi ...

  8. iOS8 Size Classes的理解与使用

    在iOS8中,新增了Size Classes特性,它是对当前所有iOS设备尺寸的一个抽象,也是该抽象了,想想现在多少种iOS尺寸的设备吧:iPhone4-5-6-6plus.iPad.iPad min ...

  9. Auto Layout 使用心得

    此系列文章代码仓库在 https://github.com/johnlui/AutoLayout ,有不明白的地方可以参考我的 Auto Layout 设置哦,下载到本地打开就可以了. 简介 Auto ...

随机推荐

  1. SQL Server 自学笔记

    --★★★SQL语句本身区分大小写吗 --SQLServer 不区分大小写 --Oracle 默认是区分大小写的 --datetime的输入格式,2008-01-07输入进去后显示为1905-06-2 ...

  2. MYSQL 备份用户权限

    MYSQL 备份用户权限 datadbblack 192.168.1.10 是 SELECT, RELOAD, SHOW DATABASES, LOCK TABLES  否 权限列表 1.Select ...

  3. Rsync、Unison及DRBD的比较

    一.Rsync Rsync(remote synchronize),顾名思义,可以知道这是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件.Rsync使用所谓的 “Rsync算法”来 ...

  4. gradle项目与maven项目相互转化(转)

    根据build.gradle和setting.gradle文件生成idea项目: gradle idea gradle这几年发展迅猛,github越来越多的项目都开始采用gradle来构建了,但是并不 ...

  5. Sitemesh3的使用及配置

    1 . Sitemesh 3 简介 Sitemesh 是一个网页布局和修饰的框架,基于 Servlet 中的 Filter,类似于 ASP.NET 中的‘母版页’技术.参考:百度百科,相关类似技术:A ...

  6. Android Activity Fragment 生命周期

    从开源项目中看到 这个,就情不自禁的收藏了~ https://github.com/xxv/android-lifecycle

  7. Android上成功实现了蓝牙的一些Profile

    前段时间做蓝牙方面的开发,Google的Android只实现了Handset/Handfree和A2DP/AVRCP等Profile,而其 它常用的Profile如HID/DUN/SPP/OPP/FT ...

  8. Steve Yegge:Google面试秘籍

    我憋了很长时间想写点关于去Google面试的秘籍.不过我总是推迟,因为写出来的东西会让你抓狂.很可能是这样.如果按统计规律来定义"你"的话,这文章很可能让你不爽. 为啥呢?因为啊- ...

  9. shell登录模式及其相应配置文件(转)

    参考<linux命令.编辑器与shell编程>(清华大学出版社) 当启动shell时,它将运行启动文件来初始化自己.具体运行哪个文件取决于该shell是登陆shell还是非登陆shell的 ...

  10. api 跳转规则

    api 配置: <Context docBase="zjzc-web-api" path="/api" reloadable="false&qu ...