如何在 snapkit 中更改 offset() 和 multipliedBy() 的优先级
Posted
技术标签:
【中文标题】如何在 snapkit 中更改 offset() 和 multipliedBy() 的优先级【英文标题】:how to change priority of offset() and multipliedBy() in snapkit 【发布时间】:2020-04-16 09:00:54 【问题描述】:我想把 UIView 的尺寸设为:height = (width - 100) * 0.5
,所以代码是这样的:
view.snp.makeConstraints
$0.top.left.right.equalTo(0)
$0.height.equalTo(view.snp.width).offset(-100).multipliedBy(0.5)
但高度结果等于width * 0.5 - 100
,
如何更改offset()
和multipliedBy()
的优先级?
【问题讨论】:
【参考方案1】:如您所见,自动布局首先应用 multiplier,然后应用 constant。
来自 Apple 的文档:
要实现您的目标,您需要使用其他视图,或者更好的是UILayoutGuide
。
告诉自动布局您希望 otherView/layoutGuide 为 viewWidth - 100
,然后您希望 view 为 该值 * 0.5
。
这是一个例子:
class SnapTestViewController: UIViewController
override func viewDidLoad()
super.viewDidLoad()
// create a view
let testView = UIView()
testView.backgroundColor = .orange
// create a Layout Guide
let vGuide = UILayoutGuide()
// add the layout guide to the testView
testView.addLayoutGuide(vGuide)
// constrain the layout guide
vGuide.snp.makeConstraints
// to bottom-left corner
$0.leading.bottom.equalToSuperview()
// height doesn't really matter (it's not visible)
$0.height.equalTo(1)
// width = superView (testView) width - 100
$0.width.equalToSuperview().offset(-100)
// add testView to self.view
view.addSubview(testView)
// constrain testView
testView.snp.makeConstraints
// 40-pts leading and trailing
$0.leading.trailing.equalToSuperview().inset(40)
// 100-pts from the top
$0.top.equalToSuperview().offset(100)
// height = layoutGuide height * 0.5
$0.height.equalTo(vGuide.snp.width).multipliedBy(0.5)
【讨论】:
【参考方案2】:我认为,如果您想在描述中使用height = (width - 100) * 0.5
,那么您的代码应该更改为:-
view.snp.makeConstraints
$0.top.left.right.equalTo(8)
let calculatedHeight:CGFloat = (view.bounds.width - 100) * 0.5
$0.height.equalTo(calculatedHeight).priority(.required)
您可以使用枚举 SnapKit 的 ConstraintPriority 更改优先级,如官方documentation 中所述,请查看上面的示例代码。
【讨论】:
(view.snp.width - 100) * 0.5
抛出异常:二元运算符“-”不能应用于“ConstraintItem”和“TimeInterval”(又名“Double”)类型的操作数
您的代码中的@JoShin 是“查看”ViewController 的主要完整视图?
UIImageView
等
我编辑并使用 view.bounds.width,应该可以修复错误,但您的 imageView 应该设置宽度以获得所需的结果以上是关于如何在 snapkit 中更改 offset() 和 multipliedBy() 的优先级的主要内容,如果未能解决你的问题,请参考以下文章
如何获取 snapkit 为 UIView 声明的高度约束?
Snapkit:如何在 scrollView 中嵌入一个简单的 tableView?