Swift如何基于它的内容设置UIView的高度约束

时间:2017-07-29 08:52:57

标签: ios swift uiview

我的swift代码中有一个UIView

let profile_inf_wrapper: UIView = {
        let v = UIView()
        v.backgroundColor = .red
        v.translatesAutoresizingMaskIntoConstraints = false
        return v
    }()

    profile_inf_wrapper.topAnchor.constraint(equalTo: view.topAnchor, constant:64).isActive = true
    profile_inf_wrapper.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
    profile_inf_wrapper.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
    profile_inf_wrapper.heightAnchor.constraint(equalToConstant:  view.frame.height/4).isActive = true

    backgroundImageView.topAnchor.constraint(equalTo: profile_inf_wrapper.topAnchor).isActive = true
    backgroundImageView.leftAnchor.constraint(equalTo: profile_inf_wrapper.leftAnchor).isActive = true
    backgroundImageView.rightAnchor.constraint(equalTo: profile_inf_wrapper.rightAnchor).isActive = true
    backgroundImageView.bottomAnchor.constraint(equalTo: profile_inf_wrapper.bottomAnchor).isActive = true

    profileImage.centerYAnchor.constraint(equalTo: profile_inf_wrapper.centerYAnchor).isActive = true
    profileImage.leftAnchor.constraint(equalTo: view.leftAnchor, constant:25).isActive = true
    profileImage.widthAnchor.constraint(equalToConstant: 110).isActive  = true
    profileImage.heightAnchor.constraint(equalToConstant: 110).isActive = true

    usernameLabel.topAnchor.constraint(equalTo: profile_inf_wrapper.topAnchor, constant:40).isActive = true
    usernameLabel.leftAnchor.constraint(equalTo: profileImage.rightAnchor, constant:20).isActive = true

    countryIcon.topAnchor.constraint(equalTo: usernameLabel.bottomAnchor, constant:10).isActive = true
    countryIcon.leftAnchor.constraint(equalTo: profileImage.rightAnchor, constant:20).isActive = true
    countryIcon.widthAnchor.constraint(equalToConstant: 25).isActive = true
    countryIcon.heightAnchor.constraint(equalToConstant: 25 ).isActive = true

    countryName.topAnchor.constraint(equalTo: usernameLabel.bottomAnchor, constant:5).isActive = true
    countryName.leftAnchor.constraint(equalTo: countryIcon.rightAnchor, constant:10).isActive = true
    countryName.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true

所有这些元素都是profile_inf_wrapper的子视图。有时view.frame.height/4太小,我希望能够根据内容调整UIView的大小

3 个答案:

答案 0 :(得分:1)

UIView中有一个名为intrinsicContentSize的属性。它返回视图需要显示其所有内容的最小大小。

虽然默认实现不是很有用,因为UIView本身没有任何内容,但所有默认子类都实现了它。

UILabel将返回一个完全符合文字大小的大小,UIButton将返回适合其内容的大小以及您添加的任何间距。你得到了它的要点。

您可以通过仅约束视图的widthheight来利用此属性,而不是两者。如果您约束width的{​​{1}}并添加更多文字,则会垂直增长。

最后,当您将子视图添加到UILabel时,您可以向轴的两个边距(UIViewtop and bottom)添加约束,只要有一个“链”约束和视图,并且视图对大小没有任何约束,它将扩展到适合。

例如,如果您有一个标签和一个按钮的视图,垂直排列,如果标签被约束到顶部,那么约束到按钮,并且按钮被限制在底部,只要容器视图没有left and right约束,它将展开以完全适合两个视图加上边距。

您的目标始终应该是使用最少量的约束来表达您的设计,而不会删除有用的约束。确保您利用height

答案 1 :(得分:0)

您要做的第一件事是引用profile_inf_wrapper的高度约束。

var profile_inf_wrapper_height_constraint: NSLayoutConstraint?

我不知道您的内容的详细信息,但是当视图需要调整大小时,您可以在viewController中使用条件检查,

if contentRequiresResizing {
    profile_inf_wrapper_height_constraint.constant = view.frame.width/3
else {
    profile_inf_wrapper_height_constraint.constant = view.frame.width/4
}

通过引用约束,它允许您轻松支持动态UI更改。

作为旁注,我建议重命名您的UIView变量名,以便引用约束不会那么长。 Swift 3 API指南也支持lowerCamelCase,而不是下划线命名。

答案 2 :(得分:0)

要动态设置uiview的高度,你必须在问题中为视图添加高度/底部约束

profile_inf_wrapper.heightAnchor.constraint(equalToConstant: view.frame.height/4+countryName.frame.size.height).isActive = true

您还需要视图大小以适应实际更新的大小 喜欢

countryName.sizeToFit() 

然后根据需要更新布局以获得所有影响