zoukankan      html  css  js  c++  java
  • ios 之 autoresizing小解

    对于IOS的app开发人员来说,不会像Android开发人员一样为非常多的屏幕尺寸来做界面适配,因此硬编码的坐标也能工作良好,可是从设计模式上来说这不是好的做法。

    并且也另一些问题,如iPhone5的适配,横竖屏的切换等。也许你能够做两套UI方案来做适配,可是这样添加反复工作量。并且不够高端,万一有出新的屏幕大小了呢。哲理就将介绍IOS中的两大自己主动布局利器:Autoresizing 和 Autolayout

    autoresizing是UIView的属性。一直都有,使用简单,可是没有autolayout强大。autolayout是IOS6以后的新技术,更加强大。本文主要介绍Autoresizing的特性和使用方法。

    1. Autoresizing特性

    UIViewautoresizesSubviewsYES时。(默认是YES), 那么在当中的子view会依据它自身的autoresizingMask属性来自己主动适应其与superView之间的位置和大小。

    autoresizingMask是一个枚举类型, 默认是UIViewAutoresizingNone, 也就是不会autoresize:

    
    
    typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) {
        UIViewAutoresizingNone                 = 0,
        UIViewAutoresizingFlexibleLeftMargin   = 1 << 0,
        UIViewAutoresizingFlexibleWidth        = 1 << 1,
        UIViewAutoresizingFlexibleRightMargin  = 1 << 2,
        UIViewAutoresizingFlexibleTopMargin    = 1 << 3,
        UIViewAutoresizingFlexibleHeight       = 1 << 4,
        UIViewAutoresizingFlexibleBottomMargin = 1 << 5
    };
    

    这个枚举类型,使用了 1 << n 这种写法来定义。代表了它能够复选。假设你不明确为什么。能够复习下“位运算”。 那么这些值分别代表什么意思呢?

    事实上怎样理解这几个值非常easy,那就是从xib里面看。 我们在一个xib文件里,取消勾选autolayout,(默认使用autolayout时。autoresizing看不到)。那么我们能够在布局那一栏看到怎样设置autoresizing.

    上图说明了在xib中设置的这些线条和实际属性相应的关系。这当中须要注意的是,当中4个margin虚线才代表设置了该值,而width和height是实线代表设置了该值,不能想当然的理解。

    这些项分别代表:

    autoresizingMask是子视图的左、右、上、下边距以及宽度和高度相对于父视图按比例变化。比如:

    UIViewAutoresizingNone 不自己主动调整。

    UIViewAutoresizingFlexibleLeftMargin 自己主动按比例调整与superView左边的距离,且与superView右边的距离不变。

    UIViewAutoresizingFlexibleRightMargin 自己主动按比例调整与superView的右边距离,且与superView左边的距离不变。

    UIViewAutoresizingFlexibleTopMargin  自己主动按比例调整与superView的顶部距离,且与superView底部的距离不变。

    UIViewAutoresizingFlexibleBottomMargin 自己主动按比例调整与superView的底部距离,且与superView顶部的距离不变。

    UIViewAutoresizingFlexibleWidth 自己主动按比例调整宽度。

    UIViewAutoresizingFlexibleHeight 自己主动按比例调整高度。

    UILabel*    label = [[UILabel alloc] initWithFrame:CGRectMake(50, 100, 200, 40)];

    [label setAutoresizingMask: UIViewAutoresizingNone];  控件相对于父视图坐标值不变   

    CGRectMake(50, 100, 200, 40)
    UIViewAutoresizingFlexibleWidth:控件的宽度随着父视图的宽度按比例改变    比如
    label宽度为 100     屏幕的宽度为320          当屏幕宽度为480时      label宽度  变为  100*480/320

    以上这些都较易理解, 可是autoresizing另一些组合场景。那就是组合使用的场景。

    autoresizingMask 说明 xib预览效果
    None view的frame不会随superview的改变而改变(右图的xib中预览效果与实际效果有差,实际效果是view的上边距不变)
    TopMargin | BottomMargin view与其superView的上边距和下边距的比例维持不变
    LeftMargin | RightMargin view与其superView的左边距和右边距的比例维持不变(右图的xib中预览效果与实际效果有差,实际效果是view的上边距不变)
    LeftMargin | RightMargin | TopMargin | BottomMargin view与其superView的上下左右边距的比例维持不变
    LeftMargin | Width view与其superView的右边距的比例维持不变, 左边距和width按比例调整(右图的xib中预览效果与实际效果有差。实际效果是view的上边距不变)
    LeftMargin | Width | RightMargin 左边距、右边距、宽按比例调整。(右图的xib中预览效果与实际效果有差。实际效果是view的上边距不变)
    Width | Height 自己主动调整view的宽和高,保证上下左右边距不变。

    上面并未列举全部组合场景,可是已经足够我们理解 autoresizing 了。

    2. 小结

    Autoreszing的最常见的有用场景就是iPhone5的兼容了。

    比方我们想要设置tableView的frame,那我们仅仅须要在初始化设置frame之后将tableView的autoresizingMask设置为UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight 即可了。

    还有一种比方我们想要一个view一直停留在其superview的最下方,那么我们在初始化设置frame之后仅仅须要将autoresizingMask设置为UIViewAutoresizingFlexibleTopMargin 就能够了。

    autorezingMask简单的一个属性。理解它之后能够让非常多事情变得简单。

  • 相关阅读:
    apache的源代码编译安装
    python学习笔记(五) 200行实现2048小游戏
    python学习笔记(四) 思考和准备
    python学习笔记(三)高级特性
    python自学笔记(二)
    python自学笔记(一)
    redis 配置和使用(C++)
    汇编基础最后一篇--机器语言指令
    汇编语言学习笔记(六)
    网络编程学习方法和图书推荐
  • 原文地址:https://www.cnblogs.com/yfceshi/p/7240928.html
Copyright © 2011-2022 走看看