gpt4 book ai didi

ios - 如何动态更新约束?

转载 作者:行者123 更新时间:2023-11-28 09:52:00 25 4
gpt4 key购买 nike

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

 buttonWink.translatesAutoresizingMaskIntoConstraints = false

当然,因为 buttonWink 已从 superview 中删除,但是我们可以在将约束设置为

之前进行检查
  if buttonWink != nil {
buttonWink.translatesAutoresizingMaskIntoConstraints = false
}

但是通过为每个按钮检查 nil 会使代码冗长,有什么办法可以做到这一点吗?我会非常感谢 friend 。

输出-

enter image description here

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

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

}

}

最佳答案

仅供引用 -

为此简单地使用堆栈 View 。

这非常简单:这就是 Apple 最终在几年前添加堆栈概念的原因。

关于ios - 如何动态更新约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45419314/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com