9

UIViewAnimationTransitionCurlUpiPhoneでまたはトランジションを実行する方法を探していますUIViewAnimationTransitionCurlDownが、上から下ではなく、左から右(または横向きモードでは上/下)に実行します。私はこれがインターネットの周りで数回尋ねられたのを見ましたが、答えを得るために何もしません。しかし、これは実行可能だと思います。

Viewの変換とview.layerの変換を変更しようとしましたが、遷移には影響しませんでした。デバイスの向きが変わるとトランジションが変わるので、デバイスをだましてポートレートモードでランドスケープトランジションを使用する方法があると思いますか?

4

5 に答える 5

9

コンテナビューを使用すると、4つの方向のいずれかにカールを行うことができます。コンテナビューの変換を必要な角度に設定してから、変換されたフレームがないアプリのメインビューではなく、コンテナビューにビューを追加してカールを実行します。

NSView* parent = viewController.view; // the main view
NSView* containerView = [[[UIView alloc] initWithFrame:parent.bounds] autorelease];
containerView.transform = CGAffineTransformMakeRotation(<your angle here, should probably be M_PI_2 * some integer>);
[parent addSubview:containerView]; 

[UIView beginAnimations:nil context:nil];
[UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:containerView cache:YES];
[containerView addSubview:view];
[UIView commitAnimations];
于 2010-08-19T00:03:12.837 に答える
4

UIViewControllerの向きを変えることで、実際にこの効果を達成することができました。奇妙なことに、コントローラーが機能していないときに別のコントローラーにネストしていましたが、彼をイミディエイトビューコントローラーとして設定すると、コントローラーは機能しました。

それを行うコード:

私のアプリデリゲートのメインビューコントローラーであり、横向きのみを許可するUIViewController(以下の2番目の方法で見られるように)には、次のものがあります。

-(void)goToPage:(int)page flipUp:(BOOL)flipUp {

     //do stuff...

     // start the animated transition
     [UIView beginAnimations:@"page transition" context:nil];
     [UIView setAnimationDuration:1.0];
     [UIView setAnimationTransition:flipUp ? UIViewAnimationTransitionCurlUp : UIViewAnimationTransitionCurlDown forView:self.view cache:YES];

     //insert your new subview
     //[self.view insertSubview:currentPage.view atIndex:self.view.subviews.count];

      // commit the transition animation
      [UIView commitAnimations];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
     return (interfaceOrientation == UIInterfaceOrientationLandscapeRight);
}
于 2009-11-22T02:31:26.230 に答える
2

私もこれに苦労しました。カールを右または左から取得するには、中間ビューを作成して変換します。したがって、遷移しているビュー(myView)がメインウィンドウ(parentView)の子であるとしましょう。

-parentView
-->myView

間に中間ビューを挿入します(Interface Builderで簡単に実行できます)。

-parentView
-->containerView
--->myView

次に、次のコードを使用して、コンテナを左に90度、遷移ビューを右に90度反転します。

containerView.transform = CGAffineTransformMakeRotation(-M_PI_2);
myView.transform = CGAffineTransformMakeRotation(M_PI_2);

myViewは引き続きユーザーには直立して表示されますが、トランジションは左から90度で適用されていると見なします。

ビューの自動スケーリングの程度によっては、変換を適用した後にフレームサイズを修正する必要がある場合があることに注意してください。

  containerView.frame = CGRectMake(0.0, 0.0, 768.0, 1024.0);
  myWebView.frame = CGRectMake(0.0, 0.0, 768.0, 1024.0);

お役に立てれば。これは、UIViewAnimationTransitionCurlLeftおよびUIViewAnimationTransitionCurlRightに最も近いものです。

于 2011-03-15T08:16:00.263 に答える
2

iOS5でfluXaのソリューションを試しましたが([UIView trans ......]を使用する必要がありました)、機能しませんでした。カールはまだ上下していました。どうやら、トランジションはビューの変換を考慮に入れていないようです。したがって、他の誰かがiOS5で同じトリックを実行したい場合、解決策は、間に別のコンテナーを追加し、そこからの遷移をアニメーション化することです。

これが私のコードです。これは、左に「上」にカールしたいので少し具体的ですが、下隅がカールしています。まるでノートブックからページを引き裂いているかのように。

UIView* parent = self.view; // the main view
CGRect r = flipRectSize(parent.bounds);
UIView* containerView = [[UIView alloc] initWithFrame:r];
CGAffineTransform t = CGAffineTransformMakeRotation(-M_PI_2);
t = CGAffineTransformTranslate(t, -80, -80);
containerView.transform = CGAffineTransformScale(t, -1, 1);
[parent addSubview:containerView]; 

UIView* container2 = [[UIView alloc] initWithFrame:r];
[containerView addSubview:container2]; 

UIImageView* v = [[UIImageView alloc] initWithFrame:r];
v.image = [UIImage imageWithCGImage:contents.CGImage scale:contents.scale orientation:UIImageOrientationLeftMirrored];
[container2 addSubview:v];

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.001 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
    [UIView transitionWithView:container2
                      duration:DURATION_CURL_ANIMATION
                       options:UIViewAnimationOptionTransitionCurlUp
                    animations:^{
                        [v removeFromSuperview];
                    } completion:^(BOOL finished) {
                        if (completion) {
                            completion(finished);
                        }
                        [containerView removeFromSuperview];}];});

ノート:

  1. アフィン変換変換(80,80)は私の頭の中では意味がないことを認めなければなりませんが、iPhoneには必要であり、おそらくiPadでは機能しません。
  2. briefSizeRectは、長方形の幅と高さを反転します(すでに取得していますよね?)
  3. コンテナを追加した後、階層からビューを削除したいので、dispatch_afterが必要です。ディスパッチを省略した場合、何もアニメーション化されません。私の推測では、削除をアニメーション化する前に、まずシステムにレイアウトパスを実行させる必要があります。
于 2012-07-12T11:27:39.950 に答える
0

カスタムアニメーションを書く以外に方法はないと思います。

さらに重要なことに、あなたはおそらくそれを試みるべきではありません。カールアップとカールダウンは、ビューが既存のビューの上に持ち上げられているか、下に置かれていることをユーザーに通知するユーザーインターフェイス文法の一部です。付箋紙を置いてから取り除くようなものです。左<->右のカールは、本からページをリッピングするようなものとして解釈される可能性があります。ユーザーを混乱させます。

標準のAPIでは簡単にできないことをインターフェースで行おうとしていることに気付いたときはいつでも、そのような新しい方法がユーザーにとって重要なことを伝えるかどうか、そしてそれが既存のインターフェースの文法に似ているかどうかを自問する必要があります。そうでない場合は、気にしないでください。

異常なインターフェースには初期のすごい要素がありますが、日常の使用でフラストレーションやエラーが発生します。また、Appleがアプリを拒否する原因にもなります。

于 2009-10-26T16:42:35.927 に答える