3

2 つの同時移動アニメーションを実行したい。最初のアニメーションfirstViewがすぐに開始されます。の2 番目のアニメーションsecondViewは、最初のアニメーションがまだ実行されている間に少し遅れて開始されます。secondView制約は に関連していfirstViewます。コードは iOS 8 で完全に機能します。

firstViewsecondViewのサブビューですview

view  
    |--- firstView  
    |--- secondView    

コード:

UIView *firstView = ...;
UIView *secondView = ...;    

[UIView animateWithDuration:0.5 delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
    NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:firstView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.topLayoutGuide attribute:NSLayoutAttributeBottom multiplier:1.0 constant:0];
    [self.view addConstraint:constraint];
    [self.view layoutIfNeeded];
} completion:^(BOOL finished) {
}];

[UIView animateWithDuration:0.5 delay:0.15 options:UIViewAnimationOptionCurveEaseInOut animations:^{
    NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:secondView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:firstView attribute:NSLayoutAttributeBottom multiplier:1.0 constant:0];
    [self.view addConstraint:constraint];
    [self.view layoutIfNeeded];
} completion:^(BOOL finished) {
}];

iOS 7 では、秒layoutIfNeededが呼び出されると、最初のアニメーションが停止し、秒のアニメーションのみがアニメーション化されます。

助言がありますか?

4

2 に答える 2

0

2 つの重要な注意事項:

  1. アニメーション ブロック内で layoutIfNeeded を呼び出す必要があります。Apple は、保留中のすべてのレイアウト操作が完了していることを確認するために、アニメーション ブロックの前に 1 回呼び出すことを実際に推奨しています。
  2. 制約が付加されている子ビューではなく、親ビュー (例: self.view) で具体的に呼び出す必要があります。そうすることで、制約を変更したビューに制約されている可能性のある他のビューをアニメーション化するなど、制約されたすべてのビューが更新されます (たとえば、ビュー B はビュー A の下部に接続されており、ビュー A の上部オフセットを変更したばかりで、ビュー B が必要です)。アニメーション化します)。

次のようにする必要があります。

[self.view layoutIfNeeded];

NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:firstView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.topLayoutGuide attribute:NSLayoutAttributeBottom multiplier:1.0 constant:0];
[self.view addConstraint:constraint];

[UIView animateWithDuration:0.5 delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
    [self.view layoutIfNeeded];
} completion:^(BOOL finished) {
}];
于 2015-02-17T10:12:20.083 に答える