使用约束向目标移动按钮,没有反应?

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 移动?约束问题?

以编程方式使用约束 Swift 移动按钮

添加到 UIScrollView 时 UIButton 不滚动

使用带有自动布局的推送时隐藏按钮时,约束更新导致项目移动

使用带有约束的持续时间动画快速移动按钮并在其中检测触摸

如何正确设置 4s 的自动布局约束?