4

iPad で縦表示から横表示 (およびその逆) に切り替えると、ポップオーバー ビューの位置が文字化けします。ポップオーバービューのフレームを計算する方法は次のとおりです。

aRect = self.myElement.frame;
aRect.origin.x += aRect.size.width;

[aPopOver presentPopoverFromRect:aRect inView:self.myElement.superview permittedArrowDirections:UIPopoverArrowDirectionRight animated:YES];

ここで何が悪いのか教えてください。

4

4 に答える 4

5

UIPopoverControllerのドキュメントから: (強調は鉱山)

ポップオーバーが表示されているときにユーザーがデバイスを回転すると、ポップオーバー コントローラーはポップオーバーを非表示にし、回転の最後に再び表示します。ポップオーバー コントローラーは、ポップオーバーを適切に配置しようとしますが、場合によっては、再度表示するか、完全に非表示にする必要があります。たとえば、バー ボタン アイテムから表示される場合、ポップオーバー コントローラーは、バー ボタン アイテムの位置の変更を考慮して、ポップオーバーの位置 (場合によってはサイズ) を自動的に調整します。ただし、回転中にバー ボタン項目を削除した場合、またはビュー内の対象の四角形からポップオーバーを表示した場合の場合、ポップオーバー コントローラーはポップオーバーの再配置を試みません。そのような場合は、ポップオーバーを手動で非表示にするか、適切な新しい位置から再度表示する必要があります。 これは、ポップオーバーの表示に使用したビュー コントローラーのdidRotateFromInterfaceOrientation:メソッドで行うことができます 。

于 2010-10-04T23:23:23.483 に答える
1

これは古い質問ですが、OPがKris Markelの提案で何をすべきかが明確ではなかったようです. これはTechnical Q&A QA1694に記載されています。ポップオーバーをもう一度提示するだけです。

上記のポップオーバー コードを というメソッドに配置したとしshowPopoverます。ローテーションでそのメソッドを呼び出すだけで、最初に表示されていることを確認します。

-(void)showPopover {
    aRect = self.myElement.frame;
    aRect.origin.x += aRect.size.width;

    [self.aPopOver presentPopoverFromRect:aRect inView:self.myElement.superview permittedArrowDirections:UIPopoverArrowDirectionRight animated:YES];
}

-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)oldOrientation
{
    if ([self.aPopover isPopoverVisible]) {
        [self showPopover];
    }
}
于 2013-05-07T19:58:44.480 に答える
1

わかりました、私はあなたのコードに何か奇妙なことに気づきました。

幅のサイズを aRect の x 位置の原点に追加する理由は何ですか? aRect.origin.x += aRect.size.width;

これを右上隅にしたいと思っています....

.m ファイルのコードのコメントを外して、次のようにすることができます。

// Override to allow orientations other than the default portrait orientation.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
     Return YES; // for supported orientations
    //otherwise return (interfaceOrientation == UIInterfaceOrientationLandscape); if you want only landscape mode.
}

または、サブビューをレイアウトしたい場合に私があなたの状況で行うことは、didRotateFromIntferfaceOrientation: を使用することです。

(void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    [self layoutSubviews];
}

また、layoutSubviews

- (void)layoutSubviews
{
    NSLog(@"layoutSubviews called");

    ...recalc rects etc based on the new self.view.bounds...
}

そのように動作します。

PK

于 2010-10-04T23:19:00.863 に答える