2014-12-21 45 views
0

我想紅色按鈕,朝第二個按鈕的領先地位是動畫:使用約束向目標移動按鈕,沒有反應?

enter image description here

一些例子說明了如何改變「常量」與數字,但我想在自動放第二個按鈕的領先地位。

這個我試過,但紅色按鈕不動,動畫記錄,雖然是正確調用:

- (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]; 
    }]; 
} 
+0

是完美的,非常感謝你Ganesh – Paul

1

我通常做這種情況如下。

在場景中添加兩個約束。一個在按鈕和「一個」標籤之間對齊的位置。第二,它在按鈕和「第二」標籤之間左對齊(即兩個值都將爲0)。這些限制最初會相互衝突,沒關係。

IBOutlets添加到您的視圖控制器的NSLayoutConstraints並將我們創建的兩個約束指定給IBOutlets

將您的初始條件的約束優先級設置爲999(即,左對齊爲「1」的約束應該爲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

非常感謝,你怎麼添加新的約束,而無需修改在故事板的第一個?在底部的圖標中,「領導等的新約束」不能被選擇。 – Paul

+1

啊,是的,通常當我添加約束時,我只需控制兩個元素之間的點擊和拖動。所以你可以控制+點擊按鈕並拖動到「秒」來添加一個新的約束。然後選擇約束並將其設置爲0,並將這兩個元素的值設置爲「前導」。 @Paul –

+0

非常感謝桑迪,我使用了Ganesh代碼的小小差異,但我始終銘記您的解決方案!非常感謝您的答案 – Paul