2012-12-15 20 views
5

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

、私はシンプルなストーリーボードに2つの未接続のView Controllerを持っている、とビューの変更アニメーション化するには、次のコードを使用している設定:

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

疑問は、なぜサブビューが滞在していないされ彼らはそれがアニメートとして彼らのスーパービューの内側にあると考えています。

答えて

3

は、特に場合は、所定の場所にサブビューを成長させるために:代わりにアニメーションブロックに表示枠を設定するので、私は窓と新しいビューとの間の制約を追加した場合、それが正しく動作するアニメーションブロックでlayoutIfNeededを呼び出しますAutolayoutを使うと、フレームの代わりにtransformプロパティをアニメーション化するほうがはるかに簡単です。この方法では、サブビューの境界プロパティは変更されないため、アニメーション中常にサブビューをリレーする必要はありません。

最終フレームでサブビューを追加し、その変換を、たとえば0.1のスケーリングアフィン変換に設定し、それを恒等変換にアニメートします。それは中心点から成長し、すべてのサブビューが正しい位置にあります。

+0

ありがとう、私は変換の経験があまりないので、私はそのやり方を忘れる傾向があります。私は読まなければならないと思う。 – rdelmar

1

問題はレイアウトの制約にありました。

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

'animateWithDuration:delay:options:animations:completion:'というフルフォームを使用している場合は、 'UIViewAnimationOptionLayoutSubviews'を渡すことができ、' layoutIfNeeded'を行います。 –

+0

@robmayoff、実際にはこの状況では機能しませんでした。そのオプションを含めるとアニメーションは表示されません。最終的な状態にジャンプします。 – rdelmar

関連する問題