代码之家  ›  专栏  ›  技术社区  ›  Nitish

更改子视图高度后调整SuperView的大小-不自动布局

  •  0
  • Nitish  · 技术社区  · 7 年前

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

    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.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 回复  |  直到 7 年前
        1
  •  1
  •   Hari    7 年前

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

    尝试实现自动布局。自动布局可以很容易地管理这类事情。

        2
  •  1
  •   bitwit Julio Gorgé    7 年前

    如果您没有使用nslayoutConstraints,并且没有设置任何自动调整大小的遮罩,那么您将负责自己更新帧。 layoutSubviews 正在根据约束应用布局;没有这些知识,它就不能做很多事情。

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