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

时间:2018-05-18 10:49:00

标签: ios swift uiview

当我问这个问题时,谷歌总会给出自动布局的结果 我有一个自定义视图,其子视图很少。其中一个子视图还有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)
    }
}

2 个答案:

答案 0 :(得分:1)

self.layoutSubviews()在这种情况下不起作用。它仅在使用自动布局时才有效。在手动管理帧时,只要更改了一个视图的帧,就应该为所有超级视图和子视图设置帧。这是一个棘手的事情。

尝试实现自动布局。自动布局将轻松管理这些事情。

答案 1 :(得分:1)

如果您没有使用NSLayoutConstraints并且您没有设置任何自动调整遮罩,那么您自己负责更新框架。 layoutSubviews正在根据约束应用布局;没有这些知识,它就无法做很多事情。

我能想到的最直接的方式就是打电话 viewTop.superview?.frame = ...如果您真的不想进入自动布局路线,请手动更新。