使用autolayout确定UIView的宽度 - SWIFT

时间:2015-08-11 17:21:33

标签: ios swift uiview autolayout width

好了,所以在界面构建器(Main.storyboard)中,我containerView:UIView中嵌入了UIScrollView。在containerView内,我想创建额外的UIView来保存内容块,例如标题,正文等。这样做的原因是内容可以垂直滚动但不能水平滚动。

我的目标是使用自动布局来创建这些不同的UIView。截至目前,containerView会根据所用设备的屏幕尺寸自动调整其宽度,以防止水平滚动。它使用我为宽度约束创建的IBOutlet来完成此操作。它目前看起来像这样:

@IBOutlet var containerView: UIView!
@IBOutlet var containerViewWidthConstraint: NSLayoutConstraint!

override func viewDidLoad() {
    super.viewDidLoad()

    //Prevents horizontal scrolling
    containerViewWidthConstraint.constant = self.view.frame.size.width

    createHeader()
}

然后我创建了一个名为createheader{}的函数,它在headerView:UIView的顶部固定containerView,在containerView的任一边固定8个点:

func createHeader() {
    //Create header
    let headerView = UIView()
    headerView.backgroundColor = UIColor.blueColor()
    self.containerView.addSubview(headerView)

    //Create header constraints
    let leftMargin = NSLayoutConstraint(item: headerView, attribute: .Leading, relatedBy: .Equal, toItem: containerView, attribute: .Leading, multiplier: 1.0, constant: 8)
    let rightMargin = NSLayoutConstraint(item: containerView, attribute: .Trailing, relatedBy: .Equal, toItem: headerView, attribute: .Trailing, multiplier: 1.0, constant: 8)
    let topMargin = NSLayoutConstraint(item: headerView, attribute: .Top, relatedBy: .Equal, toItem: containerView, attribute: .Top, multiplier: 1.0, constant: 70)
    let heightConstraint = NSLayoutConstraint(item: headerView, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1.0, constant: 160)

    //Activate header constraints
    headerView.setTranslatesAutoresizingMaskIntoConstraints(false)
    NSLayoutConstraint.activateConstraints([leftMargin,rightMargin,topMargin,heightConstraint])

    println(headerView.frame.size.width)
}

现在,由于headerView内的内容大小将取决于所使用设备的屏幕大小,我希望能够根据大小的大小创建调整内容宽度的函数。 headerView本身的宽度。但是,每次我尝试使用:

获取headerView的宽度
println(headerView.frame.size.width)

它返回零值,显然不是这种情况,因为它仍然根据上述约束创建蓝背景headerView

为什么SWIFT没有意识到headerView有宽度?我怎样才能抓住headerView的宽度?

1 个答案:

答案 0 :(得分:3)

安装约束后,如果要立即更新帧,则需要调用layoutIfNeeded

func createHeader() {
    //Create header
    let headerView = UIView()
    headerView.backgroundColor = UIColor.blueColor()
    self.containerView.addSubview(headerView)

    ...

    //Activate header constraints
    headerView.setTranslatesAutoresizingMaskIntoConstraints(false)
    NSLayoutConstraint.activateConstraints([leftMargin,rightMargin,topMargin,heightConstraint])

    self.containerView.layoutIfNeeded() // Updates the frames
    println(headerView.frame.size.width) // Will output the correct width
}

请注意,这将在UI循环的下一次迭代中自动发生,但是,当您想立即查看效果时,这对您没有帮助。