2

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 の上部制約を追加し、他の制約 (幅や高さなど) には触れませんでした。

4

2 に答える 2

1

NSLayoutConstraintは、制約する 1 つまたは 2 つのビューがあります。あなたの場合、ビューはself.logoImageViewself.viewです。

何らかの効果を得るには、ビューだけでなく、ビューに制約をインストールする必要があります。制約は、両方の制約付きビューの共通の祖先にインストールする必要があります。(ビューはそれ自体の先祖と見なされることに注意してください。) また、制約を削除する場合は、それがインストールされているビューから削除する必要があります

からセンタリング拘束を削除しようとしていますself.logoImageViewが、拘束がそのビューにインストールされていない可能性があります。

iOS 8.0 の時点で、制約をアンインストールするための推奨される (そして最も簡単な) 方法は、そのactiveプロパティをに設定することNOです。

self.logoImageViewYCenterConstraint.active = NO;

iOS 8.0 より前では、インストールされているビューから削除する必要があります。制約はおそらく にインストールされていself.viewます。代わりにこれを試してください:

[self.view removeConstraint:self.logoImageViewYCenterConstraint];

画像ビューをアニメーション化して中央に戻したい場合は、 をアンインストールtopSpaceConstraintして再インストールする必要があることにも注意してくださいself.logoImageViewYCenterConstraint

これを処理する別の方法は、両方の制約を同時にインストールし、一方の優先度を低くすることです。イメージ ビューの位置を変更する必要がある場合は、制約の優先順位を変更します。したがって:

- (void)viewDidLoad {
    [super viewDidLoad];
    if (self.topSpaceConstraint == nil) {
        self.topSpaceConstraint = [NSLayoutConstraint constraintWithItem:...];
        self.topSpaceConstraint.priority = 1;
        [self.view addConstraint:self.topSpaceConstraint];
    }
}

- (void)setImageViewCenteredVertically:(BOOL)isCentered animated:(BOOL)animated {
    if (isCentered) {
        self.topSpaceConstraint.priority = 1;
        self.logoImageViewYCenterConstraint.priority = UILayoutPriorityRequired;
    } else {
        self.topSpaceConstraint.priority = UILayoutPriorityRequired;
        self.logoImageViewYCenterConstraint.priority = 1;
    }

    if (animated) {
        [UIView animateWithDuration:1 delay:0
            options:UIViewAnimationOptionCurveEaseInOut | UIViewAnimationOptionAllowUserInteraction
            animations:^{
                [self.view layoutIfNeeded];
            }
            completion:nil];
    }
}
于 2013-08-07T21:04:26.440 に答える
0

私は の達人ではありませんが、オブジェクトNSLayoutConstraintsにコンストレイントを追加するか、パラメータを変更する必要があります。imageView から制約を削除してから、項目を参照するオブジェクトに制約を追加していますlogoImageViewconstraintWithItem:self.viewself.view

于 2013-08-07T21:03:25.560 に答える