自动布局通过Swift中的代码适合父级

Yog*_*ton 4 uiview autolayout swift

我有一个视图我正在通过代码创建并添加到另一个视图作为子视图.新的superview可以随着时间的推移改变它的框架,我希望新创建的子视图相应地改变它的框架.如何通过Swift中的代码使用自动布局来实现这一点?

Kir*_*ins 8

这是一个例子:

let view = UIView() // existing view

let subview = UIView()
subview.setTranslatesAutoresizingMaskIntoConstraints(false)

view.addSubview(subview)
view.addConstraint(NSLayoutConstraint(item: subview, attribute: .Top, relatedBy: .Equal, toItem: view, attribute: .Top, multiplier: 1.0, constant: 0.0))
view.addConstraint(NSLayoutConstraint(item: subview, attribute: .Leading, relatedBy: .Equal, toItem: view, attribute: .Leading, multiplier: 1.0, constant: 0.0))
view.addConstraint(NSLayoutConstraint(item: view, attribute: .Bottom, relatedBy: .Equal, toItem: subview, attribute: .Bottom, multiplier: 1.0, constant: 0.0))
view.addConstraint(NSLayoutConstraint(item: view, attribute: .Trailing, relatedBy: .Equal, toItem: subview, attribute: .Trailing, multiplier: 1.0, constant: 0.0))
Run Code Online (Sandbox Code Playgroud)


Rai*_*idi 6

iOS 13、迅捷 5

首先,添加这段代码

    subview.translatesAutoresizingMaskIntoConstraints = false
    view.addSubview(subview)
Run Code Online (Sandbox Code Playgroud)

那么,在较新版本的 iOS 中,有两种方法可以实现此目的。

  1. NSLayoutConstraint

    NSLayoutConstraint(item: subview, attribute: .top, relatedBy: .equal, toItem: view, attribute: .top, multiplier: 1, constant: 0).isActive = true
    NSLayoutConstraint(item: subview, attribute: .bottom, relatedBy: .equal, toItem: view, attribute: .bottom, multiplier: 1, constant: 0).isActive = true
    NSLayoutConstraint(item: subview, attribute: .left, relatedBy: .equal, toItem: view, attribute: .left, multiplier: 1, constant: 0).isActive = true
    NSLayoutConstraint(item: subview, attribute: .right, relatedBy: .equal, toItem: view, attribute: .right, multiplier: 1, constant: 0).isActive = true
    
    Run Code Online (Sandbox Code Playgroud)
  2. NSLayoutAnchor类(不太详细)

    subview.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
    subview.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
    subview.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
    subview.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
    
    Run Code Online (Sandbox Code Playgroud)

无论哪种方式,在 iOS 8 及更高版本上,Apple 建议使用isActive()而不是直接向视图添加约束。

此外,我相信该方法的目的NSLayoutAnchor是比NSLayoutConstraint.