3

縦向きで開始するときは完璧に機能し、縦向きから横向きに回転したり、元に戻したりするときにも機能します。

ランドスケープで起動すると機能しません。ただし、横から縦に、またはその逆に回転すると機能します。

ランドスケープ開始モードでは、画面座標 X が 768 を超える場所では、画面はタッチしても反応しません。

コードでは、ステータス バーの向きを使用して元の向きを決定し、各ビューを手動で回転させます。ビューは正しく表示されますが、タッチを正しく受信しません。

次に、iPadが回転を開始すると、ルートView Controllerが呼び出されます:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration

すべてのサブビューを回転させます。

ルート コントローラ:

- (void)loadView {
    self.view = [[UIView alloc]init ]; 
    //initialize child views
    [self willRotateToInterfaceOrientation:0 duration:0];    

}

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 
    if ([model isLandscape]) {
        self.view.frame = CGRectMake(0, 0, 1024, 768-80);
    }
    else {
        self.view.frame = CGRectMake(0, 0, 768, 1024-80);
    }
    //rotate child views  
}

私のコード [model isLandscape] は機能するので、詳細を説明する必要はありませんが、コードは次のとおりです。

- (bool)isLandscape {
    if (orientation == UIInterfaceOrientationLandscapeLeft || orientation == UIInterfaceOrientationLandscapeRight) 
        return true;
    else 
        return false;
}

-(id) init
{
    [[NSNotificationCenter defaultCenter] addObserver:self   selector:@selector(orientationChanged:) name:UIDeviceOrientationDidChangeNotification object:nil];
}

- (void)orientationChanged:(NSNotification *)notification
{
    UIInterfaceOrientation curOrientation = [[UIDevice currentDevice] orientation];
    if (curOrientation == UIDeviceOrientationPortrait ||
        curOrientation == UIDeviceOrientationPortraitUpsideDown ||
        curOrientation == UIDeviceOrientationLandscapeLeft ||
        curOrientation == UIDeviceOrientationLandscapeRight)
    {
        orientation = curOrientation;
        ((AppDelegate*)([UIApplication sharedApplication].delegate)).savedOrientationForRestart = orientation;
        NSLog(@"changed");
    }
}

-(void)validateOrientation { //first time when initializing orientation
    UIInterfaceOrientation curOrientation = [[UIDevice currentDevice] orientation];
    if (curOrientation != UIDeviceOrientationPortrait &&
        curOrientation != UIDeviceOrientationPortraitUpsideDown &&
        curOrientation != UIDeviceOrientationLandscapeLeft &&
        curOrientation != UIDeviceOrientationLandscapeRight)
    {
        orientation = [[UIApplication sharedApplication] statusBarOrientation];
    }

}
4

1 に答える 1

0

わかった。そのため、数十の背景とレイヤーの中で、一部が正しく横向き/縦向きに回転されていないことが判明しました...この問題をデバッグするのは非常に困難でした...

最後に、タッチ デバッガーを接続して、タッチを正しく受信しているビューとそうでないビューを確認しました...

非常に役に立ちます!コードで UIWindow の代わりに以下の UIWindow サブクラスを使用するだけで機能します。

    #import <UIKit/UIKit.h>
    @interface MyUIWindow : UIWindow {
    }

    -(void)rotate;

    @end

    #import "MyUIWindow.h"
    @implementation MyUIWindow

    -(id) init{
        self = [super init];
        if(self)
        {
        }
        return self;
    }

    - (void)sendEvent:(UIEvent *)event {
        [super sendEvent:event];
        NSSet *touches = [event allTouches];
        if (touches.count != 1)
            return;
        UITouch *touch = touches.anyObject;    
        UIView * view = touch.view;
        NSLog(NSStringFromClass([touch.view class])); //this prints out touch view
    }


    @end
于 2012-12-11T17:02:18.187 に答える