我正在尝试使用一个轻触信息按钮打开的infoView。见图:
我希望infoView与按下的按钮垂直对齐。 我有一个UIbutton集合。 这是我的代码:
@IBOutlet var infoButtons: [UIButton]!
@IBAction func infoButtonPressed(_ sender: UIButton) {
var alignYConstraint = NSLayoutConstraint()
switch sender.tag {
case 1:
alignYConstraint = NSLayoutConstraint(item: infoView, attribute: .centerY, relatedBy: .equal, toItem: infoButtons[0], attribute: .centerY, multiplier: 1.0, constant: 0)
NSLayoutConstraint.activate([alignYConstraint])
infoView.isHidden = false
infoView.textView.text = "Text goes here"
infoView.onClickCallback = {
self.infoView.isHidden = true
// self.infoView.removeFromSuperview()
NSLayoutConstraint.deactivate([alignYConstraint])
}
case 2:
alignYConstraint = NSLayoutConstraint(item: infoView, attribute: .centerY, relatedBy: .equal, toItem: infoButtons[1], attribute: .centerY, multiplier: 1.0, constant: 0)
NSLayoutConstraint.activate([alignYConstraint])
infoView.isHidden = false
infoView.textView.text = "Different text"
infoView.onClickCallback = {
self.infoView.isHidden = true
NSLayoutConstraint.deactivate([alignYConstraint])
}
....................
}
}
我有两个问题:
1)如果我点击关闭按钮一切都很完美,但是如果我在关闭infoView之前点击另一个信息按钮,那么我会有相互冲突的约束,视图将不会按要求对齐。我试图删除以前的约束......但显然我无法取得成功。
2)我试图关闭infoView,即使我点击infoView之外的任何地方,但同样的问题:冲突的约束和视图将不会与正确的按钮对齐
感谢您的帮助。
答案 0 :(得分:0)
我通过添加数组来解决。
我在类的开头初始化了一个数组(var constraint = NSLayoutConstraint),然后每次我点击数组中的约束时我都会添加。 每次我点击一个按钮,我都会检查数组是否为空。如果不是我删除约束。这是代码:
if sender.tag == 1{
if constraint.count > 0 {
NSLayoutConstraint.deactivate(constraint)
constraint.removeAll()
}
let alignYConstraint = NSLayoutConstraint(item: infoView, attribute: .centerY, relatedBy: .equal, toItem: infoButtons[0], attribute: .centerY, multiplier: 1.0, constant: 0)
NSLayoutConstraint.activate([alignYConstraint])
constraint.append(alignYConstraint)
infoView.isHidden = false
infoView.textView.text = "Text goes here"
infoView.onClickCallback = {
self.infoView.isHidden = true
//self.infoView.removeFromSuperview()
NSLayoutConstraint.deactivate([alignYConstraint])
}
}else if sender.tag == 2 {
if constraint.count > 0 {
NSLayoutConstraint.deactivate(constraint)
constraint.removeAll()
}
.............