2011-07-01 5 views
0

私は、ポートレイトからランドスケープにオリエンテーションを変更した後、私のビューのいくつかの部分のためにtouchesBeganイベントを取得できないことに気付きました。私は、デバイスの回転後に私のウィンドウのフレームの寸法の変更についてUIViewに通知していないからです。touchesBegan afterRotateFromInterfaceOrientation

私はこのようなプログラムですべてのもの(UIWindow、のUIViewController、UIViewの)設定してい:

[[[self view] window] setFrame:rect]; 
:私はdidRotateFromInterfaceOrientation通知を取得すると、私はこのような窓枠を更新しています

myViewController = [[myUIViewController alloc] init]; 
myWindow = [[UIWindow alloc] initWithFrame: rect]; 
myView = [[myUIView alloc] initWithFrame: [myWindow bounds]]; 

[myViewController setView:myView]; 
[myWindow addSubview:myView]; 
[myWindow setFrame:rect]; 
[myWindow makeKeyAndVisible]; 

しかしその後、私のUIViewはもはやすべての分野のtouchesXXXイベントを取得しません。前のフレームの領域だけがまだイベントを報告しているようです。だから私の質問:didRotateFromInterfaceOrientationで私のUIViewに寸法変更について通知する必要があるものはありますか?

ありがとうございました!

EDIT:didRotateFromInterfaceOrientation()のUIViewの位置を変更する必要がありますか、これは自動的に行われますか?私は、UIViewの「変換」プロパティが、向きが変わったときに変換マトリックスに設定されていることに気付きました。しかし、これは私の見解を変えることを非常に困難にしています。ドキュメントでは、変換がアクティブなときに「フレーム」プロパティを使用できないため、ビューの位置を変更するために「中心」プロパティを変更しようとしましたが、これも正しく機能しません。ビューを左上隅に移動したいので、 "center"を(screenwidth/2、screenheight/2)に設定しますが、ビューを正しく配置しません:(任意のアイデアや情報を取得するには右方向モードでのイベントは?

答えて

0

私はこれと同じ問題があった、と私はそれがフレームの問題であると考えている。

私は手動でuserInteractionEnabledを設定するだけでなく、向きに応じてrectsを設定する必要がありましたメインビューには、のように:

if (appOrientation == 0) 
    appOrientation = [UIApplication sharedApplication].statusBarOrientation; 
if (appOrientation == UIInterfaceOrientationLandscapeLeft || appOrientation == UIInterfaceOrientationLandscapeRight) { 

    [[UIApplication sharedApplication] setStatusBarHidden:YES]; 
    myView.frame = CGRectMake(0, 0, 1024, 768); 

} else { 

    [[UIApplication sharedApplication] setStatusBarHidden:YES]; 
    myView.frame = CGRectMake(0, 0, 768, 1024); 
} 

myView.userInteractionEnabled = YES; 
+0

ありがとうございますが、残念ながらそれは役に立たなかったです。本当に変だ!私はこのすべてをシミュレータでテストしています。私のアプリが起動すると、シミュレーターはポートレートモードになり、私は320x480ピクセルの領域全体ですべてのタッチイベントを完全に取得します。シミュレータを右に回転させてから、myView.frameをCGRectMake(0,0,480,320)に設定すると、画面全体が画面全体に表示されませんが、ビューは右に160ピクセル右に移動します私のビューの左側が160個の空の黒いピクセルを突然表示するので、私のビューの一部が可視領域外に移動します。なぜ私は考えていない! – andy

+0

また、ドキュメントでは、トランスフォーメーションがアクティブで、デバイスを回転するとトランスフォーメーションがアクティブになったときに、frameプロパティを使用しないでください。代わりに、ドキュメントは、変換がアクティブなときに境界と中心のプロパティを使用する必要があると言います。しかし、それはどちらもうまくいかない!それはすべてかなり混乱している... – andy

0

OK私は、これは古い質問です知っているが、これは私がこの問題を修正する方法です

私の状況で私は、ユーザー設定に応じて、ポートレートまたは風景モードに強制的に表示されるビューのストーリーボードを持っていました。

このビューを表示している場合を除き、私のアプリは常にstatusBarを表示します。

これをすべて実行するには、変換をviewWillAppearメソッドで適用する必要がありました。最初はviewDidAppearメソッドに次のコードがあり、touchesBeganイベントの境界が乱れていると思います。

はここでviewWillAppearコードです:

- (void)viewWillAppear:(BOOL)animated 
{ 
    // Hide the status bar 
    [[UIApplication sharedApplication] setStatusBarHidden:YES]; 

    // This is to offset the frame so that the view will take the fullscreen once the status bar is hidden 
    self.navigationController.navigationBar.frame = CGRectOffset(self.navigationController.navigationBar.frame, 0.0, -20.0); 

    // If view is to be displayed in landscape mode 
    if ([[NSUserDefaults standardUserDefaults] boolForKey:@"orientation"]) 
    { 
     // Change status bar orientation 
     [[UIApplication sharedApplication] setStatusBarOrientation:UIDeviceOrientationLandscapeLeft]; 

     // Turn the view 90 degrees 
     [self.navigationController.view setTransform:CGAffineTransformMakeRotation(M_PI/2)]; 

     // Set the frame and the bounds for the view 
     // Please Note: Frame size has to be reversed for some reason. 
     [self.navigationController.view setFrame: CGRectMake(0,0,320,480)]; 
     [self.navigationController.view setBounds: CGRectMake(0,0,480,320)]; 

     // Make sure user can interact with view 
     [self.navigationController.view setUserInteractionEnabled:YES]; 
    } 
} 

レイアウト賢明起こることを持っていた他の事は、viewDidAppear方法で発生することがあります。例えば、私は全体像をカバーした画像を持っていて、向きに応じてフレームを設定しなければなりませんでした。 viewWillAppearのフレームを設定すると奇妙な結果が得られましたが、同じコードがviewDidAppearで完全に機能しました。

私は6時間頭を叩いたので、これは誰かを助けてくれることを願っています。

関連する問題