如何动态更新约束?

Jac*_*ack 0 ios nslayoutconstraint swift

我有三个UIButton,我以编程方式创建了约束,在某些情况下,我删除其中一个UIButton按钮button.removeFromSuperview(),其余两个按钮将根据优先级设置约束。问题是当我删除一个UIButton(buttonWink)时,从 viewLifeCycle 开始viewWillLayoutSubviews,应用程序将在下面一行崩溃

 buttonWink.translatesAutoresizingMaskIntoConstraints = false
Run Code Online (Sandbox Code Playgroud)

当然,因为 ButtonWink 已从超级视图中删除,但是我们可以在设置约束之前进行检查:

  if buttonWink != nil {
        buttonWink.translatesAutoresizingMaskIntoConstraints = false
      }
Run Code Online (Sandbox Code Playgroud)

但是通过对每个按钮检查 nil 会使代码变得冗长,有什么方法可以做到这一点吗?我会非常感谢朋友们。

输出 -

在此输入图像描述

我在这里附上我尝试过的完整代码。

import UIKit
class MasterViewController: UIViewController {
    @IBOutlet weak var buttonMessage : UIButton!
    @IBOutlet weak var buttonLike : UIButton!
    @IBOutlet weak var buttonWink : UIButton!
    @IBAction func tapsOnLike(_ sender: UIButton) {
        sender.removeFromSuperview()
    }
    @IBAction func tapsOnWink(_ sender: UIButton) {
        sender.removeFromSuperview()
    }
    @IBAction func tapsOnNextButton(){
        let vc = DetailViewController(nibName: "DetailViewController", bundle: nil)
        navigationController?.pushViewController(vc, animated: true)
    }

    override func viewDidLoad() {
        super.viewDidLoad()
       setConstraints()
        navigationController?.isNavigationBarHidden = true
    }
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(true)
       // setConstraints()
    }
    override func viewWillLayoutSubviews() {
        super.viewWillLayoutSubviews()
        //setConstraints()
    }
    func setConstraints() {

        if buttonMessage != nil {
            buttonMessage?.translatesAutoresizingMaskIntoConstraints = false
        }
            buttonLike?.translatesAutoresizingMaskIntoConstraints = false
            buttonWink?.translatesAutoresizingMaskIntoConstraints = false

        //Constraints for Message button

        let leading = NSLayoutConstraint(item: buttonMessage, attribute: .leading, relatedBy: .equal, toItem: view, attribute: .leading, multiplier: 1.0, constant: 8)
        leading.isActive = true

        let trailingToSuperView = NSLayoutConstraint(item: buttonMessage, attribute: .trailing, relatedBy: .equal, toItem: view, attribute: .trailing, multiplier: 1, constant: -8)

        trailingToSuperView.priority = 998
        trailingToSuperView.isActive = true

        let bottomToSuperView = NSLayoutConstraint(item: buttonMessage, attribute: .bottom, relatedBy: .equal, toItem: view, attribute: .bottom, multiplier: 1, constant: -8)
        bottomToSuperView.isActive = true


        let trailingToWink = NSLayoutConstraint(item: buttonMessage, attribute: .trailing, relatedBy: .equal, toItem: buttonWink, attribute: .leading, multiplier: 1, constant: -8)
        trailingToWink.priority = 999
        trailingToWink.isActive = true

        let leadingToLike = NSLayoutConstraint(item: buttonMessage, attribute: .trailing, relatedBy: .equal, toItem: buttonLike, attribute: .leading, multiplier: 1.0, constant: -8)
        leadingToLike.isActive = true

        let alignBottomToWink = NSLayoutConstraint(item: buttonMessage, attribute: .bottom, relatedBy: .equal, toItem: buttonWink, attribute: .bottom, multiplier: 1, constant: 0)
        alignBottomToWink.isActive = true

        let alignBottomToLike = NSLayoutConstraint(item: buttonMessage, attribute: .bottom, relatedBy: .equal, toItem: buttonLike, attribute: .bottom, multiplier: 1, constant: 0)
        alignBottomToLike.isActive = true


        let equalWidthToWink = NSLayoutConstraint(item: buttonMessage, attribute: .width, relatedBy: .equal, toItem: buttonWink, attribute: .width, multiplier: 1, constant: 0)
        equalWidthToWink.isActive = true


        let equalWidthToLike = NSLayoutConstraint(item: buttonMessage, attribute: .width, relatedBy: .equal, toItem: buttonLike, attribute: .width, multiplier: 1, constant: 0)
        equalWidthToLike.isActive = true

        //Constraints for like button
        let trailingLikeToSuperView = NSLayoutConstraint(item: buttonLike, attribute: .trailing, relatedBy: .equal, toItem: view, attribute: .trailing, multiplier: 1, constant: -8)
        trailingLikeToSuperView.priority = 999
        trailingLikeToSuperView.isActive = true
        let leadingToWink = NSLayoutConstraint(item: buttonLike, attribute: .trailing, relatedBy: .equal, toItem: buttonWink, attribute: .leading, multiplier: 1.0, constant: -8)
        leadingToWink.isActive = true


        //Constraints for Wink button
        let trailingWinkToSuperView = NSLayoutConstraint(item: buttonWink, attribute: .trailing, relatedBy: .equal, toItem: view, attribute: .trailing, multiplier: 1, constant: -8)
        trailingWinkToSuperView.isActive = true

    }

}
Run Code Online (Sandbox Code Playgroud)

Fat*_*tie 5

仅供参考 -

只需使用堆栈视图即可。

这非常简单:这就是苹果几年前终于添加了堆栈概念的原因。

  • 如果您使用“UIStackView”,则不需要对按钮进行任何限制。您只需要对堆栈视图进行约束,然后可以将它们添加到故事板中。不要从超级视图中删除按钮。只需将其“hidden”属性设置为“true”即可。堆栈视图将自动调整可见按钮的大小以填充隐藏按钮留下的空间。 (2认同)