【发布时间】:2019-11-03 12:05:09
【问题描述】:
我们需要使用UITextView(即多行文本输入)来允许用户输入信息。 UITextView 不适用于自动调整大小,因此我们使用 UIAlertController 视图的边界设置约束。根据辅助功能设置存在布局问题。
例如,在较大的文本设置下,这是一个漂亮而整洁的布局:
但是使用相同的约束,这是使用默认文本设置的样子:
不好!我们不想陷入为每个模型和文本大小设置自定义代码的兔子洞。是否有合法的方式来获取消息和操作的视图,以便我们可以与这些功能保持一致?
“合法”,因为UIAlertController 的官方文档表明(强调我的):
重要
UIAlertController类旨在按原样使用,不支持子类化。 此类的视图层次结构是私有的,不得修改。
并且已经确认,当我们迭代 [[alertController view] subviews] 时,这些操作(Cancel 和 Submit 按钮)似乎不可见,所以我们在这里必须小心。
另外,对于所有 iPhone 型号,safeAreaInsets 是 {0, 0, 0, 0},所以这里没有任何帮助。
我猜大部分问题出在按钮的堆叠上,所以如果有办法检测到该配置,那将解决大部分布局问题。
这是一个较旧的应用程序,所以我们使用 Objective-C 进行编码,但 Swift 解决方案也可以。
【问题讨论】:
-
要以这种方式使用
UITextView获得一致的外观,最好的办法是创建自己的视图控制器并以模态方式呈现它。使用委托/协议模式与呈现控制器进行通信(点击了哪个按钮、文本视图的内容等)。 -
正确的解决方法是不要使用
UIAlertController。编写(或查找)正确支持使用文本视图的自定义警报。
标签: objective-c layout accessibility vertical-alignment ios12