iOS中UI适配问题

来源:互联网 发布:城市地图js下载 编辑:程序博客网 时间:2024/05/09 15:10

iPhone5出来已经很久了,因为屏幕尺寸的改变,程序对于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