更改子视图高度后调整超级视图的大小 - 无自动布局



当我问这个问题时,谷歌总是给出自动布局的结果。
我有一个自定义视图,其中几乎没有子视图。其中一个子视图还具有 2 个子视图。

Superview  
- Subview 1  
- Subview 2  
- Subview 21  
- Subview 22   
- Subview 3  

在某些按钮操作中,我隐藏了一个内部子视图(子视图 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)
}
}

self.layoutSubviews() 在这种情况下将不起作用。它仅在使用自动布局时起作用。由于手动管理框架,因此每当更改一个视图的框架时,都应为所有超级视图和子视图设置框架。这是一件棘手的事情。

尝试实现自动布局。自动布局将轻松管理此类内容。

如果您没有使用 NSLayoutConstraint,并且没有设置任何自动调整大小的掩码,那么您负责自己更新帧。layoutSubviews正在根据约束应用布局;没有这些知识,它就无能为力。

我能想到的最直接的方法就是打电话viewTop.superview?.frame = ...并手动更新它,如果你真的不想走自动布局路线。

最新更新