Swift 使用SnapKit自动调整UILabel的大小

Swift 使用SnapKit自动调整UILabel的大小,swift,uiview,autolayout,uilabel,snapkit,Swift,Uiview,Autolayout,Uilabel,Snapkit,让我们假设CustomView的大小为300x300iconImageView具有其大小和指定的约束。我不知道UILabel中的文本将持续多长时间,因此我不想使UILabel的大小保持不变。我的目标是将左约束固定到iconImageView的右侧,将右约束固定到customView override func updateConstraints() { super.updateConstraints() iconImageView.snp.updateConstraints {

让我们假设
CustomView的
大小为300x300
iconImageView
具有其大小和指定的约束。我不知道
UILabel
中的文本将持续多长时间,因此我不想使
UILabel
的大小保持不变。我的目标是将左约束固定到
iconImageView
的右侧,将右约束固定到
customView

override func updateConstraints() {
    super.updateConstraints()

    iconImageView.snp.updateConstraints { (make) in
        make.left.equalTo(customView).offset(10)
        make.centerY.equalTo(customView)
        make.size.equalTo(CGSize(width: 40.0, height: 40.0))
    }

    nameLabel.snp.updateConstraints { (make) in
        make.right.equalTo(customView).offset(-10)
        make.left.equalTo(iconImageView.snp.right).offset(10)
        make.centerY.equalTo(customView)
    }
}

当我尝试这种方法时,我得到一个错误:
无法同时满足约束。
这样做的正确方法是什么?

好吧,我想您的子视图不知道关于顶部/底部约束的任何内容,这意味着视图不知道如何重新布局自己。试试这个:

override func updateConstraints() {
    super.updateConstraints()

    iconImageView.snp.updateConstraints { (make) in
        make.left.equalTo(customView).offset(10)
        make.centerY.equalTo(customView)

        // Also from my point of view this line \/ 
        // is not very readable
        //  make.size.equalTo(CGSize(width: 40.0, height: 40.0))
        // Changed to:
        make.width.height.equalTo(40.0)
    }

    nameLabel.snp.updateConstraints { (make) in
        make.right.equalTo(customView).offset(-10)
        make.left.equalTo(iconImageView.snp.right).offset(10)

        // Add:
        make.top.equalTo(customView.snp.top)
        make.bottom.equalTo(customView.snp.bottom)
    }
}
如果您想保持标签的“默认”高度(如果是空字符串等),可以添加:

make.height.greaterThanOrEqual(40.0)
此外,autolayout和框架不能很好地协同工作,因此您应该在“updateConstraints”方法中布局自定义视图,如下所示:

customView.snp.updateConstraints { (make) in 
     make.edges.equalTo(self)
}

嗯,我想你的子视图不知道任何关于上/下约束的东西,这意味着视图不知道如何重新布局自己。试试这个:

override func updateConstraints() {
    super.updateConstraints()

    iconImageView.snp.updateConstraints { (make) in
        make.left.equalTo(customView).offset(10)
        make.centerY.equalTo(customView)

        // Also from my point of view this line \/ 
        // is not very readable
        //  make.size.equalTo(CGSize(width: 40.0, height: 40.0))
        // Changed to:
        make.width.height.equalTo(40.0)
    }

    nameLabel.snp.updateConstraints { (make) in
        make.right.equalTo(customView).offset(-10)
        make.left.equalTo(iconImageView.snp.right).offset(10)

        // Add:
        make.top.equalTo(customView.snp.top)
        make.bottom.equalTo(customView.snp.bottom)
    }
}
如果您想保持标签的“默认”高度(如果是空字符串等),可以添加:

make.height.greaterThanOrEqual(40.0)
此外,autolayout和框架不能很好地协同工作,因此您应该在“updateConstraints”方法中布局自定义视图,如下所示:

customView.snp.updateConstraints { (make) in 
     make.edges.equalTo(self)
}

六羟甲基三聚氰胺六甲醚。。。我刚试过你的代码,效果很好。我假设这段代码在
UIView
子类中?该视图相对于其SuperView有适当的约束?并且
customView
具有适当的约束,使其成为300x300并定位在该视图中?此代码位于UIView子类中,并且相对于superview具有适当的约束。当我滑动到另一个ViewController时出错,因为此视图是UIPageViewController的一部分。嗯。。。我想我们需要更多的关于你什么时候出错的信息。不过,您应该首先在这里通读关于重写
updateConstraints()
的讨论(它可能只提供您需要开始的信息):嗯。。。我刚试过你的代码,效果很好。我假设这段代码在
UIView
子类中?该视图相对于其SuperView有适当的约束?并且
customView
具有适当的约束,使其成为300x300并定位在该视图中?此代码位于UIView子类中,并且相对于superview具有适当的约束。当我滑动到另一个ViewController时出错,因为此视图是UIPageViewController的一部分。嗯。。。我想我们需要更多的关于你什么时候出错的信息。不过,您应该首先在此处通读有关重写
updateConstraints()
的讨论(它可能只提供您需要开始的信息):