【问题标题】:How to update anchor constraint in swift如何快速更新锚约束
【发布时间】:2019-06-03 10:55:42
【问题描述】:

我想在 iOS 中创建一个类似 android 的菜单。我正在使用布局约束来设置约束。当我尝试在按钮单击时更新图像的左侧 constraint 时遇到了这个问题(它应该动画到单击按钮的位置)。谁能帮我? 它应该支持横向和纵向。

我不想使用第三方代码,也不想使用 NSLayoutconstraint

这是我的代码。

class MenuViewController: UIViewController {
            var buttons: [UIButton] = []
            var imageView : UIImageView!

            override func viewDidLoad() {
                super.viewDidLoad()
            }

            override func viewDidAppear(_ animated: Bool) {
                super.viewDidAppear(animated)
                addMenuItems()
            }

            func addMenuItems() {

                for _ in 0...4 {
                    let button : UIButton = UIButton()
                    self.view.addSubview(button)
                    button.backgroundColor = UIColor.darkGray
                    button.addTarget(self, action: #selector(didSelectedButton(_:)), for: .touchUpInside)
                    self.buttons.append(button)

                }

                for (index, button) in buttons.enumerated() {

                    button.setTitle(" \(index)", for: .normal)
                    if index == 0 {
                        button.translatesAutoresizingMaskIntoConstraints = false
                        button.leftAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.leftAnchor, constant: 0).isActive = true
                        button.widthAnchor.constraint(greaterThanOrEqualToConstant: 1).isActive = true
                        button.heightAnchor.constraint(equalToConstant: 50).isActive = true
                        button.topAnchor.constraint(equalTo: self.view.topAnchor, constant:200).isActive = true

                        self.imageView = UIImageView()
                        self.view.addSubview(self.imageView)
                        self.imageView.backgroundColor = UIColor.red

                        self.imageView.translatesAutoresizingMaskIntoConstraints = false
                        self.imageView.leftAnchor.constraint(equalTo: button.leftAnchor, constant: 0).isActive = true
                        self.imageView.widthAnchor.constraint(equalTo: button.widthAnchor, multiplier: 1).isActive = true
                        self.imageView.heightAnchor.constraint(equalToConstant: 4).isActive = true
                        self.imageView.topAnchor.constraint(equalTo: self.view.topAnchor, constant:250).isActive = true

                    }
                    else {

                        let preButton = buttons\[index - 1\]
                        button.translatesAutoresizingMaskIntoConstraints = false
                        button.leftAnchor.constraint(equalTo: preButton.rightAnchor, constant: 0).isActive = true
                        button.widthAnchor.constraint(equalTo: preButton.widthAnchor, multiplier: 1).isActive = true
                        button.heightAnchor.constraint(equalToConstant: 50).isActive = true
                        button.topAnchor.constraint(equalTo: self.view.topAnchor, constant:200).isActive = true
                        if index == self.buttons.count - 1 {
                            button.rightAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.rightAnchor, constant: 0).isActive = true
                        }
                    }

                }

            }

            @objc func didSelectedButton(_ button:UIButton) {
                UIView.animate(withDuration: 1, animations: {
                    self.imageView.leftAnchor.constraint(equalTo: button.leftAnchor).isActive = true
                    self.imageView.layoutIfNeeded()
                }, completion: nil)
            }

        }

【问题讨论】:

    标签: ios swift nslayoutanchor layout-anchor


    【解决方案1】:

    使用锚点创建NSLayoutContraints。您需要在创建新的时停用以前的。

    将此属性添加到您的MenuViewController

    var imageLeftConstraint: NSLayoutConstraint?
    

    在你第一次创建约束时设置它:

    imageLeftConstraint = self.imageView.leftAnchor.constraint(equalTo: button.leftAnchor, constant: 0)
    imageLeftConstraint?.isActive = true
    

    然后在添加新约束之前使用它来停用先前的约束:

    @objc func didSelectedButton(_ button:UIButton) {
        imageLeftConstraint?.isActive = false
        imageLeftConstraint = self.imageView.leftAnchor.constraint(equalTo: button.leftAnchor)
        imageLeftConstraint?.isActive = true
        UIView.animate(withDuration: 1, animations: {
            self.view.layoutIfNeeded()
        }, completion: nil)
    }
    

    注意:您需要在imageView(又名self.view)的superView 上调用layoutIfNeeded(),因为buttonimageView 之间的约束将被添加到它们的共同祖先(self.view)。

    【讨论】:

    • 这个我做了,有没有其他方法?感谢 vacawama 和 vikas
    • 您对这种方式有何反对?
    • 没什么,只需要所有的解决方案。无论如何感谢您的支持,得到了解决方案。
    猜你喜欢
    • 2016-12-30
    • 1970-01-01
    • 1970-01-01
    • 2020-04-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-28
    • 2013-08-06
    • 1970-01-01
    相关资源
    最近更新 更多