Swift 4中如何自定义MDCAlertController的尺寸?
自定义MDCAlertController尺寸(Swift 4)
哈哈,这个问题我太熟了!直接改view.bounds或者frame肯定没用的,MDCAlertController内部有一套自己的布局约束在管控尺寸,直接硬改会被它的内部逻辑覆盖掉。给你几个亲测有效的方法:
方法一:使用preferredContentSize属性
这是最直接的方式,因为MDCAlertController继承自UIViewController,而preferredContentSize是UIViewController的标准属性,可以用来指定弹窗的偏好尺寸。
代码示例:
let alertController = MDCAlertController(title: "Alert", message: "message") // 设置你想要的尺寸 alertController.preferredContentSize = CGSize(width: 300, height: 250) // 剩下的样式设置不变 alertController.backgroundColor = UIColor(red: 0.2, green: 0.2, blue: 0.2, alpha: 1.0) alertController.titleColor = .white alertController.messageColor = .white
不过要注意:如果弹窗内的内容(比如长消息、多个按钮)太多,这个属性的优先级会低于内容的布局需求,弹窗还是会自动扩展高度来适配内容。如果要强制固定高度,得结合下面的约束方法。
方法二:添加自定义布局约束
通过给alertController的view添加明确的宽度和高度约束,可以强制覆盖内部的布局逻辑。步骤如下:
- 关闭view的自动转换约束(
translatesAutoresizingMaskIntoConstraints) - 激活自定义的宽高约束
代码示例:
let alertController = MDCAlertController(title: "Alert", message: "message") // 关闭自动约束转换 alertController.view.translatesAutoresizingMaskIntoConstraints = false // 添加宽高约束 NSLayoutConstraint.activate([ alertController.view.widthAnchor.constraint(equalToConstant: 300), alertController.view.heightAnchor.constraint(equalToConstant: 250) ]) // 样式设置...
如果遇到约束冲突的情况,可以给自定义约束设置稍低一点的优先级(比如999),避免和内部约束打架:
let widthConstraint = alertController.view.widthAnchor.constraint(equalToConstant: 300) widthConstraint.priority = UILayoutPriority(rawValue: 999) let heightConstraint = alertController.view.heightAnchor.constraint(equalToConstant: 250) heightConstraint.priority = UILayoutPriority(rawValue: 999) NSLayoutConstraint.activate([widthConstraint, heightConstraint])
方法三:自定义子类(全局复用)
如果你的项目里需要多个统一尺寸的弹窗,直接写个MDCAlertController的子类会更方便,不用每次都重复写尺寸设置代码:
class CustomStyledAlertController: MDCAlertController { override func viewDidLoad() { super.viewDidLoad() // 统一设置尺寸 preferredContentSize = CGSize(width: 300, height: 250) // 也可以用约束方式 view.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ view.widthAnchor.constraint(equalToConstant: 300), view.heightAnchor.constraint(equalToConstant: 250) ]) // 还可以把你常用的样式也统一设置在这里 backgroundColor = UIColor(red: 0.2, green: 0.2, blue: 0.2, alpha: 1.0) titleColor = .white messageColor = .white } }
使用的时候直接实例化这个子类就行:
let alert = CustomStyledAlertController(title: "Alert", message: "message") // 添加按钮等操作...
另外提个小细节:MDCAlertController有默认的最小宽度限制,如果设置的宽度太小可能不会生效,你可以根据需求调整,或者结合约束优先级来处理。
内容的提问来源于stack exchange,提问作者deevee
相关产品推荐
相关产品推荐

