UIImageView と親 UIView の上部との間の距離に、垂直方向と水平方向のセンタリングなしで制約を使用すると、アニメーション自体が機能します。
UIImageView の制約:
- 幅: 240
- 身長:128
- トップ レイアウトのトップ スペース: 200 --> logoImageViewVerticalSpaceConstraint に接続
これを使用すると、アニメーションがうまく機能します。
self.logoImageViewVerticalSpaceConstraint.constant = 20;
[UIView animateWithDuration: 1.0
delay: 0
options:(UIViewAnimationOptionCurveEaseInOut|UIViewAnimationOptionAllowUserInteraction)
animations:^{[self.logoImageView layoutIfNeeded];}
completion:^(BOOL finished) {NSLog(@"Finished animation"); }];
この問題は、3.5 および 4 インチのデバイスでは画像ビューを中央に配置する必要があるため、上部レイアウト制約に静的なスペースを使用したくない場合に発生します。これを解決するために、垂直方向と水平方向の中心の制約から始めることを考えました。
- 幅: 240
- 身長:128
- センター x を次のように揃えます: スーパービュー --> logoImageViewYCenterConstraint に接続
- 中心 y を次の位置に揃えます: スーパービュー
ここで、y 中心の制約を単純に削除し、20pt の上部レイアウト制約にスペースを追加するだけでよいと考えました。
[self.logoImageView removeConstraint:self.logoImageViewYCenterConstraint];
NSLayoutConstraint *topSpaceConstraint = [NSLayoutConstraint
constraintWithItem:self.view attribute:NSLayoutAttributeTop
relatedBy:NSLayoutRelationEqual toItem:self.logoImageView
attribute:NSLayoutAttributeTop multiplier:1
constant:20];
[self.view addConstraint:topSpaceConstraint];
[UIView animateWithDuration: 1.0
delay: 0
options:(UIViewAnimationOptionCurveEaseInOut|UIViewAnimationOptionAllowUserInteraction)
animations:^{
[self.logoImageView layoutIfNeeded];
}
completion:^(BOOL finished) {
NSLog(@"Finished animate");
}];
その結果、UIImageView は中央にとどまり、少し爆発します。これは、x 中心の制約を削除したために起こると予想されることとは正反対です。親 UIView の上部に距離 20pt の上部制約を追加し、他の制約 (幅や高さなど) には触れませんでした。