当我问这个问题时,谷歌总会给出自动布局的结果 我有一个自定义视图,其子视图很少。其中一个子视图还有2个子视图。
Superview
- Subview 1
- Subview 2
- Subview 21
- Subview 22
- Subview 3
在某些按钮操作中,我隐藏了一个内部子视图(Subview 22)。之后我正在更新外部子视图的高度(子视图2)。
subheader.frame = CGRect(x: subheader.frame.origin.x, y: subheader.frame.origin.y, width: subheader.frame.size.width, height: 0)
subheader.isHidden = true
viewTop.frame = CGRect(x: viewTop.frame.origin.x, y: viewTop.frame.origin.y, width: viewTop.frame.size.width, height: 60)
self.layoutSubviews()
副标题是 viewTop 的子视图,viewTop是父视图的子视图。
问题是viewTop的高度没有变化
注意: viewTop 具有渐变背景:
viewTop.setViewGradientBackground(UIColor(red: 228.0 / 255.0, green: 221.0 / 255.0, blue: 135.0 / 255.0, alpha: 1.0), backgroundColorBottom: UIColor(red: 150.0 / 255.0, green: 129.0 / 255.0, blue: 32.0 / 255.0, alpha: 1.0))
extension UIView
{
func setViewGradientBackground(_ backgroundColorTop: UIColor, backgroundColorBottom: UIColor)
{
let btnGradient = CAGradientLayer()
btnGradient.frame = self.bounds
btnGradient.colors = [backgroundColorTop.cgColor as CGColor, backgroundColorBottom.cgColor as CGColor]
self.layer.insertSublayer(btnGradient, at: 0)
}
}
答案 0 :(得分:1)
self.layoutSubviews()在这种情况下不起作用。它仅在使用自动布局时才有效。在手动管理帧时,只要更改了一个视图的帧,就应该为所有超级视图和子视图设置帧。这是一个棘手的事情。
尝试实现自动布局。自动布局将轻松管理这些事情。
答案 1 :(得分:1)
如果您没有使用NSLayoutConstraints并且您没有设置任何自动调整遮罩,那么您自己负责更新框架。 layoutSubviews
正在根据约束应用布局;没有这些知识,它就无法做很多事情。
我能想到的最直接的方式就是打电话
viewTop.superview?.frame = ...
如果您真的不想进入自动布局路线,请手动更新。