2009-08-19 10 views
3

こんにちは私のアプリでは、下の図のようなビューにいくつかのuiButtonsがサブビューとして追加されています。 alt text http://img193.imageshack.us/img193/5931/landscapeq.png自動回転時にフレームが設定された後にUIButtonsが反応しない

当初ビューはボタンがタッチに対応ポートレートモードのとき:ユーザーは風景の中に携帯電話を回転させたときのビューとボタンがこれにポジションを変更する必要があります alt text http://img99.imageshack.us/img99/5244/portraitc.png

。私が電話機を傾けると、ボタンが動いて、2番目の画像のようにすべてが表示され、ボタンがタッチに反応します。電話機をポートレートモードに戻すと、ボタンは元の状態に戻りますが、タッチには反応しません。私は戻って風景に変更した場合のボタンが正しく動作し...

私のボタンは、次のように作成されます。

nextNewsP = [[UIButton alloc] initWithFrame:CGRectMake([[UIScreen mainScreen] bounds].size.width - 40, 10, 25, 25)]; 
[nextNewsP setImage:[UIImage newImageFromResource:@"next_arrow.png"] forState:UIControlStateNormal]; 
[nextNewsP addTarget:self action:@selector(nextNewsAction:) forControlEvents:UIControlEventTouchUpInside]; 
[nextNewsP setShowsTouchWhenHighlighted:TRUE]; 
[bottomTools addSubview:nextNewsP]; 
[nextNewsP release]; 

previousNewsP = [[UIButton alloc] initWithFrame:CGRectMake([[UIScreen mainScreen] bounds].size.width - 85, 10, 25, 25)]; 
[previousNewsP setImage:[UIImage newImageFromResource:@"previous_arrow.png"] forState:UIControlStateNormal]; 
[previousNewsP addTarget:self action:@selector(previousNewsAction:) forControlEvents:UIControlEventTouchUpInside]; 
[previousNewsP setShowsTouchWhenHighlighted:TRUE]; 
[bottomTools addSubview:previousNewsP]; 
[previousNewsP release]; 

bottomToolsは図であり、このようなサブビューとしても追加されます。

[self.view addSubview:bottomTools]; 
[bottomTools release]; 

と私のshouldAutorotateToInterfaceOrientation機能は次のようになります。

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 


    [UIView beginAnimations:@"moveViews" context: nil]; 


    if(interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) 
    { 
     NSLog(@"set frames for portrait"); 
     closeView.frame = CGRectMake([[UIScreen mainScreen] bounds].size.width - 30, 2, 23, 25); 
     newsInfo.frame = CGRectMake(10, 10, [[UIScreen mainScreen] bounds].size.width - 10, 22); 
     internetActivityIndicator.frame = CGRectMake([[UIScreen mainScreen] bounds].size.width - 55, 5, 18, 18); 
     industryLabel.frame = CGRectMake([[UIScreen mainScreen] bounds].size.width/2.0 - [industryTitle sizeWithFont:[UIFont systemFontOfSize:14]].width/2, 3, [industryTitle sizeWithFont:[UIFont systemFontOfSize:14]].width, 22); 
     bottomTools.frame = CGRectMake(0, [[UIScreen mainScreen] bounds].size.height-40, [[UIScreen mainScreen] bounds].size.width, 40); 
     nextNewsP.frame = CGRectMake([[UIScreen mainScreen] bounds].size.width - 40, 10, 25, 25); 
     previousNewsP.frame = CGRectMake([[UIScreen mainScreen] bounds].size.width - 85, 10, 25, 25); 
    } 
    else 
    { 
     NSLog(@"set frames for landscape"); 
     closeView.frame = CGRectMake([[UIScreen mainScreen] bounds].size.height - 30, 2, 23, 25); 
     newsInfo.frame = CGRectMake(10, 10, [[UIScreen mainScreen] bounds].size.height - 10, 22); 
     internetActivityIndicator.frame = CGRectMake([[UIScreen mainScreen] bounds].size.height - 55, 5, 18, 18); 
     industryLabel.frame = CGRectMake([[UIScreen mainScreen] bounds].size.height/2.0 - [industryTitle sizeWithFont:[UIFont systemFontOfSize:14]].width/2, 3, [industryTitle sizeWithFont:[UIFont systemFontOfSize:14]].width, 22); 
     bottomTools.frame = CGRectMake(0, [[UIScreen mainScreen] bounds].size.width-40, [[UIScreen mainScreen] bounds].size.height, 40); 
     nextNewsP.frame = CGRectMake([[UIScreen mainScreen] bounds].size.height - 40, 10, 25, 25); 
     previousNewsP.frame = CGRectMake([[UIScreen mainScreen] bounds].size.height - 85, 10, 25, 25); 
    } 

    [UIView commitAnimations]; 

