iOS中UI适配问题

iPhone, 因为屏幕尺寸的改变,程序对于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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值