4

tabBar の選択から表示されるアイコン メニューを正常に作成しました。このメニューは、縦向きまたは横向きで表示できます。

画面上のスペースのため、縦向きで 4x4 のアイコンを表示できるようにしました.しかし、横向きで表示したときのサイズ変更により、これはうまく機能しません..そのため、2 行を表示できるようにしました。このため、メニュー用に 2 つの UIView を作成することにしました。デバイスが回転すると、2 つのビューが切り替わります。

つまり、現在縦向きでデバイスが回転している場合、横向きをロードして縦向きをアンロードし、その逆も同様です。

これは、デバイスの回転でビューを変更するために使用しているコードです。これは完全に正常に機能します (最適なコードではないかもしれませんが、私ができる最善のコードです)。

if  ([[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationPortrait)
        {
            if([jumpBarContainerLandscape superview])
            {
            // Device is changing from landscape to protrait change views to fit
            // load landscape view
            jumpBarContainerPortrait = [[UIView alloc] initWithFrame:CGRectMake(0.0, (367 - jumpBarHeightPortrait), 320.0, (jumpBarHeightPortrait + 49.0))];
            jumpBarContainerPortrait.backgroundColor = [UIColor scrollViewTexturedBackgroundColor];
            jumpBarContainerPortrait.alpha = 0.0;

            // add jumpbar container to view
            [self.view insertSubview:jumpBarContainerPortrait belowSubview:actionTabBar];

            [UIView animateWithDuration:0.2
                                  delay:0.0f
                                options:UIViewAnimationCurveEaseIn 
                             animations:^{

                                 jumpBarContainerLandscape.alpha = 0.0;


                             } completion:^(BOOL finished) {
                                 if (finished) {


                                 }
                             }];


            [UIView animateWithDuration:0.2
                                  delay:0.0f
                                options:UIViewAnimationCurveEaseIn 
                             animations:^{

                                 jumpBarContainerPortrait.alpha = 1.0;


                             } completion:^(BOOL finished) {
                                 if (finished) {

                                     // remove subView for superView
                                     [jumpBarContainerLandscape removeFromSuperview];
                                 }
                             }];

            }
        }
        else if ([[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationLandscapeLeft || [[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationLandscapeRight)
        {
            if ([jumpBarContainerPortrait superview])
            {
            // Device is changing from portrait to landscape change views to fit
            // load landscape view
            jumpBarContainerLandscape = [[UIView alloc] initWithFrame:CGRectMake(0.0, (207 - jumpBarHeightLandscape), 480.0,  (jumpBarHeightLandscape + 49.0))];
            jumpBarContainerLandscape.backgroundColor = [UIColor scrollViewTexturedBackgroundColor];
            jumpBarContainerLandscape.alpha = 0.0;

            // add jumpbar container to view
            [self.view insertSubview:jumpBarContainerLandscape belowSubview:actionTabBar];


                // fade out
            [UIView animateWithDuration:0.2
                                  delay:0.0f
                                options:UIViewAnimationCurveEaseIn 
                             animations:^{

                                 jumpBarContainerPortrait.alpha = 0.0;


                             } completion:^(BOOL finished) {
                                 if (finished) {


                                 }
                             }];

               // fade in
            [UIView animateWithDuration:0.2
                                  delay:0.0f
                                options:UIViewAnimationCurveEaseIn 
                             animations:^{


                                 jumpBarContainerLandscape.alpha = 1.0;


                             } completion:^(BOOL finished) {
                                 if (finished) {

                                     // remove subView for superView
                                     [jumpBarContainerPortrait removeFromSuperview];
                                 }
                             }];
            }
        }

今私が抱えている問題は、2 つの UIView 間のアニメーションが非常に醜いことです。アニメーションで 2 つの異なるビューを見ることができるのはあまり滑らかではなく、望ましくありません。 2つの間のクロスフェードにより、少し滑らかに見えるなど...

どんな助けでも大歓迎です。

編集:

したがって、CATransaction を作成しようとしましたが、1 行にエラーがあり、このエラーが発生しました 「UIView」の目に見える @interface がセレクター「jumpBarContainerPortrait」 を宣言していません 以下のこのエラーが発生する行にコメントを追加しました..任意の助けをいただければ幸いです

[CATransaction begin];
            CATransition *animation = [CATransition animation];
            animation.type = kCATransitionFade;
            animation.duration = 3.50;

            [self.view insertSubview:jumpBarContainerPortrait belowSubview:actionTabBar];

            [[self.view jumpBarContainerPortrait] addAnimation:animation forKey:@"Fade"]; // Error is happening here!
            [CATransaction commit];
4

1 に答える 1

7

個別のフェードインとフェードアウトのアニメーションの代わりに、UIView メソッド「transitionFromView」を使用します。次に例を示します。

        [UIView transitionFromView:jumpBarContainerLandscape
                            toView:jumpBarContainerPortrait
                          duration:crossDissolveTime 
                           options:UIViewAnimationOptionTransitionCrossDissolve 
                        completion:NULL];
于 2012-06-22T00:50:11.497 に答える