【问题标题】:Get UIAlertController action sheet width获取 UIAlertController 操作表宽度
【发布时间】:2017-03-16 20:57:51
【问题描述】:

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

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

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

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

提前致谢。

【问题讨论】:

  • 我非常希望得到这个答案!
  • @ronatory,我不想设置宽度,我只想得到它
  • "alert.view.frame.width 给出view.frame.width" – 我得到了正确的结果,你的这个陈述是什么意思?

标签: ios swift swift3 uialertview uialertcontroller


【解决方案1】:

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

例如对于宽度为 375 磅的 iPhone 7:

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

【讨论】:

  • 当我在呈现alert之前调用alert.view.frame.width,得到的宽度是375。这是为什么呢?
  • 另外,iPad 是不同的,所以我需要一种非硬编码的方式来获取宽度
  • 因为包含视图的视图控制器尚未呈现。为什么它是 375 而不是 0,我不确定,但我相信它属于您所谓的“无证行为”。
  • @IHaveAQuestion 你到底需要什么?显然,仅从完成块中获取值还不够?
  • 我想在警报中显示一个自定义视图
【解决方案2】:

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

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

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

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

【讨论】:

    【解决方案3】:

    虽然我来晚了,但迟到总比没有好。

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

    for constraint in self.alertView.subviews[0].constraints {
    
      if constraint.firstAttribute == NSLayoutAttribute.width {
      print("\(constraint.constant)")
      break
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-09-21
      • 1970-01-01
      • 1970-01-01
      • 2019-11-03
      • 1970-01-01
      • 2016-04-05
      • 2017-05-16
      • 1970-01-01
      • 2016-02-18
      相关资源
      最近更新 更多