UIViewController view的加载情况,以及frame怎样改变问题

项目开发的时候遇到一个问题,有一个controller的view无论在viewdidload还是viewdidAppear里怎么也改不了它的大小。 改成1024*768,之后又会变成768*1024.  网上查了很多资料,决绝不了。 于是自己看了些官方文档,写了一个demo来测试。 算有了些眉目。 对controller的view加载过程又有了进一步的认识。

一、view的加载过程

contrller初始化是并未对view进行处理,这时view的属性为nil。 之后一旦访问view的属性,只要为nil,那么则会开始加载view。 如果有nib,则会从nib自动加载。 如果没有则调用controller的loadview方法。 此时在loadview里,若使用【super loadview】则会根据window的大小,创建一个默认的view。 如果要自定义view,则不要去调这行代码。 之后view属性设置好以后,则会调用viewdidload; 而viewWillAppear和viewDidAppear则是在addsubview的时候调的,(调试时可以看到以下调用信息。猜想是判断view有没有controller,有的话在addsubview的时候就去调viewWillAppear和viewDidAppear)。

-[UIView(Hierarchy) addSubview:]
-[UIViewController _setViewAppearState:isAnimating:]
-[TestviewController viewDidAppear:]

二、controller的veiw改变大小。

  在TestViewController里,viewDidLoad里改变它自己view的大小有效了,是可以改变的。 那么为什么会存在之前的问题呢? 仔细分析后是因为之前那个controller设置的是window的rootViewController,而window的开始是设定好的,此时它rootviewcontroller的view的大小则是恒定的(始终为满屏显示),在rootviewcontroller里无法更改。更改的办法必须在[self.window makeKeyAndVisible] 用controller.view.frame = XXX 更改。但是问题又出现了,更改一次可以,但是一旦发生旋转,又回到满屏状态。

  原因是在window的rootviewcontroller 在旋转时,环境context是window,会以满屏显示的尺寸去重新剪裁和layout,导致rootviewcontroll的view又满屏显示。此时可以在 rootviewcontroller 的 -(void)viewWillLayoutSubviews里设置view的frame

- (void)viewWillLayoutSubviews
{
    self.view.frame = CGRectMake(0, 0, 50, 50);
}

同时可以设置autoSizeMask属性,调整缩放大小。 这时发生旋转后不再满屏。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值