StoryBoard布局约束注意点

来源:互联网 发布:同城国际旅行社 java 编辑:程序博客网 时间:2024/06/08 10:40

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

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

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

后果:欲新添加的基于可视化bounds的新视图的布局与想像的不一样。

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

正确的姿势:a.在这几个方法中使用,添加约束。  b.不要在这几个方法中使用它的frame,在控制器viewDidLayoutSubviews()方法中使用其frame,时候才是对应的更新过后的。(会引起无线循环)

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

    override func viewDidLoad() {        super.viewDidLoad()        //self.updateViewConstraints() //即使调用也不会立即更新,也得再viewWillAppear后更新               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