问题描述
@IBOutlet weak var CompanyDetailsBottom: NSLayoutConstraint!
@IBOutlet weak var CompanyDetailsView: UIView!
@IBAction func toggleCollapisbleView(_ sender: UIButton) {
if(CompanyDetailsView.isHidden){
var _CompanyHeight: CGFloat {
get {
return CompanyDetailsBottom.constant.magnitude
}
set {
CompanyDetailsBottom.constant.magnitude = 0
}
}
CompanyDetailsView.isHidden = false
}else {
CompanyDetailsView.isHidden = true
}
}
}
如果标签被隐藏,我正在尝试调整视图的大小,但我无法分配给属性:“幅值”是一个只能获取的属性,因为有错误。
解决方法
您可以使用下面的扩展名隐藏视图,其父视图将调整其高度
extension UIView {
var isGone: Bool {
get {
return isHidden
}
set {
let constraints = self.constraints.filter({ $0.firstAttribute == .height && $0.constant == 0 && $0.secondItem == nil && ($0.firstItem as? UIView) == self })
self.isHidden = newValue
if newValue {
if let constraint = constraints.first {
constraint.isActive = true
} else {
let constraint = NSLayoutConstraint(item: self,attribute: .height,relatedBy: .equal,toItem: nil,multiplier: 1,constant: 0)
// constraint.priority = UILayoutPriority(rawValue: 999)
self.addConstraint(constraint)
constraint.isActive = true
}
self.setNeedsLayout()
self.setNeedsUpdateConstraints()
} else {
constraints.first?.isActive = false
}
}
}
}
所有子视图的约束优先级必须小于1000(最大999)
使用:
childView.isGone = true
,
如果不想使用约束,可以做的是将CompanyDetailsView
嵌入垂直的UIStackView
内,然后在隐藏它时,堆栈视图的高度将自动为0。
UILabel
是否嵌入在UIView
中?如果是这样,您可以将UIView
更改为UIStackView
,这样如果标签被隐藏,则高度将为0