2017-03-16 23 views
1

我一直在敲打我的头靠在墙上,现在一会儿:获取UIAlertController动作片宽度

我怎样才能得到一个UIAlertController动作片的看法的宽度是多少?

说出alert.view.frame.width给出view.frame.width

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

在此先感谢。

+0

我非常想回答这个问题! – Dopapp

+0

看看这里:http://stackoverflow.com/questions/40933616/ios-swift-3-uialertcontroller-width – ronatory

+0

@ronatory,我不想设置宽度,我只想得到它 – IHaveAQuestion

回答

1

.actionSheet类型的宽度UIAlertControllerUIWindow(纵向模式)的宽度减去每边10个填充点的宽度,而不考虑设备方向。

E.g.在iPhone 7,其具有375点的宽度的情况下:

enter image description here

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

+0

当我在呈现'alert'之前调用'alert.view.frame.width'时,我得到的宽度是375.这是为什么? – IHaveAQuestion

+0

另外,它与iPad不同,所以我需要一种非硬编码的方式来获得宽度 – IHaveAQuestion

+0

因为包含视图的视图控制器尚未显示。为什么它是375而不是0,我不确定,但我相信它属于你所谓的“无证行为”。 – xoudini

0

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

enter image description here

因此,一个替代的解决方案可能是,只使用this extension for UIDevice,然后通过检查modelName,您可以设置不同的设备(的动作片的宽度值也许有点有点哈克,但你会避免延迟,并可以在完成块之前设置宽度)。下面是iOS10的当前支持的装置的动作的片材的不同的宽度尺寸:

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

  • iPad的9.7/12.9 /视网膜/ AIR1/AIR2:300

0

虽然我迟到了这里,但更好的升吃比从不吃。

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

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

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