如何快速隐藏和取消隐藏具有高度的视图?

Posted

技术标签:

【中文标题】如何快速隐藏和取消隐藏具有高度的视图?【英文标题】:How to hide and unhide a view with height in swift? 【发布时间】:2021-01-23 08:30:20 【问题描述】:

我正在尝试隐藏和取消隐藏视图。隐藏时其大小应为 0,未隐藏时应为 200 左右。我有两个视图控制器。当第一个控制器显示视图第一次被隐藏并且它的大小设置为 0 时,它会导航到其他控制器并从 textfeilds 中获取一些值并将它们显示在前一个控制器的 tableview 上。

现在,我可以第一次隐藏高度为 0 的视图,但是当我使用这些值时,视图仍然是隐藏的。

这是我目前尝试过的代码:

mainView.isHidden == true
mainView.heightAnchor.constraint(equalToConstant: CGFloat(0)).isActive = true

// when I get the values but this code doesn't work
    mainView.isHidden == false
    mainView.heightAnchor.constraint(equalToConstant: CGFloat(100)).isActive = true

任何帮助将不胜感激。

【问题讨论】:

您需要更新高度。目前,您正在分配新的约束。检查这个:***.com/a/49776158/14733292 我试过它不起作用。只有当视图被隐藏时我没有给出任何高度时它才有效。 【参考方案1】:
class viewController: UIViewController 

     var height: NSLayoutConstraint!

     override func viewDidLoad() 
         super.viewDidLoad()
         
         height = mainView.heightAnch.constraint(equalToConstant: 0)
         height.isActive = true

         //handle change height
         if mainView.isHidden == true 
             height.constant = 0
         
         else 
             height.constant = 200
         
     

【讨论】:

【参考方案2】:

你有两个选择。 第一种方法将标识符设置为高度约束

设置标识符:

然后使用以下代码查找并更改:

// first option
        // find own constraint with indentifier
        if let heightConstraint = self.myView.constraints.first(where:  item -> Bool in
            return item.identifier == "heightIdentifier"
        ) 
            
            // set any constant to constraint
            heightConstraint.constant = 200.0 // for hidden
            heightConstraint.constant = 0.0 // for hide
            
            // any work
            
        

第二个选项:将 IBOutlet 设置为目标约束:

@IBOutlet weak var heightConstraint: NSLayoutConstraint!

那就改直接简单:

// second option
// change constant direct
self.heightConstraint.constant = 200.0 // for hidden
self.heightConstraint.constant = 0.0 // for hide
            
// any work

【讨论】:

【参考方案3】:

您将创建的约束保留在视图控制器中并根据需要激活,使用NSLayoutConstraintisActive 属性:

var hiddenHeightConstraint: NSLayoutConstraint?
var showingHeightConstraint: NSLayoutConstraint?

var isMainViewHidden: Bool = false 
    didSet 
        mainView.isHidden == isMainViewHidden
        hiddenHeightConstraint?.isActive = isMainViewHidden
        showingHeightConstraint?.isActive = !isMainViewHidden
        
        // Don't forget to call layoutIfNeeded() when you messing with the constraints
        view.layoutIfNeeded()
    


override func viewDidLoad() 
    super.viewDidLoad()
    
    hiddenHeightConstraint = mainView.heightAnchor.constraint(equalToConstant: CGFloat(0))
    showingHeightConstraint = mainView.heightAnchor.constraint(equalToConstant: CGFloat(100))
    
    isMainViewHidden = false

【讨论】:

以上是关于如何快速隐藏和取消隐藏具有高度的视图?的主要内容,如果未能解决你的问题,请参考以下文章

当用户快速滚动表格视图时如何隐藏和取消隐藏导航栏?

如何在滚动视图中隐藏和取消隐藏 UiViews 中的浮动按钮?

如何在收藏视图中隐藏/取消隐藏部分

UIStackView 隐藏/取消隐藏排列的子视图问题

隐藏导航栏将视图“向上”移动

如何取消隐藏 UISplitViewController 的主人?