如何让UIButton的标题与图片随按钮尺寸动态缩放?
一、图片自动适配缩放
默认UIButton的imageView不会自动跟随按钮尺寸缩放,需调整其显示模式:
- 在Storyboard中选中按钮,进入Attributes Inspector,找到
Image区域的Content Mode,设置为Aspect Fit(保持图片比例完整显示)或Aspect Fill(填满容器,需开启裁剪)。 - 代码设置方式(可在
viewDidLoad中添加):
myBtn.imageView?.contentMode = .scaleAspectFit myBtn.imageView?.clipsToBounds = true // 使用Aspect Fill时需开启,避免图片溢出
二、标题文本自动适配缩放
让标题随按钮宽度自动调整字号,需开启字体自适应并设置最小缩放比例:
- Storyboard设置:选中按钮,在Attributes Inspector的
Control区域,勾选Adjust Font Size to Fit Width,并设置Minimum Font Scale(例如0.5,代表最小缩放到原字体的50%)。 - 代码设置方式:
myBtn.titleLabel?.adjustsFontSizeToFitWidth = true myBtn.titleLabel?.minimumScaleFactor = 0.5 myBtn.titleLabel?.baselineAdjustment = .alignCenters // 保持文本居中对齐
三、精准比例适配(自定义UIButton子类)
如果需要严格按照按钮尺寸的缩放比例同步调整图片和标题大小,建议自定义按钮子类,重写layoutSubviews方法实现:
import UIKit class ScalingButton: UIButton { // 保存初始的图片尺寸和字体大小,作为缩放基准 private var originalImageSize: CGSize? private var originalFontSize: CGFloat? override func awakeFromNib() { super.awakeFromNib() // 记录初始状态 originalImageSize = imageView?.bounds.size originalFontSize = titleLabel?.font.pointSize // 基础配置 imageView?.contentMode = .scaleAspectFit titleLabel?.adjustsFontSizeToFitWidth = false // 关闭系统自动调整,改用自定义缩放逻辑 titleLabel?.baselineAdjustment = .alignCenters } override func layoutSubviews() { super.layoutSubviews() guard let originalImageSize = originalImageSize, let originalFontSize = originalFontSize else { return } // 计算缩放比例:取按钮宽高相对于初始值的最小比例,避免图片/文字变形 let scaleX = bounds.width / originalImageSize.width let scaleY = bounds.height / originalImageSize.height let scale = min(scaleX, scaleY) // 调整图片大小并居中 if let imageView = imageView { let newImageSize = CGSize(width: originalImageSize.width * scale, height: originalImageSize.height * scale) imageView.bounds = CGRect(origin: imageView.bounds.origin, size: newImageSize) imageView.center = CGPoint(x: bounds.midX, y: bounds.midY - (titleLabel?.bounds.height ?? 0)/2 - 8) // 8为图片与标题的间距,可按需调整 } // 调整字体大小并居中 if let titleLabel = titleLabel { titleLabel.font = titleLabel.font.withSize(originalFontSize * scale) titleLabel.center = CGPoint(x: bounds.midX, y: bounds.midY + (imageView?.bounds.height ?? 0)/2 + 8) } } }
使用时,在Storyboard的Identity Inspector中,将按钮的自定义类改为ScalingButton即可,按钮尺寸变化时,图片和标题会按初始比例同步缩放。
注意事项
- 若按钮通过Auto Layout约束调整尺寸,上述方法依然有效,因为
layoutSubviews会在约束更新时自动调用。 - 使用自定义子类时,需确保在Storyboard中设置好按钮的初始尺寸,保证
originalImageSize和originalFontSize能正确获取初始值。
内容的提问来源于stack exchange,提问作者MrSakhr
相关产品推荐
相关产品推荐

