呈现警报控制器时 UIPopOverController 缩小

Posted

技术标签:

【中文标题】呈现警报控制器时 UIPopOverController 缩小【英文标题】:UIPopOverController shrinking when presenting alert controller 【发布时间】:2014-09-24 19:06:49 【问题描述】:

我在 iPad 上有以下 UIPopOverController。这是一个带有通用故事板的 ios 8 应用程序。在 XCode 中,我选择了这个的 segue 为“Present as Popover”。

只要这个视图控制器呈现一个 UIAlertController,就会发生这种情况:

弹出框缩小到一个奇怪的大小。 UIAlertController 从弹出窗口显示为:

        var alert = UIAlertController(title: NSLocalizedString("Error", comment: "A simple error label"), message: NSLocalizedString("This account is already linked to the app.", comment: "A string describing the problem"), preferredStyle: .Alert)
        var action = UIAlertAction(title: NSLocalizedString("OK", comment: "Simple string"), style: UIAlertActionStyle.Default, handler:  (action: UIAlertAction!) in
            self.usernameTextField.becomeFirstResponder()
            self.passwordTextField.text = ""
            return
        )
        alert.addAction(action)
        self.presentViewController(alert, animated: true, completion: nil)

我根本没有玩过视图控制器的约束,所以我不知道为什么会这样。防止这种情况发生的正确方法是什么?

【问题讨论】:

您的问题有解决方案吗?因为我有同样的问题。 很遗憾没有。还在找。 显然这个错误会在 iOS 9.0 中回归 【参考方案1】:

这似乎是 iOS 8.0.2 及更低版本的错误。我所有的设备现在都更新到 iOS 8.1。我没有更改我的代码,并且我的所有弹出框在它们出现时都不会缩小。

【讨论】:

【参考方案2】:

它对我有用。 nav.preferredContentSize =CGSizeMake(320, 480); 我的代码如下,可能对你有帮助。

UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:myController];
nav.preferredContentSize =CGSizeMake(320, 480);
popOver = [[UIPopoverController alloc] initWithContentViewController:nav];
[popOver presentPopoverFromRect:frame inView:self.view permittedArrowDirections:UIPopoverArrowDirectionRight animated:NO];

【讨论】:

【参考方案3】:

也许现在为时已晚,但我在 iOS9.0 上也遇到了同样的问题。 我有一个UINavigationController 控制器,其根UIViewController 放置在UIPopoverController 内。在从UIViewController 呈现UIAlertController 后,弹出框会缩小以提醒视图大小。 经过一番研究,我提出了这个解决方案:

- (void)viewWillLayoutSubviews

    CGSize preferredContentSize = self.preferredContentSize;
    CGSize fakeMomentarySize    = CGSizeMake(preferredContentSize.width + 1.0f, preferredContentSize.height + 1.0f);
    self.preferredContentSize   = fakeMomentarySize;
    self.preferredContentSize   = preferredContentSize;

    CGRect frame    = self.view.frame;
    frame.size      = [self preferredContentSize];
    self.view.frame = frame;

    [super viewWillLayoutSubviews];

我已将此代码放在我的 UIViewController 中。由于某种原因,在关闭警报视图后,没有调用 viewWillAppearviewDidAppear 方法,并且导航控制器委托也没有回复此移动,因此视图控制器不参与计算它的大小。所以我把它放在viewWillLayoutSubviews。这个question 描述了设置preferredContentSize 的魔力。我还需要恢复视图框架,因为它仍然缩小了。 UIViewController preferredContentSize 应该更早地设置在别处。

希望这对某人有所帮助。

【讨论】:

【参考方案4】:

当您使用modalPresentationStyle = UIModalPresentationStyle.CurrentContext 显示UIViewController 并使用UIAlertController 显示警报时会出现问题。请改用UIModalPresentationStyle.OverCurrentContext

【讨论】:

以上是关于呈现警报控制器时 UIPopOverController 缩小的主要内容,如果未能解决你的问题,请参考以下文章

当应用程序准备好呈现警报时,从 AppDelegate 呈现警报

iOS 应用程序在警报视图关闭时崩溃

谷歌地图 + javascript 仅在警报被编码时正确呈现

UIAlertController 错误当在 swift 中以模态呈现的视图控制器中调用时

使模态控制器下的区域可滚动

使用 UIAlertController 在 UIImagePicker 中“应用程序试图以模态方式呈现活动控制器”