iOS中UI适配相关简介

来源:互联网 发布:网络ppp是什么意思 编辑:程序博客网 时间:2024/05/20 12:51
   

Phone5出来已经很久了,因为屏幕尺寸的改变,程序对于UI的灵活操控就显的尤为重要

其实这次的总结还是用的老API中相关的属性,只不过以前我们没有深入的考虑,或者说是我没有深入考虑吧

 


先从viewController的view说起吧(以下代码全部为ARC环境下)手动创建view都是从loadView方法中初始化viewController的self.view,这里说API中的属性:

1、[UIScreen mainScreen].bounds,屏幕的bounds,

2、[UIScreen mainScreen].applicationFrame,app的frame,当app的statusBar隐藏时,它跟[UIScreen mainScreen].bounds实际是一样的

 

 

我一般这么创建view:self.view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame];

此时view的frame在iPhone5是0,20,320,548,之前的iPhone是0,20,320,460,

 


之后viewController的self.view的frame会自动在viewWillAppear方法中重新变化,自动适配屏幕的尺寸,也就是说,如果你有navigationBar,那么此时view的frame是0,20,320,504(iPhone5),我在以前都是手动在loadView的时候减44的,不知道有没有跟我一样的。。。

 


好了,说了这么多,一句话总结就是,你controller的self.view会在viewWillAppear把自己的frame设置为除了statusBar和navigationBar,充满屏幕的尺寸,如果没有了statusBar和navigationBar或者它们之一,self.view的frame依然是充满屏幕的

 


下面就是UIView的一个适配上很重要的属性了:autoresizingMask,它的作用是,superView的frame变化后,它在superView中的位置或大小如何变化,它的属性如下:

enum {   

UIViewAutoresizingNone                 = 0,   

UIViewAutoresizingFlexibleLeftMargin   = 1 << 0,   

UIViewAutoresizingFlexibleWidth        = 1 << 1,   

UIViewAutoresizingFlexibleRightMargin  = 1 << 2,   

UIViewAutoresizingFlexibleTopMargin    = 1 << 3,   

UIViewAutoresizingFlexibleHeight       = 1 << 4,   

UIViewAutoresizingFlexibleBottomMargin = 1 << 5

};

typedef NSUInteger UIViewAutoresizing;

 


举个例子,假如你的背景中有个button,你希望这个button无论什么时候,距离这个背景底部的高度都是固定的,那你只需要设置button的autoresizingMask为UIViewAutoresizingFlexibleTopMargin。

让我们来看一下UIViewAutoresizingFlexibleTopMargin的定义:The view resizes by expanding or shrinking in the direction of the top margin.就是说它在superview中,距离顶部的位置是可变的

 


如果同时设置UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin,那么它在superview中的新位置(这里的新位置,指的是superView的frame变化后的位置)会是旧位置乘以一个比例因数得出。

比例因数为:superView当前高度 - 它的高度 / superView原高度 - 它的高度

 


有了这两个知识点,就可以轻松适配iPhone5和之前的屏幕了,比如某个特定viewB中有个元素A,你希望A无论在iPhone5还是4s都是在B中距离B的底部20px,那你只需要设置它的autoresizingMask为UIViewAutoresizingFlexibleTopMargin,并且在controller的viewWillAppear设置一下B的新frame即可


0 0
原创粉丝点击