iPhone Curl LeftおよびCurl Rightトランジション
-
06-07-2019 - |
質問
iPhoneでUIViewAnimationTransitionCurlUp
またはUIViewAnimationTransitionCurlDown
トランジションを実行する方法を探していますが、上から下ではなく、左から右(またはランドスケープモードでは上/下)で実行します。私はこれがインターネットで何度か尋ねられたのを見たことがありますが、答えを得るためのsemsはありません。ただし、これは実行可能だと感じています。
Viewのトランスフォームとview.layerのトランスフォームを変更しようとしましたが、トランジションには影響しませんでした。デバイスの向きが変わるとトランジションが変わるので、デバイスをだましてポートレートモードでランドスケープトランジションを使用する方法がありますか?
解決 2
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);
}
他のヒント
コンテナビューを使用すると、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];
これにも苦労しました。右または左からカールを取得するには、中間ビューを作成して変換します。したがって、移行中のビュー(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に最も近いものです。
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];}];});
注:
- アフィン変換の変換(80,80)は私の考えでは意味をなさないことを認めなければなりませんが、iphoneには必要であり、おそらくiPadでは動作しません。
- flipSizeRectは、四角形の幅と高さを反転します(既に取得していますか?)
- 私はコンテナを追加し、階層からビューを削除したいので、dispatch_afterが必要です。ディスパッチを省略した場合、何もアニメートされません。私の最善の推測は、削除をアニメートする前に、まずシステムにレイアウトパスを行わせる必要があるということです。
カスタムアニメーションを作成する以上の方法はないと思います。
さらに重要なことは、おそらく試してはならないことです。カールアップとカールダウンは、ユーザーインターフェイスの文法の一部であり、ビューを既存のビューの上に持ち上げたり、下に置いたりすることをユーザーに伝えます。付箋紙を置いてから削除するようなものです。左<!> lt;-<!> gt;右カールは、ほとんどの場合、本からページをリッピングするようなものとして解釈されます。ユーザーを混乱させます。
標準APIが簡単に実行できないインターフェイスで何かを実行しようとする場合は、そのような新しいメソッドがユーザーにとって重要なことを伝え、既存のインターフェイスの文法に似ているかどうかを確認する必要があります。そうでない場合は、気にする必要はありません。
異常なインターフェースには初期のすごい要因がありますが、日常の使用ではフラストレーションとエラーにつながります。また、Appleがアプリを拒否することもあります。