iOS App代码设置约束时崩溃,如何在VFL约束中正确传入动态数值?
崩溃原因
- VFL语法拼接错误:你直接对
bannerPlacement做字符串插值时,没有符合VFL的间距语法规则。带不等式的间距标准写法是-(>=数值)-,你当前插值后生成的字符串是-(>=66.0-[,缺少了数值后的右括号和短横线,导致约束解析器无法识别格式直接崩溃。 - 动态值传入方式错误:VFL原生提供了
metrics参数用于传入动态数值,不需要手动拼接字符串,手动拼接很容易出现符号缺失、格式不符的问题。
修正方案
方案1:继续使用VFL,按规则传入动态值
修正垂直约束的构造代码,使用metrics传参,同时修正VFL语法:
let verticalContraint: [NSLayoutConstraint] = NSLayoutConstraint.constraints( withVisualFormat: "V:|-(>=bannerPlacement)-[toastView(==40)]-68-|", options: [], metrics: ["bannerPlacement": bannerPlacement], views: ["toastView": toastView] )
注意:原代码中的options参数传入的对齐规则是无效的,因为当前VFL只包含一个视图,对齐规则仅用于多视图约束场景,直接传空数组即可。
方案2(更推荐):使用锚点API构造约束
苹果现在更推荐使用锚点(Anchor)API写约束,不需要记忆VFL的语法规则,可读性和可维护性更高,等价代码如下:
// 替换原verticalContraint的构造代码 let topConstraint = toastView.topAnchor.constraint(greaterThanOrEqualTo: window.topAnchor, constant: bannerPlacement) let heightConstraint = toastView.heightAnchor.constraint(equalToConstant: 40) let bottomConstraint = toastView.bottomAnchor.constraint(equalTo: window.bottomAnchor, constant: -68) NSLayoutConstraint.activate([topConstraint, heightConstraint, bottomConstraint])
内容的提问来源于stack exchange,提问作者tech_human
相关产品推荐
相关产品推荐

