如何在 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] 更改旋转约束

如何在 Objc 项目中使用 SnapKit?

Snapkit:如何在 scrollView 中嵌入一个简单的 tableView?

如何使用 SnapKit 在 ScrollView 中居中按钮数组

如何使用 SnapKit 在 iOS 中使用纵横比约束?