【问题标题】:How can I show a hidden UIButton?如何显示隐藏的 UIButton?
【发布时间】:2018-05-23 05:09:49
【问题描述】:

视图是使用代码放置的。 如果我按下deleteButton(按钮),我希望隐藏按钮(imgButton)出现。

但是imgView的宽度是不刷新的。

MainViewController.swift

import UIKit

class MainViewController: UIViewController {

    var trashIsSelected: Bool!

    let imgButton: UIButton = {
        let imgView = UIButton()
        imgView.setImage(UIImage(named: "schedule_delete_icon"), for: UIControlState.normal)
    //        imgView.imageView?.image = UIImage(named: "schedule_delete_icon")
        imgView.translatesAutoresizingMaskIntoConstraints = false
        return imgView
    }()

    let deleteButton: UIButton = {
       let imgBtn = UIButton()
        imgBtn.setImage(UIImage(named: "icon_delete"), for: UIControlState.normal)
    //        imgBtn.imageView?.image = UIImage(named: "icon_delete")
        imgBtn.translatesAutoresizingMaskIntoConstraints = false
        return imgBtn
    }()

    let label: UILabel = {
        let label = UILabel()
        label.translatesAutoresizingMaskIntoConstraints = false
        label.text = "하ㅣㅇ하이히아히아하하하하ㅏㅎ하ㅏㅎ하ㅏ하하하하ㅏㅏ하하하하하ㅏ"
        return label
    }()


    var imgViewWidth: NSLayoutConstraint!

    override func viewDidLoad() {
        super.viewDidLoad()

        setupLayout()
    }


    func setupLayout(){
        let testView = UIScrollView()

        self.view.addSubview(testView)
        testView.backgroundColor = .lightGray
        testView.translatesAutoresizingMaskIntoConstraints = false
        testView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor).isActive = true
        testView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor).isActive = true
        testView.topAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.topAnchor).isActive = true
        testView.heightAnchor.constraint(equalTo: self.view.heightAnchor, multiplier: 0.3).isActive = true

        testView.addSubview(imgButton)
        testView.addSubview(label)
        imgButton.leadingAnchor.constraint(equalTo: testView.leadingAnchor, constant: 10).isActive = true
        imgButton.centerYAnchor.constraint(equalTo: testView.centerYAnchor).isActive = true
        imgButton.heightAnchor.constraint(equalTo: testView.heightAnchor, multiplier: 0.2).isActive = true
        imgButton.widthAnchor.constraint(equalTo: imgButton.heightAnchor, multiplier: 0).isActive = true
        imgButton.isHidden = true
        trashIsSelected = false

        label.centerYAnchor.constraint(equalTo: testView.centerYAnchor).isActive = true
        label.leadingAnchor.constraint(equalTo: imgButton.trailingAnchor, constant: 10).isActive = true
        label.heightAnchor.constraint(equalTo: testView.heightAnchor, multiplier: 0.2).isActive = true
        label.widthAnchor.constraint(equalTo: testView.widthAnchor, multiplier: 0.5).isActive = true




        self.view.addSubview(deleteButton)
        deleteButton.leadingAnchor.constraint(equalTo: self.view.leadingAnchor).isActive = true
        deleteButton.bottomAnchor.constraint(equalTo: self.view.bottomAnchor).isActive = true
        deleteButton.addTarget(self, action: #selector(self.addBtnAction(_:)), for: UIControlEvents.touchUpInside)
    }

    @objc func addBtnAction(_ sender: UIButton){
        print("hi")
        if trashIsSelected == false{
            trashIsSelected = true
            imgButton.isHidden = false
            imgButton.widthAnchor.constraint(equalToConstant: 50).isActive = true
            imgButton.updateConstraints()

        }else{
            trashIsSelected = false
            imgButton.widthAnchor.constraint(equalToConstant: 0).isActive = true
            imgButton.isHidden = true
            imgButton.updateConstraints()
        }
    }
}

这是错误信息:

2018-05-23 14:00:47.697959+0900 测试[67488:4887863] [LayoutConstraints] 无法同时满足约束。 以下列表中的至少一个约束可能是您不想要的。 试试这个: (1)查看每个约束并尝试找出您不期望的; (2) 找到添加了一个或多个不需要的约束的代码并修复它。 ( "", “” ) 将尝试通过打破约束来恢复 在 UIViewAlertForUnsatisfiableConstraints 创建一个符号断点以在调试器中捕获它。 中列出的 UIView 上的 UIConstraintBasedLayoutDebugging 类别中的方法也可能会有所帮助。

