13

私は1つのアニメーションUIViewAnimationTransitionFlipFromLeftを実装した1つのiPhoneアプリケーションに取り組んでいます。ここで、私のアプリケーションはポートレートモードで正常に動作します。指定されたのと同じアニメーションを実行しているということは、左から右に反転することを意味します。

しかし、このUIViewAnimationTransitionFlipFromLeftを横向きモードで実行しているときは、左から右に回転していません。代わりに上から下に回転しています。これは本当に重大な問題です。これを解決するのを手伝ってくれませんか。

ビューを回転させるためにiPhoneアプリケーションに使用しているコードは次のとおりです。

   CGContextRef context = UIGraphicsGetCurrentContext();
    [UIView beginAnimations:nil context:context];
    [UIView setAnimationTransition: UIViewAnimationTransitionFlipFromLeft forView:self.view.window cache:NO];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
    [UIView setAnimationDuration:1.0];
    [UIView commitAnimations];
    [self.navigationController pushViewController:objSecond animated:YES];

ありがとう、よろしく、Gurpritsingh Saini

4

5 に答える 5

15

iOS 4.0以降を使用している場合、次のようにすると、まさにあなたが望んでいることを実行できます(確認のためにテストしました)

NewView *myNewView = [[NewView alloc] initWith.....];
[UIView transitionFromView:self.view toView:myNewView.view duration:1 options:UIViewAnimationOptionTransitionFlipFromLeft completion:nil];
//[self.navigationController pushViewController:myNewView animated:NO];
[myNewView release];

編集:上記のコードを少し変更しています(新しいものは何もありません。ナビゲーションコントローラーは必要ないため、コメントアウトしているだけです)。

したがって、これにはいくつかの方法があります (次のビューを追跡する限り) が、これが私が考えることができる最も簡単な方法です。既にビュー 1 から 2 に切り替えることができるので、2 から 10 (または必要な数) に切り替える方法を説明します。

viewDidLoad基本的に、次のビューに移動するための呼び出しをキャッチするには、ビューの遷移が長すぎます。そのため、後で切り替えるメソッドを待機して送信するタイマーを設定する必要があります。したがって、これはビュー 2 (および 3 と 4 など) に表示されるコードです。

- (void)viewDidLoad {
    // this gets called before animation finishes, so wait;
    self.navigationController.delegate = self;
    // you will need to set the delegate so it can take control of the views to swap them;
    [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(switchView) userInfo:nil repeats:NO];
}

switch メソッドを呼び出すまで 1 秒しか待ちませんが、ビューに大量のデータをロードしている場合は、もう少し待つことをお勧めします。1.5 秒で十分ですが、それをいじって、どこで機能し、どこで機能しないかを確認できます。

次に、switchViewメソッドで次のビューを呼び出す必要があります。

- (void)switchView {
    NextView *myNextView = [[NextView alloc] initWith ... ];
    [UIView transitionFromView:self.view toView:nextView.view duration:1 options:UIViewAnimationOptionTransitionFlipFromLeft completion:nil];
    [nextView release];
}

これは私にとって完璧に機能しました。新しいビューを取得していることを確認するために、各ビューにタグを割り当て、各ビューのメソッドにサブビューとして UILabels を追加し、それぞれviewDidLoadがそのビューの数を示しました。うまくいけば、これはあなたが必要としていたものです。もっと複雑なことをする必要があると思いますが、これにより、必要な外観を得るために必要なアニメーションとロジックが得られます。(ちなみに、viewDidAppearこれを行うときに呼び出されないように見えるため、viewDidLoad本当に使用する必要がある場合は手動で呼び出す必要があるかもしれませんが、それ以外の場合は正常に動作します)

于 2011-05-21T21:17:28.287 に答える
2

ビューに手動で変換を追加する必要があります。反転変換は常に、View Controller が縦向きであるかのように動作します。

へのコンテキスト引数は、それ自体+beginAnimations:context:を意味するものではないことに注意してください。CGContextRefおそらく、現在のグラフィックス コンテキストをそこに渡したくはないでしょう。代わりに渡しNULLます。

于 2011-04-19T12:16:10.077 に答える
1
CGContextRef context = UIGraphicsGetCurrentContext();

[UIView beginAnimations:nil context:context];

[UIView setAnimationTransition: UIViewAnimationTransitionFlipFromLeft forView:self.view cache:NO];

[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

[UIView setAnimationDuration:1.0];

[UIView commitAnimations];

これでうまくいくと思います。

于 2011-05-19T07:21:04.537 に答える
1

これを試してください:

CABasicAnimation *rotateAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.y"];
    CGFloat startValue = 0.0;
    CGFloat endValue = M_PI;
    rotateAnimation.fromValue = [NSNumber numberWithDouble:startValue];
    rotateAnimation.toValue = [NSNumber numberWithDouble:endValue];
    rotateAnimation.duration = 1.5;
    [self.view.layer addAnimation:rotateAnimation forKey:@"rotate"];
于 2011-05-23T11:40:48.790 に答える
0

カスタム Segue でコードを試した後、あらゆる種類のエラーが発生しました。機能するだけでなく、タイマーを使用する必要がないため、より正確な方法を見つけました。MySegue.m は次のとおりです。

@implementation FlipRightSegue

- (id)initWithIdentifier:(NSString *)iden source:(UIViewController *)sour destination:(UIViewController *)dest
{
    self = [super initWithIdentifier:iden source:sour destination:dest];

    return self;
}

- (void)perform
{

    UIViewController *src = [self sourceViewController];
    UIViewController *dst = [self destinationViewController];

    //[UIView transitionFromView:src.view toView:dst.view duration:1 options:UIViewAnimationOptionTransitionFlipFromRight completion:nil];
    //[UIView commitAnimations];

    [UIView transitionWithView:src.navigationController.view duration:0.8 options:UIViewAnimationOptionTransitionFlipFromLeft
                   animations:^{
                       [src.navigationController pushViewController:dst animated:NO];
                   }
                   completion:NULL];
}

@end

右へのフリップ用の 2 番目のクラスもあります。コードは次の Web サイトから取得しました: http://www.dailycode.info/Blog/post/2012/11/29/iOS-Custom-Flip-Segue-(portrait-and-landscape-layout)-xcode-4.aspx

于 2013-07-08T00:13:32.940 に答える