使用约束向目标移动按钮,没有反应?
Posted
技术标签:
【中文标题】使用约束向目标移动按钮,没有反应?【英文标题】:move button towards target using constraints, no reaction? 【发布时间】:2014-12-21 20:22:26 【问题描述】:我希望红色按钮朝第二个按钮的前导位置移动:
一些例子展示了如何用数字改变“常数”,但我想自动放在第二个按钮的前导位置。
我试过了,但是红色按钮没有移动,但是动画日志被正确调用了:
- (void)updateConstr
NSLayoutConstraint *newLeading = [NSLayoutConstraint
constraintWithItem:self.redB
attribute:NSLayoutAttributeLeading
relatedBy:NSLayoutRelationEqual
toItem:self.secondButton
attribute:NSLayoutAttributeLeading
multiplier:1.0
constant:0.0f];
self.leadingConstraint = newLeading;//is an IBOutlet pointing on the constraint (see the image)
[self.redB setNeedsUpdateConstraints];
[UIView animateWithDuration:0.5 animations:^
[self.redB layoutIfNeeded];
NSLog(@"animations");//is called, but the red button does not move
];
- (IBAction)firstAction:(id)sender //after a click on button "one"
NSLog(@"firstAction");
[self updateConstr];
【问题讨论】:
【参考方案1】:必须这样做:
- (void)updateConstr
NSLayoutConstraint *newLeading = [NSLayoutConstraint
constraintWithItem:self.redB
attribute:NSLayoutAttributeLeading
relatedBy:NSLayoutRelationEqual
toItem:self.secondButton
attribute:NSLayoutAttributeLeading
multiplier:1.0
constant:0.0f];
[self.redB.superview removeConstraint: self.leadingConstraint];
[self.redB.superview addConstraint: newLeading];
self.leadingConstraint = newLeading;
[UIView animateWithDuration:0.5 animations:^
[self.redB layoutIfNeeded];
];
【讨论】:
【参考方案2】:在这种情况下我通常会做以下事情。
为您的场景添加两个约束。一个在按钮和“一”标签之间左对齐的位置。第二个,它在按钮和“第二个”标签之间左对齐(即两个值都是 0)。这些约束最初会相互冲突,这很好。
将IBOutlets
添加到NSLayoutConstraints
的视图控制器,并将我们创建的两个约束分配给IBOutlets
。
将初始条件的约束优先级设置为 999(即,左对齐到“一”的约束应为 999)。将目标约束上的约束优先级设置为 998(即按钮到“第二”之间左对齐的约束为 998)。您现在将看到这些约束将不再冲突。这是因为一个约束的优先级高于另一个。
您现在可能会看到它的发展方向。因此,当您想在约束之间为按钮设置动画时,请交换优先级并进行动画处理!
代码:
@interface MyViewController ()
@property (nonatomic, weak) NSLayoutConstraint* constraint0;
@property (nonatomic, weak) NSLayoutConstraint* constraint1;
@end
- (void)someMethodWhereIWantToAnimate
NSInteger temp = constraint0.priority;
constraint0.priority = constraint1.priority;
constraint1.priority = temp;
[UIView animateWithDuration:1.0 animations:^
// Simplest is to use the main ViewController's view
[self.view layoutIfNeeded];
];
【讨论】:
非常感谢,如何在不修改情节提要中的第一个约束的情况下添加新约束?使用底部的图标,“领先等的新约束”。无法选择。 啊,是的,通常当我添加约束时,我只是控制两个元素之间的单击和拖动。因此,您可以控制+单击按钮并拖动到“第二个”以添加新约束。然后选择约束并将它的常量设置为 0,并将两个元素的值设置为“领先”。 @保罗 非常感谢桑迪,我使用了 Ganesh 代码的细微差别,但我牢记您的解决方案!非常感谢您的回答 @Paul 很高兴你成功了。我的解决方案的一件好事是没有硬编码的值。 IB 中的所有内容都是可修改的,因此您无需在代码中搜索幻数即可更新。以上是关于使用约束向目标移动按钮,没有反应?的主要内容,如果未能解决你的问题,请参考以下文章
Swift:锁定按钮位置,因为它正在被 UITextview 移动?约束问题?