2009-10-26 11 views
9

iPhoneでUIViewAnimationTransitionCurlUpまたはUIViewAnimationTransitionCurlDownのトランジションを実行する方法を探していますが、上から下に移動するのではなく、左から右(または横/縦)で行います。私はこれを聞いたことがあるインターネットを数回尋ねたが、答えを得るためにsems。しかし、私はこれが実行可能だと思う。iPhoneのカール左とカール右のトランジション

私は、Viewのトランスフォームとview.layerのトランスフォームを変更しようとしましたが、それはトランジションには影響しませんでした。デバイスが向きを変えたときにトランジションが変化するので、デバイスがポートレートモードで横長トランジションを使用するのを欺く方法があると思われます。逆も同様です。

答えて

4

実際には、私のUIViewControllerの方向を変更することでこの効果を達成することができました。奇妙なことは、私のコントローラーが動作していないときに別のコントローラーに入れさせてもらったのですが、私が即時のコントローラーとして設定したとき、それは機能しました。それをしない

コード:私のアプリデリゲートのメインビューコントローラであり、唯一の横向きができますのUIViewControllerで

(あなたは以下の第二の方法で見るように)私は、次のしている:

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

ステータスバーはどうですか? - アプリケーションを使用しているとき、ステータスバーが右側に表示されますか? –

+3

これはうまくいかないようです。 – adib

+0

View Controllerがネストされていないこと、または親が正しい方向を実装していることを確認していることを確認してください... – Dimitris

0

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

もっと重要なことに、おそらくそれを試してはいけません。カール・アップとカール・ダウンは、ユーザー・インターフェースの文法の一部で、ビューが既存のビューに上がったり下に置かれたりしていることをユーザーに伝えます。それは、付箋紙が置かれてから取り除かれるようになっているはずです。左の< - >右カールは、おそらく本のページを切り取るようなものと解釈されます。それはユーザーを混乱させます。

標準APIが簡単にはできないインタフェースで何かをしようとするときは、そのような新しいメソッドがユーザにとって重要なことを伝えるかどうか、そしてそれが既存のインタフェース文法。そうでなければ、あなたは気にしないでください。

珍しいインターフェイスには初期の驚きの要素がありますが、日常的な使用で不満やエラーが発生します。彼らはまた、Appleにあなたのアプリを拒否させる可能性があります。

+0

これは珍しいことではありません。それはまったく同じです。実際、アップルはそれを逆向きにしています。インタラクティブなランドスケープブックを作成していますので、このアニメーションがブックフィーリングをユーザーに伝えることができます。アップダウンの効果はノート(ノートアプリのような)のために働きます。しかし、適切な本のために私は別の気持ちが必要です。 – Dimitris

+0

カールの移行を見ると、ビューの3つのコーナーが切り離されていることがわかります。ターンされたページは2つだけを切り離す。カールは斜め方向にビューを移動しますが、ページの回転は左から右にのみ移動します。その違いは微妙ですが、ユーザーの期待にとっては重要です。 – TechZen

+2

カール遷移の主なモーションは右下隅の対角線モーションなので、単純な変換で必要なトランジションを得ることはできません。どのように回転またはビューを変換するにしても、左から右の単純なカールの錯覚を破壊する斜めの動きが残っています。 – TechZen

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

containerViewに追加するビューは何ですか?@fluXa –

2

私もこれで苦労。カールが左右から来るようにするには、中間のビューを作成してそれを変形することができます。それでは、あなたが移行しているビュー(MYVIEW)は、メインウィンドウ(parentView)の子であるとしましょう:

-parentView 
-->myView 

あなたは(簡単にInterface Builderで行われる)の間に中間のビューを挿入します:

その後
-parentView 
-->containerView 
--->myView 

、右から左コンテナ90度と移行ビュー90度を反転するには、次のコードを使用します。MYVIEWはまだユーザーに直立表示されますが、移行は、それはだと思うだろう

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

左から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に最も近いところです。

+0

優秀な答え!あなたのレシピは魅力的に機能します。 – Bram

2

私はfluXaのソリューションをiOS5で試しました(私は[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. flipSizeRectは矩形の幅と高さを反転します(すでにそれを持っていますか?)
  3. コンテナを追加してから階層からビューを削除したいので、dispatch_afterが必要です。私が出動しないと、何も動かない。私の推測では、削除をアニメーション化する前に、まずシステムにレイアウト・パスをさせる必要があるということです。