呈现警报控制器时 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 中。由于某种原因,在关闭警报视图后,没有调用 viewWillAppear
或 viewDidAppear
方法,并且导航控制器委托也没有回复此移动,因此视图控制器不参与计算它的大小。所以我把它放在viewWillLayoutSubviews
。这个question 描述了设置preferredContentSize
的魔力。我还需要恢复视图框架,因为它仍然缩小了。 UIViewController
preferredContentSize
应该更早地设置在别处。
希望这对某人有所帮助。
【讨论】:
【参考方案4】:当您使用modalPresentationStyle = UIModalPresentationStyle.CurrentContext
显示UIViewController
并使用UIAlertController
显示警报时会出现问题。请改用UIModalPresentationStyle.OverCurrentContext
。
【讨论】:
以上是关于呈现警报控制器时 UIPopOverController 缩小的主要内容,如果未能解决你的问题,请参考以下文章
当应用程序准备好呈现警报时,从 AppDelegate 呈现警报
谷歌地图 + javascript 仅在警报被编码时正确呈现