StoryBoard布局注意事项

StoryBoard布局注意事项

 对于一个懒人来说,相对于代码写界面,我更喜欢使用可是化布局,可以实时看到,可是终究还是代码执行,所以很多东西还需要在代码中去做,所以我还是鼓励打家多用代码编写界面。

1.生命周期注意事项

不要在Controller的viewWillLoad中去使用来自于可视化布局布局和尺寸(特别是frame或bound)

原因:在这几个方法中,可视化布局的约束并没有生效,包括再wiewDidAppear这里,同样是无效的,所以它的视图的尺寸为原布局尺寸(取决于选择的基本布局模型)

后果:欲新添加的基于可视化bounds的新视图的布局与想像的不一样(布局取决于使用xib的大小)。

例如:storyboard中基于iphone7添加的等宽子视图view1,约束为等宽,我在wiewdidLoad中又在view1中添加一个view2=UIView(frame:view1.bouns),想着view2等宽view1,如果在iphone7(或屏幕宽度为375)中是可以的,可是其他宽度的手机就会出错,因为view2的宽度始终为原view1的宽度375,不会变化,除非你给他添加约束

正确的姿势:a.在这几个方法中使用,添加约束代码,不要使用frame布局。

如何获取约束更新后的坐标信息

一.Controller中

1.在viewDidLoad中获取

2.执行setNeedLayout和layoutIfNeeded方法(推荐)

比如:在viewDidload使用frame之前先调用

// 针对于Controller 如果是自定义View  在需要获取正确frame之前执行,替换下面代码前面的View对象
self.view.setNeedLayout();  // 设置更新标志
self.view.layoutIfNeed;     // 实际更新

   一般的控制器调用方法顺序:

    override func viewDidLoad() {
        super.viewDidLoad()
        //self.updateViewConstraints() //即使调用也不会立即更新,也得再viewWillAppear后更新 
// 所有可以使用上面提到的两个方法跟新layout到正确值
       
        view1 = self.view.viewWithTag(20)
        
    }
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        
    }
    //新添加约束请在这里更新,确保该view的translatesAutoresizingMaskIntoConstraints属性已设置为NO
    //有约束布局更改会自动调用
    override func updateViewConstraints() {
        super.updateViewConstraints()
    }
    override func viewWillLayoutSubviews() {
        super.viewWillLayoutSubviews()
    }
    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
    }


理解参考【ios8自动布局相关

 

 

 

2.在代码中添加约束

确保改View的translatesAutoresizingMaskIntoConstraints属性已设置为NO

  a.在对应的View的重绘方法中去添加,并更新布局调用。【View的约束相关方法

  b.建议重写控制器updateViewConstraints()方法,在中添加 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值