2012-03-23 14 views
7

コンテキスト:通常のUIViewController.viewからUISplitViewController.viewにカスタムアニメーションを実行しようとしています。左から右にアニメーションが表示されます。iOS:不適切なオリエンテーションをrootViewControllerでアニメーションしますか?

UIViewControllerの場合、self.window.rootViewController = viewControllerviewControllerとなります。ユーザースワイプしたら

は、次のように呼び出されます:

UIView *theWindow = [viewController.view superview]; 

[viewController.view removeFromSuperview]; 
[theWindow addSubview:self.splitViewController.view]; 


CATransition *animation = [CATransition animation]; 
[animation setDuration:0.5]; 
[animation setType:kCATransitionPush]; 
[animation setSubtype:kCATransitionFromLeft]; 
[animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]]; 

[[theWindow layer] addAnimation:animation forKey:@"SwitchToView1"]; 

デバイスがポートレートモードである場合には、すべてが完璧に行ってきました。ただし、デバイスがランドスケープモードの場合、デバイスがポートレートモードにあるかのように、トランジションアニメーションが実行されます。例えば、左から来るのではなく、下から来る。両方のビューの方向は完全に正しいです。移行だけが奇妙です。

+0

あなたが他の方向に風景に回転している場合、アニメーションは上から発生しますか。または、あなたが風景モードに入る方法に関係なく、底からですか?この定数は、レイヤーの左側からアニメーションを取り込みます。レイヤーのフレームが更新されていないのではないかと思います。そのため、レイヤーの左側は、回転後のボトムになりました。 – jmstone617

+0

それは正しいです。アニメーションは方向変更を無視します。レイヤーが確実に更新されるようにするための提案はありますか? – Byte

+0

私は同じ問題を抱えています.CALayerの向きは、その視点と一致していないようです。それについての他の同様の記事がいくつかあるようですが、解決策のどれも私にとってはうまくいかないようです。レイヤーを90度回転させるとビューも回転しますので、助けにはなりません。 – jonydep

答えて

9

私はコードを使って遊んでいました(あなたのプロジェクトのセットアップ方法を推測して推測しました)、次のコードで目的の効果を得ることができました。私は、レイヤー、ビュー、またはサブレイヤーなどのフレームと境界を設定しようとしましたが、それは機能しませんでした。 CATransform3Dの、CATransform3DRotates、などもトリックをやっていなかった。私はまた、固い時間のためにグーグル。誰もあなたの問題を抱えていないか、誰もあなたの問題を解決していません。かかわらず、このソリューションは動作し、いくつかのCore Animationの第一人者が、よりよい解決策を提供することができない限り、あなたはこれに歓迎しています:

- (void)swipeGesture:(UISwipeGestureRecognizer *)sender { 

UIView *theWindow = [self.viewController.view superview]; 

UIInterfaceOrientation interfaceOrientation = self.viewController.interfaceOrientation; 
NSString *subtypeDirection; 
if (interfaceOrientation == UIInterfaceOrientationLandscapeLeft) { 
    subtypeDirection = kCATransitionFromTop; 
} 
else if (interfaceOrientation == UIInterfaceOrientationLandscapeRight) { 
    subtypeDirection = kCATransitionFromBottom; 
} 
else { 
    subtypeDirection = kCATransitionFromLeft; 
} 

[self.viewController.view removeFromSuperview]; 
[theWindow addSubview:self.splitViewController.view]; 

CATransition *animation = [CATransition animation]; 
[animation setDuration:0.5]; 
[animation setType:kCATransitionPush]; 
[animation setSubtype:subtypeDirection]; 
[animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]]; 

[[theWindow layer] addAnimation:animation forKey:@"SwitchToView1"]; 
} 
+0

このソリューションは動作しますが、これには来ないようにしたいと思います(手動でトランジションを調整します)。私はこれに当てはまらないウィンドウの向きに依存する他のアニメーションを持っています。より良い解決策が出られない限り、私は賞金が終了する前にあなたの答えを正しく記入します。ありがとうございました。 – Byte

+1

申し訳ありませんが、より良い解決策を提供することができませんでした。私はサンプルプロジェクトを立ち上げ、昨日何かを見つけようと3時間を過ごしました。アイデアは簡単です:ウィンドウのレイヤーのフレームを更新して、初期ビューのレイヤーの向きに合わせます。残念ながら、それを実践することは簡単ではないようです。 – jmstone617

+0

私は正しいと思うのですが、これはトランジションの正しい方向を選択するだけですか?それでも、トランジションの「フレーム」サイズは調整されません。 – jonydep

関連する問題