0

私はほとんどすべてのユーザー インターフェイスをプログラムで作成しており、Interface Builder でわずかな変更を加えています。しかし、すべての UI の 99% はもっぱらコードで行われています。仕方。

ただし、サブビューとしていくつかの UIView が追加されているため、デバイスの回転を処理する際に問題が発生しています。ビューを一般的に宣言する方法であるため、回転の問題に直面しています。

htmlTest.webViewTest.frame = CGRectMake(4.0, 4.0, 312.0, 363.0);

この修正された CGRectMake により、デバイスが回転したときにビューが同じサイズのままになり、ビューの向きに正しく適合しなくなります。

だから私は私の意見では恐ろしい解決策に取り組んできました..アニメーション化するビューがいくつかあり、ユーザーはそれらからオプションを選択してアニメーション化できます..しかし、どちらかでロードを処理できる必要がありますポートレートまたはランドスケープであり、ロード中にいずれかの方向から別の方向への回転を処理できる必要があります。

これが私がビューの1つを行った方法です。

#pragma createAwesomeJumpBar
- (void)jumpBarButtonPosition:(int)changeView
{
    // ChangeView is used to check if the this method is being called from a device rotation or from a button press (0, being rotation and 1, being tabbarButton touch

    // if tabbar selected
    if (changeView == 1) {
        if  ([[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationPortrait)
        {
            if (![jumpBarContainerPortrait superview]) {
                // load portrait view
                jumpBarContainerPortrait = [[UIView alloc] initWithFrame:CGRectMake(0.0, 480.0, 320, (jumpBarHeightPortrait + 49.0))];
                jumpBarContainerPortrait.backgroundColor = [UIColor scrollViewTexturedBackgroundColor];

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

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

                                     jumpBarContainerPortrait.frame = CGRectMake(0.0, (367 - jumpBarHeightPortrait), 320.0, (jumpBarHeightPortrait + 49.0)); // display jumpBar


                                 } completion:^(BOOL finished) {
                                     if (finished) {
                                         NSLog(@"YAY!");
                                     }
                                 }];
            }
            else if ([jumpBarContainerPortrait superview]) {
                //unload portrait view
                [UIView animateWithDuration:0.6
                                      delay:0.0f
                                    options:UIViewAnimationCurveEaseIn 
                                 animations:^{

                                     jumpBarContainerPortrait.frame = CGRectMake(0.0, 480.0, 320.0, (jumpBarHeightPortrait + 49.0)); // display jumpBar

                                     // remove selected tabButton highlight
                                     [actionTabBar setSelectedItem:nil];


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

                                         // remove subView for superView
                                         [jumpBarContainerPortrait removeFromSuperview];

                                     }
                                 }];

            }

        }
        else if ([[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationLandscapeLeft || [[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationLandscapeRight)
        {
            if (![jumpBarContainerLandscape superview]) {
                // load landscape view
                jumpBarContainerLandscape = [[UIView alloc] initWithFrame:CGRectMake(0.0, 320, 480.0, (jumpBarHeightLandscape + 49.0))];
                jumpBarContainerLandscape.backgroundColor = [UIColor scrollViewTexturedBackgroundColor];

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

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

                                     jumpBarContainerLandscape.frame = CGRectMake(0.0, (207 - jumpBarHeightLandscape), 480.0,  (jumpBarHeightLandscape + 49.0)); // display jumpBar


                                 } completion:^(BOOL finished) {
                                     if (finished) {
                                         NSLog(@"YAY!");
                                     }
                                 }];
            }
            else if ([jumpBarContainerLandscape superview]) {
                // remove landscape view
                [UIView animateWithDuration:0.6
                                      delay:0.0f
                                    options:UIViewAnimationCurveEaseIn 
                                 animations:^{

                                     jumpBarContainerLandscape.frame = CGRectMake(0.0, 320, 480.0, (jumpBarHeightLandscape + 49.0)); // display jumpBar

                                     [actionTabBar setSelectedItem:nil];

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

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

        }
    }
    // if device rotated selected
    else if (changeView == 0) {
        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 = 1.0;

            // add jumpbar container to view

                [UIView transitionFromView:jumpBarContainerLandscape
                                    toView:jumpBarContainerPortrait
                                  duration:animationSpeed
                                   options:UIViewAnimationOptionTransitionCrossDissolve 
                                completion:NULL];

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


            }
        }
        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 = 1.0;

            // add jumpbar container to view

                [UIView transitionFromView:jumpBarContainerPortrait
                                    toView:jumpBarContainerLandscape
                                  duration:animationSpeed
                                   options:UIViewAnimationOptionTransitionCrossDissolve
                                completion:NULL];

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



            }

        }
    }
}

この例では、横向きと縦向きの 2 つのビューがあります。明らかに、名前がそれぞれの方向を表すように、上記のロジックはこの行に沿っています。

if tabbarselected 

if !view visible
if device orientation portrait 
animate in portrait view.
if device orientation landscape
animate in landscape view

if view visible
if device orientation portrait
animate out portrait view
clear tabbar
if device orientation landscape
animate out landscape view
clear tabbar

if !tabbarselected //meaning listener has identified orientation of device has changed 

if device orientation portrait
unload portrait 
load landscape

if device orientation landscape
unload landscape
load portrait

この面倒なことをすべて経験するよりも簡単な方法があるかどうか知りたいです! 私はまだかなり経験が浅いので、これが私の最善の試みでした.サブビューが向きを適切に調整するようにビューを他のビューに追加するために、この足のすべての作業を行うよりも簡単なアプローチを誰かが知っていることを願っています.

どんな助けでも大歓迎です!私は絶望的です笑:)

4

1 に答える 1

1

autoresizingMaskドキュメントを参照してください。InterfaceBuilderと同じスプリングとストラットのコントロールをすべて提供します。例えば:

CGRect frame = CGRectMake(margin, margin, self.view.frame.size.width - margin * 2, self.view.frame.size.height - margin * 2);
UIView *mySubview = [[UIView alloc] initWithFrame:frame];
[self.view mySubview];
mySubview.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

また、autoresizingMaskでは不十分であると判断した場合(たとえば、オブジェクトを相互に移動して縦向きと横向きを実際に微調整する場合)、viewWillLayoutSubviewsiOS5でこのレイアウトプロセスを実行することをお勧めします(またはwillAnimateRotationToInterfaceOrientationiOS4以前)。このように、変更を自分でアニメーション化する必要はなく、アニメーションは画面回転アニメーションの残りの部分と組み合わせて実行されます。

于 2012-06-26T22:52:12.197 に答える