1

-UIView があります。
-この UIView には、クリックすると UIAlertView が表示される UIButton があります。
-この UIAlertView 内には、クリックすると buttonClicked: を呼び出す別の UIButton があります
。(hourKeyboard はカスタム ビューです)

-(void)buttonClicked:(id)sender
{
    if(self.hourKeyboard==nil)
    {
        self.hourKeyboard = [[HourKeyboardViewController alloc] init];
        self.hourKeyboardPopover = [[UIPopoverController alloc] initWithContentViewController:self.hourKeyboard];
    }

    [self.hourKeyboardPopover presentPopoverFromRect:[sender bounds] inView:sender permittedArrowDirections:UIPopoverArrowDirectionLeft animated:YES];
}

通常のポートレート モードでは、これはうまく機能します。ポップオーバーはボタンのすぐ右に生成され、矢印はボタンの左を正しく指しています。

発生する 2 つの問題があります:
1) このポップオーバーが表示されている間、画面を回転させると、ポップオーバーがわずかに正しく回転しません (独自の x および y 位置を再配置しません)
2) ポップオーバーが表示されていない場合。画面を回転させてから「buttonClicked」を呼び出すと、ポップオーバーが表示されますが、ボタンの上に横向きに表示され、ボタンに向かって「下」を指す矢印が表示されます(技術的には、横向きのポップオーバー ビューに対して左)。閉じる場合は、画面を回転させてから「buttonClicked」を呼び出すと、ポップオーバーが逆さまに表示され、ボタンがボタンの「右」を指します (技術的には、横向きのポップオーバー ビューに対して左)。もう一度横向きにしてから、もう一度右向きにすることを繰り返します。

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

私の考え:

1) x と y の位置を変更するだけでよいと思いますが、ポップオーバーを閉じて、ローテーションでもう一度表示する必要があることも読みました。最初の問題が機能するかどうかはわかりますが、2番目の問題の方が心配です。

2) このローテーションの問題を修正する方法がわかりません。ポップオーバーが表示されずに横向きに回転すると見えるようです。そして、presentPopoverFromRect を呼び出すと、誤って iPad がまだ縦長ビューにあると考えてポップオーバーが作成されます。それが与えている動作ですが、iPad がこの間違いをしないようにする方法がわかりません。

-=-=-=-=-=-=-=-=-=

ご協力いただきありがとうございます。

-=-=-

ちょっとした更新:
1) 回転時にメイン ビューからポップオーバーを簡単に閉じることができました。そして、これは誰もがこの問題に対処する一般的な方法のようです.

2) フレームを変更したり、CGAffineTransformMakeRotation を使用したりなど、さまざまなことを試していますが、今のところうまくいきません

-=-=-

別の更新:

2) 多くのテストの後、UIAlertView に直接的な問題があるようです。ビューをUIAlertView内に配置すると(現在実行中)、AlertViewは画面が回転していることをポップオーバーに通知しません...したがって、問題が発生します

これを修正する唯一の方法は、UIAlertView を完全に削除することです。UIAlertView を表示する代わりに、さまざまなバックグラウンド ビューを手動で無効にし (Alert View が行っていたように)、AlertView に酷似したカスタム UIView を表示します。そこから、問題なくポップオーバーを表示できるはずです。私はそれがどのようになるかを教えてあげます。

-=-=-=-=-=-=-=-

最終的解決:

結局、独自のビューを作成し、そのビューに UIAlertView を模倣させました。次に、ポップオーバーを生成したときに、ルート ビュー コントローラーに配置しました。はるかにうまく機能しましたが、事前に作成された UIAlertView の代わりに独自のビューを手動で作成する必要があったため、より多くの作業が必要でした。いずれにせよ、どうやら UIAlertView は UIPopoverover サブビューにそれがどの回転にあるかを伝えるのに失敗したようです。

4

1 に答える 1

1

ポップオーバーを閉じてwillRotateToInterfaceOrientation、でもう一度表示しdidRotateFromInterfaceOrientationます。

問題なく動作します。

編集:申し訳ありませんが、私はあなたの2番目の問題を誤解しました。

ビュー階層の一部が不適切な方向で表示されている場合は、コントローラーの1つにshouldAutorotateToInterfaceOrientationメソッドがない可能性があります。

于 2012-05-07T17:10:36.660 に答える