6

古いビューの中心から新しいビューを拡大し、そのビューがフェードアウトする単純なアニメーションがあります。ただし、この新しいビューのサブビュー (ボタンとラベル) は、新しいビューが拡大して画面全体を占めるようになると、画面の右下から「フライ」インします。autolayout をオンにして、またはオフにして試してみましたが、2 つのシナリオで異なる結果が得られますが、どちらも間違っています。

セットアップは簡単です。ストーリーボードに 2 つの接続されていないビュー コントローラーがあり、次のコードを使用してビューの変更をアニメーション化します。

-(void)switchViews2:(id)sender {
    UIWindow *win = self.view.window;
    YellowController *yellow = [self.storyboard instantiateViewControllerWithIdentifier:@"Yellow"];
    yellow.view.frame = CGRectMake(0, 0, 1, 1);
    yellow.view.center = self.view.center;
    [win addSubview:yellow.view];
    CGRect  frame = self.view.frame;
    [UIView animateWithDuration:5 animations:^{
        yellow.view.frame = frame;
        self.view.alpha = 0;
    }
             completion:^(BOOL finished) {
                 [self.view removeFromSuperview];
                 win.rootViewController = yellow;
         }];
}

問題は、サブビューがアニメーション化されているときに、サブビューがスーパービュー内の本来あるべき場所にとどまらない理由です。

4

2 に答える 2

3

特に Autolayout を使用する場合、サブビューを適切な位置に拡大するには、フレームの代わりに変換プロパティをアニメーション化する方がはるかに簡単です。このように、サブビューの境界プロパティは変更されないため、アニメーション中に常にサブビューを中継する必要はありません。

サブビューを最終フレームに追加し、その変換を 0.1 などのスケーリング アフィン変換に設定してから、恒等変換にアニメーション化します。すべてのサブビューが正しい位置にある状態で、中心点から成長します。

于 2012-12-15T08:24:12.813 に答える
1

問題はレイアウトの制約にありました。アニメーションブロックでビューフレームを設定する代わりに、ウィンドウと新しいビューの間に制約を追加してから、アニメーションブロックでlayoutIfNeededを呼び出すと、正しく機能します。

-(void)switchViews2:(id)sender {
    UIWindow *win = self.view.window;
    YellowController *yellow = [self.storyboard instantiateViewControllerWithIdentifier:@"Yellow"];
    [yellow.view setTranslatesAutoresizingMaskIntoConstraints:NO];
    yellow.view.frame = CGRectMake(0, 0, 1, 1);
    yellow.view.center = self.view.center;
    [win addSubview:yellow.view];

    NSLayoutConstraint *con1 = [NSLayoutConstraint constraintWithItem:yellow.view attribute:NSLayoutAttributeLeading relatedBy:0 toItem:win attribute:NSLayoutAttributeLeading multiplier:1 constant:0];
    NSLayoutConstraint *con2 = [NSLayoutConstraint constraintWithItem:yellow.view attribute:NSLayoutAttributeTop relatedBy:0 toItem:win attribute:NSLayoutAttributeTop multiplier:1 constant:20];
    NSLayoutConstraint *con3 = [NSLayoutConstraint constraintWithItem:yellow.view attribute:NSLayoutAttributeTrailing relatedBy:0 toItem:win attribute:NSLayoutAttributeTrailing multiplier:1 constant:0];
    NSLayoutConstraint *con4 = [NSLayoutConstraint constraintWithItem:yellow.view attribute:NSLayoutAttributeBottom relatedBy:0 toItem:win attribute:NSLayoutAttributeBottom multiplier:1 constant:0];

    [win addConstraints:@[con1,con2,con3,con4]];

    [UIView animateWithDuration:1 animations:^{
        [win layoutIfNeeded];
        self.view.alpha = 0;
    }
             completion:^(BOOL finished) {
                 [self.view removeFromSuperview];
                 win.rootViewController = yellow;
         }];
}
于 2012-12-15T07:05:18.630 に答える