如何显示隐藏的 UIButton?

Posted

技术标签:

【中文标题】如何显示隐藏的 UIButton?【英文标题】:How can I show a hidden 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 类别中的方法也可能会有所帮助。

【问题讨论】:

【参考方案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()
    

【讨论】:

非常感谢。多亏了这一点,我解决了我们长期以来一直在想的问题。

以上是关于如何显示隐藏的 UIButton?的主要内容,如果未能解决你的问题,请参考以下文章

如果点击 ScrollView,则隐藏/显示按钮和 UIImageVIew

隐藏 UIButton 标题

无法隐藏以编程方式创建的 UIButton? [关闭]

UIToolbar 隐藏后不显示

隐藏 UIButton 直到达到特定的点数

隐藏另一个类的自定义按钮