通过代码将UIButton内的图片居中时出现约束冲突日志
这个问题我之前也碰到过,根源是UIButton内部的默认布局逻辑:当你只使用imageView而没有titleLabel时,系统依然会自动生成一个默认的水平偏移约束(就是你看到的centerX == UIButton.centerX +6),用来给title预留空间,这就和你手动添加的居中约束冲突了。
下面给你两种可行的解决方案:
方案一:利用UIButton内置属性布局(推荐)
不需要手动给imageView加约束,通过配置Button的内置对齐属性就能实现图片居中,这种方式完全贴合系统逻辑,不会产生冲突:
self.sendButton.contentEdgeInsets = UIEdgeInsets(top: 8, left: 12, bottom: 8, right: 12) // 设置图片在button内部的居中对齐 self.sendButton.contentHorizontalAlignment = .center self.sendButton.contentVerticalAlignment = .center // 若需要调整图片与button边缘的间距,可修改imageEdgeInsets self.sendButton.imageEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0) // 给button本身添加布局约束 self.sendButton.snp.makeConstraints { make in make.size.equalTo(36) make.centerY.equalTo(self) make.right.equalTo(self).offset(-5) }
方案二:手动移除系统约束,保留自定义约束
如果你一定要用SnapKit给imageView添加自定义约束,可以先移除系统自动生成的冲突约束,再添加自己的规则:
self.sendButton.contentEdgeInsets = UIEdgeInsets(top: 8, left: 12, bottom: 8, right: 12) self.sendButton.snp.makeConstraints { make in make.size.equalTo(36) make.centerY.equalTo(self) make.right.equalTo(self).offset(-5) } if let imageView = self.sendButton.imageView { // 先移除系统给imageView自动添加的所有约束 imageView.removeConstraints(imageView.constraints) // 关闭自动约束转换开关 imageView.translatesAutoresizingMaskIntoConstraints = false // 添加自定义的居中约束 imageView.snp.makeConstraints { make in make.width.height.equalTo(20) make.center.equalTo(self.sendButton) } }
补充:iOS 15+ 更优雅的实现方式
如果你的项目支持iOS 15及以上版本,推荐使用UIButton.Configuration来创建按钮,这种方式可以完全自定义布局,从根源上避免系统默认约束的干扰:
var config = UIButton.Configuration.plain() config.image = UIImage(named: "your-image-name") config.imagePlacement = .center config.imagePadding = 0 config.contentInsets = NSDirectionalEdgeInsets(top: 8, leading: 12, bottom: 8, trailing: 12) self.sendButton.configuration = config // 给button添加布局约束 self.sendButton.snp.makeConstraints { make in make.size.equalTo(36) make.centerY.equalTo(self) make.right.equalTo(self).offset(-5) }
内容的提问来源于stack exchange,提问作者Mathieu Rios
相关产品推荐
相关产品推荐

