在 iPad 中居中 uipopover

Posted

技术标签:

【中文标题】在 iPad 中居中 uipopover【英文标题】:centering a uipopover in iPad 【发布时间】:2010-11-19 18:50:34 【问题描述】:

我想为 iPad 创建一个新键盘。

我设计了一个视图,该视图具有键和所有底层工作以在用户按下键时填充文本框,并在用户按下返回按钮时将值传递回调用例程。

一切正常。

现在 - 我想将此视图创建为弹出框。

我已经完成了基本操作(弹出并被关闭)

但现在我需要一些微调帮助。

这是我的问题......

1) 如何在没有 UIPopoverArrowDirectionAny 选择的情况下创建一个以屏幕为中心的弹出窗口?

2) 确保弹出窗口的大小是我在 XIB 文件中创建的大小(目前,它会调整大小并删除窗口最右边的一些大小)

谢谢 托尼

【问题讨论】:

【参考方案1】:

要在没有箭头的情况下显示它,请为“permittedArrowDirections”传递 0:

[popOverController presentPopoverFromRect:rect inView:view permittedArrowDirections:0 animated:YES];

要使其居中,请传递一个位于视图中心的 1x1 矩形:

CGRect rect = CGRectMake(viewWidth/2, viewHeight/2, 1, 1);
[popOverController presentPopoverFromRect:rect inView:view permittedArrowDirections:0 animated:YES];

然后你有一个居中且无箭头的弹出框。

关于移除箭头的部分可能随时中断。他们没有提供 UIPopoverArrowDirectionNone 选项是有原因的,他们可能会选择在将来通过 0 时抛出异常,或者默认为某些东西。使用它需要您自担风险。

【讨论】:

对于横向模式下的 iPad,我必须切换 CGRectMake 的宽度和高度才能正确居中。 也适用于 ios 7.0.x。 快速使用 UIPopoverArrowDirection.allZeros 删除箭头【参考方案2】:

如果您使用的是 UIPopoverController,它将有一个箭头。这是您的选择。

UIPopoverArrowDirectionAny  
UIPopoverArrowDirectionUp
UIPopoverArrowDirectionDown
UIPopoverArrowDirectionLeft
UIPopoverArrowDirectionRight

如你所见,没有 UIPopoverArrowDirectionNone

至于XIB大小,在你的ViewDidLoad方法的实现文件中,可以设置如下。

self.contentSizeForViewInPopover = CGSizeMake(320.0, 360.0);

您可以随意设置弹出框的大小。

【讨论】:

是的,但如果你硬编码一个 0 就像 UIPopoverArrowDirectionNone【参考方案3】:

我刚刚完成了这个,但想在故事板中做尽可能多的事情,这会稍微改变方法:

1) 选择情节提要中的弹出框并取消勾选上/下/左/右方向以摆脱箭头。

要将它集中在屏幕覆盖上,为 segue 做准备并执行以下操作:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
    UIStoryboardPopoverSegue* popover = (UIStoryboardPopoverSegue*)segue;
    CGFloat horizontalInset = (self.view.frame.size.width - popover.popoverController.popoverContentSize.width) / (CGFloat)2.0;
    CGFloat verticalInset = (self.view.frame.size.height - popover.popoverController.popoverContentSize.height) / (CGFloat)2.0;
    popover.popoverController.popoverLayoutMargins =
        UIEdgeInsetsMake(
            verticalInset,
          horizontalInset,
            verticalInset,
          horizontalInset);

在我的例子中,我还发现 popover segue 的圆角半径与我的设计不匹配,因此我将背景颜色更改为清除以对其进行排序,即将其添加到上面的块中:

popover.popoverController.backgroundColor = [UIColor clearColor];

2) 在 segue 的目标控制器中找到属性 'Popover' 并勾选 'Use Explicit Size' 并将您希望它显示为 popover 模式的大小。

【讨论】:

以上是关于在 iPad 中居中 uipopover的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ViewController 中居中多个按钮?

创建没有箭头并在 UIViewController 中居中的 PopOver

在 UIView 中居中 UIImageView

在 UIScrollView 中居中 UIButtons

如何在ActionBar中居中徽标?

在 Bootstrap 的列中居中内容