如何防止 UILabel 比其他对象移动得更远
How to prevent UILabel from being moved further than other objects
我正在尝试移动带有动画的标签,但我希望它位于其他两个对象之间。我以为我可以用像
这样的 NSLayoutConstraints 来做到这一点
let labelLeftConstraint = NSLayoutConstraint(item: self.label, attribute: NSLayoutAttribute.Left, relatedBy: NSLayoutRelation.GreaterThanOrEqual, toItem: self.leftObject, attribute: NSLayoutAttribute.Right, multiplier: 1, constant: 0)
let labelRightConstraint = NSLayoutConstraint(item: self.label, attribute: NSLayoutAttribute.Right, relatedBy: NSLayoutRelation.LessThanOrEqual, toItem: self.rightObject, attribute: NSLayoutAttribute.Left, multiplier: 1, constant: 0)
let labelBottom = NSLayoutConstraint(item: self.label, attribute: NSLayoutAttribute.Bottom, relatedBy: NSLayoutRelation.Equal, toItem: self.bottomObject , attribute: NSLayoutAttribute.Top, multiplier: 1, constant: 0)
let labelCenterX = NSLayoutConstraint(item: self.label, attribute: NSLayoutAttribute.CenterX, relatedBy: NSLayoutRelation.Equal, toItem: self.movingObject, attribute: NSLayoutAttribute.CenterX, multiplier: 1, constant: 0)
label.setTranslatesAutoresizingMaskIntoConstraints(false)
self.view.addSubview(label)
self.view.addConstraints([labelLeftConstraint, labelRightConstraint, labelBottom, labelCenterX])
我正在尝试用
更新位置
UIView.animateWithDuration(0.5, delay: 0, options: UIViewAnimationOptions.CurveEaseOut, animations: { () -> Void in
self.movingObject.center = CGPoint(x: newX, y: newY)
self.view.updateConstraints()
}
但是当 movingObject
移动得太远时它会裁剪标签(这显然是有道理的,因为 labelCenterX
应该等于 movingObject
)。我怎样才能防止这种情况发生,而是仅将其移动到 leftObject
和 rightObject
的边缘?我需要类似 .LessEqualOrGreater
的关系...
我还尝试使用 .center
方法为标签设置动画,但我没有找到防止标签脱离两个对象的方法。
感谢您的帮助(我知道我可能问了一个愚蠢的问题,但我只是在学习 Swift)
编辑:
这是我的问题的屏幕截图:
movingObject 是自行车的图片,它从左到右以变化的速度移动,并且允许以超过栏的速度比标签走得更远。此标签应仅位于 0
和 30
-Label
之间
编辑 2:
工作代码在我的 Git repository
解决方案是创建所需的 leading/trailing 约束 >= 0 和具有较低优先级的 centerX 约束,然后将 centerX 常量更改为您需要的任何值。
我正在尝试移动带有动画的标签,但我希望它位于其他两个对象之间。我以为我可以用像
这样的 NSLayoutConstraints 来做到这一点 let labelLeftConstraint = NSLayoutConstraint(item: self.label, attribute: NSLayoutAttribute.Left, relatedBy: NSLayoutRelation.GreaterThanOrEqual, toItem: self.leftObject, attribute: NSLayoutAttribute.Right, multiplier: 1, constant: 0)
let labelRightConstraint = NSLayoutConstraint(item: self.label, attribute: NSLayoutAttribute.Right, relatedBy: NSLayoutRelation.LessThanOrEqual, toItem: self.rightObject, attribute: NSLayoutAttribute.Left, multiplier: 1, constant: 0)
let labelBottom = NSLayoutConstraint(item: self.label, attribute: NSLayoutAttribute.Bottom, relatedBy: NSLayoutRelation.Equal, toItem: self.bottomObject , attribute: NSLayoutAttribute.Top, multiplier: 1, constant: 0)
let labelCenterX = NSLayoutConstraint(item: self.label, attribute: NSLayoutAttribute.CenterX, relatedBy: NSLayoutRelation.Equal, toItem: self.movingObject, attribute: NSLayoutAttribute.CenterX, multiplier: 1, constant: 0)
label.setTranslatesAutoresizingMaskIntoConstraints(false)
self.view.addSubview(label)
self.view.addConstraints([labelLeftConstraint, labelRightConstraint, labelBottom, labelCenterX])
我正在尝试用
更新位置 UIView.animateWithDuration(0.5, delay: 0, options: UIViewAnimationOptions.CurveEaseOut, animations: { () -> Void in
self.movingObject.center = CGPoint(x: newX, y: newY)
self.view.updateConstraints()
}
但是当 movingObject
移动得太远时它会裁剪标签(这显然是有道理的,因为 labelCenterX
应该等于 movingObject
)。我怎样才能防止这种情况发生,而是仅将其移动到 leftObject
和 rightObject
的边缘?我需要类似 .LessEqualOrGreater
的关系...
我还尝试使用 .center
方法为标签设置动画,但我没有找到防止标签脱离两个对象的方法。
感谢您的帮助(我知道我可能问了一个愚蠢的问题,但我只是在学习 Swift)
编辑:
这是我的问题的屏幕截图:
movingObject 是自行车的图片,它从左到右以变化的速度移动,并且允许以超过栏的速度比标签走得更远。此标签应仅位于 0
和 30
-Label
编辑 2: 工作代码在我的 Git repository
解决方案是创建所需的 leading/trailing 约束 >= 0 和具有较低优先级的 centerX 约束,然后将 centerX 常量更改为您需要的任何值。