【问题标题】:Snapkit - is there a difference between right.width.center and right, width, center?Snapkit - right.width.center 和 right, width, center 有区别吗?
【发布时间】:2026-02-22 11:20:08
【问题描述】:

make.right.width.center equalTo(superview).offset(-20)

make.right.equalTo(superview).offset(-20)
make.width.equalTo(superview).offset(-20)
make.center.equalTo(superview).offset(-20) 
  • 定位任何对象(标签、图像等)时是否有不同。我正在查看另一个开发人员的代码并想到以下两件事之一: 1. 这是分组定位,非常有效。然后,我想,伙计,这可能是右侧的宽度和中心锚点吗?..有点困惑哈哈。任何帮助表示赞赏。谢谢。

【问题讨论】:

    标签: ios swift macos snapkit


    【解决方案1】:

    是的,效果一样

     greenView.snp.makeConstraints { make in
                make.right.width.centerX.centerY.equalTo(view).offset(-20)
                make.height.equalTo(130)
            }
    

    等于

       greenView.snp.makeConstraints { make in
                make.right.equalTo(view).offset(-20)
                make.width.equalTo(view).offset(-20)
                make.center.equalTo(view).offset(-20)
                make.height.equalTo(130)
            }
    

    可以从源码中阅读

    这个过程分为两部分,

    设置数据,然后激活布局约束


    • make.right.width.centerX.centerY.equalTo(view).offset(-20)的设置数据部分

    make.right 创建一个ConstraintMakerExtendable

    public var right: ConstraintMakerExtendable {
            return self.makeExtendableWithAttributes(.right)
        }
    

    通话

    internal func makeExtendableWithAttributes(_ attributes: ConstraintAttributes) -> ConstraintMakerExtendable {
            let description = ConstraintDescription(item: self.item, attributes: attributes)
            self.descriptions.append(description)
            return ConstraintMakerExtendable(description)
        }
    

    make.right.width,表示ConstraintMakerExtendabledescription.attributes加一个宽度ConstraintAttributes

    public var width: ConstraintMakerExtendable {
            self.description.attributes += .width
            return self
        }
    

    最后的.offset(-20),表示ConstraintMakerExtendable的偏移量已设置

    @discardableResult
        public func offset(_ amount: ConstraintOffsetTarget) -> ConstraintMakerEditable {
            self.description.constant = amount.constraintOffsetTargetValue
            return self
        }
    

    • make.right.width.centerX.centerY.equalTo(view).offset(-20)的活动布局约束部分

    makeConstraints{ make in }的实现

    internal static func makeConstraints(item: LayoutConstraintItem, closure: (_ make: ConstraintMaker) -> Void) {
            // prepare  the layout constraints 
            let constraints = prepareConstraints(item: item, closure: closure)
            //  active the layout constraints
            for constraint in constraints {
                constraint.activateIfNeeded(updatingExisting: false)
            }
        }
    

    准备布局约束

    重点是description.constraint

     internal static func prepareConstraints(item: LayoutConstraintItem, closure: (_ make: ConstraintMaker) -> Void) -> [Constraint] {
            let maker = ConstraintMaker(item: item)
            closure(maker)
            var constraints: [Constraint] = []
            for description in maker.descriptions {
                 // the key point
                guard let constraint = description.constraint else {
                    continue
                }
                constraints.append(constraint)
            }
            return constraints
        }
    

    description.constraint 初始化布局约束

    class Constraint 有一个属性layoutConstraints,它属于[LayoutConstraint]

    LayoutConstraint 继承自 NSLayoutConstraint

    这里是描述的偏移量

    internal lazy var constraint: Constraint? = {
            guard let relation = self.relation,
                  let related = self.related,
                  let sourceLocation = self.sourceLocation else {
                return nil
            }
            let from = ConstraintItem(target: self.item, attributes: self.attributes)
            
            return Constraint(
                from: from,
                to: related,
                relation: relation,
                sourceLocation: sourceLocation,
                label: self.label,
                multiplier: self.multiplier,
                constant: self.constant,      // here  it is
                priority: self.priority
            )
        }()
    
    

    • 所以这个案子很简单,

      make.right.equalTo(superview).offset(-20)
      make.width.equalTo(superview).offset(-20)
      make.center.equalTo(superview).offset(-20) 
      

    三个ConstraintMakerExtendable具有相同的偏移描述

    【讨论】:

      最近更新 更多