Как я могу показать скрытый UIButton? - PullRequest
0 голосов
/ 23 мая 2018

Просмотры были размещены с использованием кода.Если я нажму 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 Test[67488:4887863] [LayoutConstraints] Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want. 
Try this: 
    (1) look at each constraint and try to figure out which you don't expect; 
    (2) find the code that added the unwanted constraint or constraints and fix it. 

(
    "",
    ""
)

Will attempt to recover by breaking constraint 


Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in  may also be helpful.

1 Ответ

0 голосов
/ 23 мая 2018

Вы добавляете новые ограничения для кнопки, которые конфликтуют со старыми (как кнопка может иметь ширину 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 для определения ширины imgButton, вам пришлось бы использовать этот подход (множитель является неизменным свойством 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()
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...