【问题讨论】:

    标签: ios swift autolayout


    【解决方案1】:

    您正在向按钮添加与旧约束冲突的新约束(一个按钮怎么可能是 0 磅宽,同时又是 50 磅宽?)。要使其工作,您需要在激活新约束之前关闭旧约束。我建议创建一个始终保持当前imgButton 约束的属性,然后当您想要更改它时,只需使用它(关闭它并创建一个新的,或者只是设置一个常量,在您的案例更好更​​容易):

    import UIKit
    
    class MainViewController: UIViewController {
    
        // property referencing current imgButton width constraint
        fileprivate var imgButtonWidthConstraint: NSLayoutConstraint!
    
        var trashIsSelected: Bool!
    
        let imgButton: UIButton = {
            let imgView = UIButton()
            imgView.setImage(UIImage(named: "schedule_delete_icon"), for: UIControlState.normal)
            //        imgView.imageView?.image = UIImage(named: "schedule_delete_icon")
            imgView.translatesAutoresizingMaskIntoConstraints = false
            return imgView
        }()
    
        let deleteButton: UIButton = {
            let imgBtn = UIButton()
            imgBtn.setImage(UIImage(named: "icon_delete"), for: UIControlState.normal)
            //        imgBtn.imageView?.image = UIImage(named: "icon_delete")
            imgBtn.translatesAutoresizingMaskIntoConstraints = false
            return imgBtn
        }()
    
        let label: UILabel = {
            let label = UILabel()
            label.translatesAutoresizingMaskIntoConstraints = false
            label.text = "하ㅣㅇ하이히아히아하하하하ㅏㅎ하ㅏㅎ하ㅏ하하하하ㅏㅏ하하하하하ㅏ"
            return label
        }()
    
    
        var imgViewWidth: NSLayoutConstraint!
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            setupLayout()
        }
    
    
        func setupLayout(){
            let testView = UIScrollView()
    
            self.view.addSubview(testView)
            testView.backgroundColor = .lightGray
            testView.translatesAutoresizingMaskIntoConstraints = false
            testView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor).isActive = true
            testView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor).isActive = true
            testView.topAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.topAnchor).isActive = true
            testView.heightAnchor.constraint(equalTo: self.view.heightAnchor, multiplier: 0.3).isActive = true
    
            testView.addSubview(imgButton)
            testView.addSubview(label)
            imgButton.leadingAnchor.constraint(equalTo: testView.leadingAnchor, constant: 10).isActive = true
            imgButton.centerYAnchor.constraint(equalTo: testView.centerYAnchor).isActive = true
            imgButton.heightAnchor.constraint(equalTo: testView.heightAnchor, multiplier: 0.2).isActive = true
    
            // keep the reference to constraint that defines width
            // (we will use the constraint setting the width to constant, since then you can
            // simply switch the constant between 0 and 50):
            imgButtonWidthConstraint = imgButton.widthAnchor.constraint(equalToConstant: 0)
            imgButtonWidthConstraint.isActive = true
    
            imgButton.isHidden = true
            trashIsSelected = false
    
            label.centerYAnchor.constraint(equalTo: testView.centerYAnchor).isActive = true
            label.leadingAnchor.constraint(equalTo: imgButton.trailingAnchor, constant: 10).isActive = true
            label.heightAnchor.constraint(equalTo: testView.heightAnchor, multiplier: 0.2).isActive = true
            label.widthAnchor.constraint(equalTo: testView.widthAnchor, multiplier: 0.5).isActive = true
    
    
    
    
            self.view.addSubview(deleteButton)
            deleteButton.leadingAnchor.constraint(equalTo: self.view.leadingAnchor).isActive = true
            deleteButton.bottomAnchor.constraint(equalTo: self.view.bottomAnchor).isActive = true
            deleteButton.addTarget(self, action: #selector(self.addBtnAction(_:)), for: UIControlEvents.touchUpInside)
        }
    
        @objc func addBtnAction(_ sender: UIButton){
            print("hi")
            if trashIsSelected == false{
                trashIsSelected = true
                imgButton.isHidden = false
    
                // just change the constant to what you want
                imgButtonWidthConstraint.constant = 50
    
                imgButton.updateConstraints()
    
            } else {
                trashIsSelected = false
    
                imgButtonWidthConstraint.constant = 0
    
                imgButton.isHidden = true
                imgButton.updateConstraints()
            }
        }
    }
    

    编辑:

    为了回答的完整性,如果您出于某种原因使用约束而更改常量还不够,则必须激活和停用约束。例如,如果您使用multiplier 来确定@​​987654324@ 的宽度,则必须使用这种方法(乘数是NSLayoutConstraint 的不可变属性)。因此,创建一个约束:

    // simply switch the constant between 0 and 50):
    imgButtonWidthConstraint = imgButton.widthAnchor.constraint(equalTo: someOtherView.widthAnchor, multiplier: 0)
    imgButtonWidthConstraint.isActive = true
    

    然后在addBtnAction 你必须这样做:

    @objc func addBtnAction(_ sender: UIButton){
        print("hi")
        if trashIsSelected == false{
            trashIsSelected = true
            imgButton.isHidden = false
    
            // first deactivate current constraint
            imgButtonWidthConstraint.isActive = false
            // then create a new one and store it to imgButtonWidthConstraint property (the old one is deactivated, so you don't need a reference to it anymore)
            imgButtonWidthConstraint = imgButton.widthAnchor.constraint(equalTo: someOtherView.widthAnchor, multiplier: 0.75)
            // and activate the new one
            imgButtonWidthConstraint.isActive = true
    
            imgButton.updateConstraints()
    
        } else {
            trashIsSelected = false
    
            // same process again
            imgButtonWidthConstraint.isActive = false
            imgButtonWidthConstraint = imgButton.widthAnchor.constraint(equalTo: someOtherView.widthAnchor, multiplier: 0)
            imgButtonWidthConstraint.isActive = true
    
            imgButton.isHidden = true
            imgButton.updateConstraints()
        }
    }
    

    【讨论】:

    • 非常感谢。多亏了这一点,我解决了我们长期以来一直在想的问题。
    猜你喜欢
    • 2018-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-18
    • 1970-01-01
    相关资源
    最近更新 更多