iOS Swift:UIAlertController的maximumContentSizeCategory失效,如何设置最大动态字体?
解决UIAlertController最大动态字体大小不生效的问题
直接设置alertController.view.maximumContentSizeCategory无效的核心原因是:UIAlertController的内部文本控件(标题标签、按钮标题标签)不会自动继承父容器视图的该属性,必须单独为这些子控件配置最大内容尺寸类别。
可行方案:遍历子视图设置属性
- 先给
UIView添加一个遍历子视图的扩展,方便递归查找所有内部控件:
extension UIView { func traverseSubviews(_ handler: (UIView) -> Void) { handler(self) subviews.forEach { $0.traverseSubviews(handler) } } }
- 创建并配置UIAlertController时,遍历其所有子视图,为文本类控件设置最大内容尺寸:
let alertController = UIAlertController(title: "Test", message: nil, preferredStyle: .actionSheet) alertController.addAction(UIAlertAction(title: "Cancel", style: .cancel)) // 遍历所有子视图,为标签和按钮标题设置最大动态字体限制 alertController.view.traverseSubviews { view in if let label = view as? UILabel { label.maximumContentSizeCategory = .extraExtraExtraLarge } else if let button = view as? UIButton { button.titleLabel?.maximumContentSizeCategory = .extraExtraExtraLarge } } present(alertController, animated: true, completion: nil)
补充说明
- 该方法同时适用于
.alert和.actionSheet两种样式的UIAlertController。 - 避免子类化UIAlertController(苹果官方不推荐这种做法),遍历子视图是更安全的替代方案。
内容的提问来源于stack exchange,提问作者srgray
相关产品推荐
相关产品推荐

