目前,我有一个Pan Gesture,通过使用以下内容不断更改图像的中心来移动UIImageView:
if let view = recognizer.view {
view.center = CGPoint(x:view.center.x + translation.x,
y:view.center.y + translation.y)
}
我还想每秒更改文本标签(计时器),这会因为自动布局格式而将移动的UIImageView重置为默认约束。我已经看到移动UIImageViews的正确方法是改变UIImageView的约束而不是中心。有没有办法改变UIImageView的约束以适应图像的当前位置?我尝试使用
view.updateConstraints()
但是没有解决它。理想情况下,它的行为类似于"重置为建议的约束"在storyboard上手动设置约束时的选项,但在ViewController类中使用。我试图避免将所有约束设置为IBOutlets并对其进行编辑,因为我有很多具有多个约束的图像和需要修改的多个Pan手势。
答案 0 :(得分:0)
我认为没有办法自动重置建议的约束。您可以通过更新约束中的常量来手动完成。
您不能将位置约束设置为等于常量,因此您需要从相对于另一个对象的约束开始并修改它们。例如,将中心设置为与超视图的中心匹配,然后更改常量以将其移动以匹配当前状态。
要做到这一点,您需要引用约束。您可以在Interface Builder中创建NSLayoutConstraints
并使用IBOutlets
链接到它们,或者只是以编程方式创建它们。对于后者,将它们声明为视图控制器的实例属性,然后在viewDidLoad()
中创建它们,如下所示:
horizontalConstraint = NSLayoutConstraint(item: x.view, attribute: .centerX, relatedBy: .equal, toItem: x.view.superview, attribute: .centerX, multiplier: 1, constant: 0)
verticalConstraint = NSLayoutConstraint(item: x.view, attribute: .centerY, relatedBy: .equal, toItem: x.view.superview, attribute: .centerY, multiplier: 1, constant: 0)
x.view.superview.addConstraints([horizontalConstraint, verticalConstraint])
如果要更新它们,只需更改常量:
let superview = x.view.superview
let currentOffsetX = x.view.center.x - superview.center.x
let currentOffsetY = x.view.center.y - superview.center.y
horizontalConstraint.constant = currentOffsetX
verticalConstraint.constant = currentOffsetY