1

iTunes iPad アプリで見られるフリップ アニメーションをシミュレートしようとしています。メインの注目ページで、New Releases リストの小さなポスターの 1 つをタップすると、そのポスターが開き、映画の詳細がすべて表示されます。

ポスターがタップされたら、次のようにします。

//...create newView

[self.view addSubview:poster]; //because the poster was previously in a scrollview

[UIView transitionWithView:self.view duration:3
                   options:UIViewAnimationOptionTransitionFlipFromLeft animations:^{
                       [poster removeFromSuperview];
                       [self.view addSubview:newView];
                   }
                completion:NULL];

しかし... ポスターだけでなく、ビュー全体が反転します。また、FlipFromLeft を指定したにもかかわらず、水平方向ではなく垂直方向に反転します。私は何を間違っていますか?

編集:これを行うには、ある種のコンテナビューを使用する必要があるようです。だから私はそれを作成し、それにポスターを追加してから、テスト用のダミー UIView を作成しました:

CGPoint newPoint = [self.view convertPoint:CGPointMake(poster.frame.origin.x, poster.frame.origin.y) fromView:[poster superview]];
poster.frame = CGRectMake(0, 0, poster.frame.size.width, poster.frame.size.height);

UIView *containerView = [[UIView alloc] initWithFrame:CGRectMake(newPoint.x, newPoint.y, poster.frame.size.width, poster.frame.size.height)];
[self.view addSubview:containerView];
[containerView addSubview:poster];


UIView *testView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, containerView.frame.size.width, containerView.frame.size.height)];
testView.backgroundColor = [UIColor redColor];

[UIView transitionWithView:containerView duration:3
                   options:UIViewAnimationOptionTransitionFlipFromLeft animations:^{
                       [poster removeFromSuperview];
                       [containerView addSubview:testView];
                   }
                completion:NULL];

これで、ポスターの代わりに赤い UIView が表示されますが、フリップ アニメーションはまったくありません。なぜだめですか?

4

2 に答える 2

1

で遷移するようにビューに指示しているため、self.viewビュー全体がアニメーション化されているのも不思議ではありません。代わりに、ポスター ビューでアニメーション化するようにトランジションを指示してみてください。

[UIView transitionWithView:poster.view duration:3
                   options:UIViewAnimationOptionTransitionFlipFromLeft animations:^{
                       [poster removeFromSuperview];
                       [self.view addSubview:newView];
                   }
                completion:NULL];
于 2011-09-30T19:20:47.173 に答える
0

2つのUIImageView(名前:fromImageViewおよびtoImageView)を持つUIViewController(名前:transitionView)を作成しました。viewDidLoad の viewController に transitionView を追加し、alpha を 0 に設定しました。2 つの UIView から両方の画像を作成します。

- (UIImage *) imageFromView: (UIView *) view {
    CGFloat alpha = [view alpha];
    [view setAlpha: 1.0];
    CGSize pageSize = view.frame.size;
    UIGraphicsBeginImageContext(pageSize);

    CGContextRef resizedContext = UIGraphicsGetCurrentContext();
    [view.layer renderInContext: resizedContext];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();
    [view setAlpha: alpha];
    return image;
}

そして、サイズ変更を伴う私のフリップコードは次のとおりです。

- (void) flipFromView: (UIView *) fromView toView: (UIView *) toView {
    // Warning: positions is wrong when your image (or view) is in UIScrollView...
    CGRect frame = CGRectMake(-8.0, 30.0, 336.0, 380.0); // resizing the fromView if the image is small...
    CGFloat interval = 1.0;

    [[transitionView view] setAlpha: 1.0]; //

    UIImage *fromViewImage = [self imageFromView: fromView];
    UIImageView *fromImageView = [transitionView fromImageView];
    [fromImageView setImage: fromViewImage];
    [fromImageView setFrame: [fromView frame]];


    UIImage *toViewImage = [self imageFromView: toView];
    UIImageView *toImageView = [transitionView toImageView];
    [toImageView setImage: toViewImage];
    [toImageView setFrame: frame];

    [fromView setHidden: YES]; // hide original while animating

    toImageView.layer.transform = CATransform3DMakeRotation(M_PI_2, 0.0, 1.0, 0.0);

    [UIView animateWithDuration: interval
                          delay: 0.0
                        options: UIViewAnimationOptionCurveEaseIn
                     animations: ^{
                         [fromImageView setFrame: frame];
                         fromImageView.layer.transform = CATransform3DMakeRotation(M_PI_2, 0.0, 1.0, 0.0);
                     } completion: ^(BOOL finished) {

                     }
     ];

    [UIView animateWithDuration: interval
                          delay: interval // wait to previous animation ending
                        options: UIViewAnimationOptionCurveEaseOut
                     animations: ^{
                         toImageView.layer.transform = CATransform3DMakeRotation(M_PI_2,  0.0, 0.0, 0.0);
                         toImageView.frame = [toView frame];
                     } completion: ^(BOOL finished) {
                         [toView setAlpha: 1.0];
                         [fromView setHidden: NO];
                     }
     ];
}

そして、私の悪い英語でごめんなさい、私は英語を話せません!

于 2013-03-03T15:00:42.280 に答える