4

当我在 iPad 中的纵向视图和横向视图 (&Vice Versa) 之间切换时,我的弹出视图的位置会出现乱码。这是我计算弹出视图框架的方法:

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

好的,我注意到您的代码有些奇怪。

有什么理由将宽的大小添加到 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 回答
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 回答
0

在视图控制器中使用下面提到的 UIPopoverPresentationControllerDelegate 方法。

func popoverPresentationController(_ popoverPresentationController: UIPopoverPresentationController,
                                   willRepositionPopoverTo rect: UnsafeMutablePointer<CGRect>,
                                   in view: AutoreleasingUnsafeMutablePointer<UIView>) {
    rect.pointee = self.view.bounds
}
于 2019-05-27T03:24:16.167 回答