return YES; 

}

これまでに同様の問題がありましたか? ありがとうございます、 ソリン

答えて

0

あなたの問題はあなたのフレーム調整にあると思います。私の腸は、論理がshouldAutorotateToInterfaceOrientationであることと関係があると言います。回転が実際に行われる前に起こるからです。 this articleで計算を行い、それが役立つかどうかを確認してください。

+0

ありがとうございました。私はそれを試し、フィードバックを返します。ソーリン –

+0

記事は本当に便利でした、ありがとう!それは働いた:) –

1

私は実際にはまだ同じ問題(1年後... iOS 3.0互換性が必要)で苦労しています。回転部分は簡単でした。しかし、ビューとボタンはタッチや移動/ドラッグイベントを処理していないようです。私は、ウィンドウ(UIWindow)がタッチイベントを受け取っていることを確認しました。

画面の最後の1/3(つまり、480〜320)は、ポートレートから風景に回転した後に受信者にイベントを伝播しないようです。

回転ビューコントローラにレスポンダがないため、slfによるリンクの例は役に立ちません。


私はちょうど眺めの掘り下げの後でそれを理解しました。だから、私はviewController.viewのサブビューでviewController.viewを回転させ、たくさんのsetNeedsLayoutを実行していました。しかし、私がする必要があったのは[self.navigationController.view setNeedsLayout]でした。その1つの呼び出しは私のためにすべてを固定しました。何らかの理由で、navigationController.viewは、以前は隠されていたサブビューの部分(フレーム/境界に関する限り)にタッチイベントを渡していませんでした。実際には、他の多くの問題も修正されました。

+0

ビューが重複していないかどうかを確認するか、彼らはユーザーの対話が有効になっている場合。これらは現在私の心に入ってきます。 –

+0

Na、それはそうではありません。私はちょうどいくつかの眺め掘り出した後にそれを考え出した。だから、私はviewController.viewのサブビューでviewController.viewを回転させ、たくさんのsetNeedsLayoutを実行していました。しかし、私がする必要があったのは[self.navigationController.view setNeedsLayout]でした。その1つの呼び出しは私のためにすべてを固定しました。何らかの理由で、navigationController.viewは、以前は隠されていたサブビューの部分(フレーム/境界に関する限り)にタッチイベントを渡していませんでした。実際には、他の多くの問題も修正されました。 – Ephraim

0

私が持っていた問題を解決しました。基本的には[self.navigationController.view setNeedsLayout]が必要でした。

I)は多分間違ったがself.navigationController.view.frameself.view.frameと同じであったとの両方が、幅= 320、高さ= 480、Y = 0、X = 0(に等しいであったことである(このことを理解する方法。私はそれM_PI/2によってself.viewを回転させselect self.viewでいくつかのフレーム操作を行いました。すべてのアニメーション/位置/スケールを正しく取得するためのサブビュー。

これはうまくいきましたが、ナビゲーションコントローラが320の右側にあるself.viewの部分にタッチイベントを認識して喜んでいませんでした。本質的に、このself.navigationController.view.clipsToBoundsが真であれば、 self.viewの

とにかく、ナビゲーションコントローラのビューでsetNeedsLayoutを設定すると問題が解決しました。私はこれが他の誰かを助けることを望む。 SorinAがタッチイベントを起こさないボタンで問題を抱えていたと私は考えています。

+0

これは私の自身の問題に対する私の解決策です。 – Ephraim

関連する問題