以编程方式将约束重置为屏幕位置

时间:2017-06-03 19:11:06

标签: ios iphone swift constraints

目前,我有一个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手势。

1 个答案:

答案 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