获取 UIAlertController 操作 sheet 宽度

Get UIAlertController action sheet width

我用头撞墙已经有一段时间了:

如何获取 UIAlertController 操作 sheet 视图的宽度?

alert.view.frame.width 得到 view.frame.width

此外,我看到了 问题,但它根本不起作用:它只是更改了警报的框架,我不知道如何从中获取宽度。

提前致谢。

.actionSheet 类型 UIAlertController 的宽度是 UIWindow(在纵向模式下)每边减去 10 个填充点的宽度,与设备方向无关。

例如在 iPhone 7 的情况下,其宽度为 375 点:

不出所料,355 点与我从 alert.view.frame.width 获得的值相同,因为该值是在 present(_:​animated:​completion:​) 的完成块中访问的,即在视图出现之后。

绝对是一个解决方案。但缺点可能是在完成块中添加具有正确宽度的自定义视图的延迟很小。看动图:

因此,另一种解决方案可能是,仅使用 this extension for UIDevice,然后通过检查 modelName,您可以设置不同设备的操作 sheet 的宽度值(可能有点hacky,但你可以避免延迟并且可以在完成块之前设置宽度)。下面是iOS10目前支持的设备actionsheets的不同宽度尺寸:

  • iPhone5/iPhone5s/iPhoneSE: 300
  • iPhone6/iPhone6s/iPhone7: 355
  • iPhone6Plus/iPhone6sPlus/iPhone7Plus: 394

  • iPad 9.7/12.9/Retina/Air1/Air2: 300

虽然来晚了,但迟到总比不到好。

警报视图控制器的宽度在约束中设置。要获取警报控制器的宽度,您可以使用:

for constraint in self.alertView.subviews[0].constraints {

  if constraint.firstAttribute == NSLayoutAttribute.width {
  print("\(constraint.constant)")
  break
  }
}