作者:白羊黔中草 | 来源:互联网 | 2023-05-27 15:14
我将约束添加到我创建的按钮中 UIView
func CreateButtonWithIndex(index:Int) {
newButton.setTranslatesAutoresizingMaskIntoConstraints(false)
self.view.addSubview(newButton)
let newButtOnConstraintL= NSLayoutConstraint(item: newButton, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1.0, constant: 50)
let newButtOnConstraintH= NSLayoutConstraint(item: newButton, attribute: .Width, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1.0, constant: 50)
var newButtOnConstraintX= NSLayoutConstraint(item: newButton, attribute: .CenterX, relatedBy: .Equal, toItem: view, attribute: .CenterX, multiplier: 1, constant: CGFloat(riga))
var newButtOnConstraintY= NSLayoutConstraint(item: newButton, attribute: .CenterY, relatedBy: .Equal, toItem: view, attribute: .CenterY, multiplier: 1, constant: CGFloat(colonna))
view.addConstraints([newButtonConstraintX,newButtonConstraintY,newButtonConstraintH,newButtonConstraintL])
var pan = UIPanGestureRecognizer(target:self, action:"pan:")
pan.maximumNumberOfTouches = 2
pan.minimumNumberOfTouches = 1
newButton.addGestureRecognizer(pan)
}
func pan(rec:UIPanGestureRecognizer) {
case .Ended:
if let subview = selectedView {
if let button = rec.view as? UIButton {
if let title = button.titleForState(.Normal){
button.setTranslatesAutoresizingMaskIntoConstraints(false)
let line = Float(p.x % snapX)
let column = Float(p.x % snapY)
let cOnstraintL= NSLayoutConstraint(item: button, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1.0, constant: 50)
let cOnstraintH= NSLayoutConstraint(item: button, attribute: .Width, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1.0, constant: 50)
var constraint2 = NSLayoutConstraint(item: button, attribute: .CenterX, relatedBy: .Equal, toItem: view, attribute: .CenterX, multiplier: 1, constant: CGFloat(line))
var constraint3 = NSLayoutConstraint(item: button, attribute: .CenterY, relatedBy: .Equal, toItem: view, attribute: .CenterY, multiplier: 1, constant: CGFloat(column))
view.addConstraints([constraint2,constraint3,constraintL.constraintH])
}
}
}
}
在我的项目中,我的用户可以移动这些按钮然后我尝试向已识别的按钮添加更多约束,但我只是得到无限的错误约束
"",
"",
"",
""
将尝试通过打破约束来恢复
""
"",
"",
"",
""
将尝试通过打破约束来恢复
...我应该更新newButtonConstraintX/Y但是我不明白我该怎么做?
1> Rob..:
问题是您要添加与现有约束冲突的新约束.
你有几个选择:
在iOS 8中有效,您可以在添加新约束之前将active
属性设置false
为约束.
在8之前的iOS版本中,您需要在添加新约束之前删除旧约束.
理想情况下,最好不必激活/停用(或者更糟,添加和删除)约束,而只需修改constant
单个约束的属性.例如在Swift 3/4中:
class ViewController: UIViewController {
private var xConstraint: NSLayoutConstraint!
private var yConstraint: NSLayoutConstraint!
override func viewDidLoad() {
super.viewDidLoad()
let label = UILabel()
label.text = "x"
label.translatesAutoresizingMaskIntoCOnstraints= false
view.addSubview(label)
// I don't really need to save references to these, so these are local variables
let widthCOnstraint= label.widthAnchor.constraint(equalToConstant: 50)
let heightCOnstraint= label.heightAnchor.constraint(equalToConstant: 50)
// but since I'll be modifying these later, these are class properties
xCOnstraint= label.centerXAnchor.constraint(equalTo: view.centerXAnchor)
yCOnstraint= label.centerYAnchor.constraint(equalTo: view.centerYAnchor)
NSLayoutConstraint.activate([widthConstraint, heightConstraint, xConstraint, yConstraint])
let pan = UIPanGestureRecognizer(target: self, action: #selector(handlePan(_:)))
view.addGestureRecognizer(pan)
}
private var originalCenter: CGPoint!
@objc func handlePan(_ gesture: UIPanGestureRecognizer) {
if gesture.state == .began {
originalCenter = CGPoint(x: xConstraint.constant, y: yConstraint.constant)
}
let translation = gesture.translation(in: gesture.view!)
xConstraint.cOnstant= originalCenter.x + translation.x
yConstraint.cOnstant= originalCenter.y + translation.y
}
}
当通过修改constant
约束可以实现期望的效果时,这通常是最好的.
对于Swift 2语法,请参阅此答案的先前版本.