我的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的大小
答案 0 :(得分:1)
UIView
中有一个名为intrinsicContentSize
的属性。它返回视图需要显示其所有内容的最小大小。
虽然默认实现不是很有用,因为UIView
本身没有任何内容,但所有默认子类都实现了它。
UILabel
将返回一个完全符合文字大小的大小,UIButton
将返回适合其内容的大小以及您添加的任何间距。你得到了它的要点。
您可以通过仅约束视图的width
或height
来利用此属性,而不是两者。如果您约束width
的{{1}}并添加更多文字,则会垂直增长。
最后,当您将子视图添加到UILabel
时,您可以向轴的两个边距(UIView
或top 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()
然后根据需要更新布局以获得所有影响