• 自动布局简介


    自动布局简介

    屏幕适配简介

    直接使用 frame 计算控件的位置

    • 特点:程序中存在大量的 MagicNumber
    • iPhone iPhone3G iPhone3GS iPhone4 iPhone4S 屏幕的物理尺寸是一样的(无需屏幕适配)
      • 而且一个应用要么是横屏要么是竖屏, 几乎不存在能同时进行横竖屏切换的应用
      • 应用程序都是竖屏
      • 游戏几乎都是横屏

    官方应用大多支持横竖屏

    使用 Autoresizing 进行屏幕适配

    随着 iPad 的发布, 屏幕的物理尺寸发生了变化
    并且苹果建议,在 iPad 上运行的程序如果没有特殊原因,应该支持横竖屏切换
    因此:不能把控件的 frame 都写死了,需要进行屏幕适配
    为了解决屏幕适配需求,苹果同时推出了第一个屏幕适配解决方案:Autoresizing

    Autoresizing 的核心思想就是:参照父容器来设置子控件的 frame
    不再写死 frame, 而是参照父容器

    举例:在竖屏下有一个按钮要占据整个屏幕宽度, 当切换到横屏以后同样要占据整个屏幕的宽度

    Autoresizing 只能设置当前控件父控件之间的相对关系

    • Autoresizing 有一句非常常见的代码,一定要有印象
    redView.AutoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    

    iOS 6 —— Auto Layout(自动布局)

    随着 iPhone5 iPhone5s 等的发布苹果设备不同尺寸的屏幕变得越来越多, 不仅要求能根据控件父子
    关系来设置相对位置,也要求能根据任意控件之间的关系来设置位置因为 Autoresizing 只能设置当前控件 与父控件之间的相对关系,当遇到要设置兄弟控件之间的关系的时候 Autoresizing 就无能为力了

    举例: 在竖屏下, 屏幕底部有两个按钮,这两个按钮的间距为一个固定的值(宽度不指定)
    当切换为横屏的时候要求这两个按钮还显示在屏幕底部
    并且按钮间的间距不变, 按钮可以随之变宽

    Auto Layout 技术主要解决的问题:控件位置的参照关系不再局限于父控件
    *** AutoLayout核心公式: ***

    firstItem.firstAttribute {==,<=,>=} secondItem.secondAttribute * multiplier + constant 
    

    注意:如果firstItem.firstAttribute和secondItem.secondAttribute调换位置后注意multiplier和constant值的变化

    iOS 8 —— Size Classes + Auto Layout

    使用 Size Classes + Auto Layout 进行屏幕适配
    当 iPhone6 发布以后,苹果设备的屏幕越来越多(以后也可能出现更多不同大小的屏幕),为了能更容易的适配不同的屏幕,苹果推出了 Size Classes 技术
    通过 Auto Layout 设置的约束,约束一旦添加就会应用于各种屏幕(也就是说在
    各种不同的屏幕下都使用相同的约束)
    通过 Size Classes + Auto Layout 的方式, 可以为不同尺寸的屏幕设置不同的约束
    举例: iPhone 下的计算器,在横屏、竖屏下的不同表现

    • Size Classes 技术主要解决的问题: 主要解决了iPhone横竖屏适配及iPhone和iPad开发时共用一个IB的问题

    iOS 9 —— Size Classes + Auto Layout + StackView

    StackView 的核心便是方便垂直或水平排布多个 subview,类似于 android 的 LinearLayout
    StackView 最有用的就是它会自动为每个 subview 创建和添加 Auto Layout 约束,程序员可以
    通过选项配置subview的大小、排布以及彼此间的间距,使用 stackview 主要简化在线性方向上,重复设置控件布局约束的问题

    18-自动布局动画原理(了解)

    • 修改约束数值并不会让视图的位置及大小立即发生变化
    • 自动布局系统 会在一次用户交互活动中,收集所有控件的约束变化
    • 如果有约束变化,会在收集完成之后,统一计算所有控件变化后的 frame 并且设置
    • layoutIfNeeded 方法就是通知视图,如果当前存在变化的约束,先更新一下

    19-代码中使用AutoLayout的注意点:

    1. 要先禁止Autoresizing功能,设置view的下面属性为NO
      约束要作用的view.translatesAutoresizingMaskIntoConstraints = NO;
    2. 添加约束之前,一定要保证相关控件都已经在各自的父控件
    3. 不用再给控件设置frame

    -Xcode版本信息

    Xcode版本 正式版发布时间 支持系统及设置
    Xcode4.2 2011年10月13日 iOS5-iPhone4s
    Xcode4.5 2012年9月20日 iOS6-iPhone5
    Xcode5.0 2013年9月18日 iOS7-iPhone5s
    Xcode6.0 2014年9月17日 iOS8-iPhone6
    Xcode7.0 2015年9月28日 iOS9-iPhone6s)
    ☂业精于勤,荒于嬉;行成于思,毁于随。☂
  • 相关阅读:
    atitit.基于http json api 接口设计 最佳实践 总结o7
    atitit.表单验证 的dsl 本质跟 easyui ligerui比较
    Atitit. 提升软件开发效率and 开发质量---java 实现dsl 4gl 的本质and 精髓 O725
    atitit.设计模式(2) -----查表模式/ command 总结
    atitit.spring3 mvc url配置最佳实践
    atitit.java给属性赋值方法总结and BeanUtils 1.6.1 .copyProperty的bug
    atitit.RESTful服务的概览and框架选型
    atitit.查看预编译sql问号 本质and原理and查看原生sql语句
    atitit.atitit.hb many2one relate hibernate 多对一关联配置..
    atitit.hbnt orm db 新新增更新最佳实践o7
  • 原文地址:https://www.cnblogs.com/wang-biao/p/5975694.html
Copyright © 2020-2023  润新知