Swift中UIButton图片无法按AspectFit缩放问题求助
问题说明
双击触发事件后,给UIButton设置新图片并配置imageView?.contentMode = .scaleAspectFit,但图片仍保持原始尺寸,无法适配按钮大小。相关代码如下:
@objc private func didDoubleTap(_ gesture: UITapGestureRecognizer) { let likedImage = UIImage(named: "likedImage") likeButton.setImage(likedImage, for: .normal) likeButton.contentMode = .center //344 436 50 50 likeButton.imageView?.contentMode = .scaleAspectFit }
双击前效果:
双击后效果:
解决方法
UIButton的imageView默认会匹配图片原始尺寸,仅设置contentMode无法触发缩放,需配合调整按钮内容对齐方式及imageView的自适应规则:
方案1:调整按钮对齐+开启imageView自适应
修改按钮的内容对齐方式为填充,让imageView能占据按钮可用空间,同时开启自适应跟随按钮尺寸变化:
@objc private func didDoubleTap(_ gesture: UITapGestureRecognizer) { let likedImage = UIImage(named: "likedImage") likeButton.setImage(likedImage, for: .normal) // 设置按钮内容填充对齐,让imageView可扩展至按钮空间 likeButton.contentHorizontalAlignment = .fill likeButton.contentVerticalAlignment = .fill likeButton.imageView?.contentMode = .scaleAspectFit // 允许imageView随按钮尺寸自动调整 likeButton.imageView?.autoresizingMask = [.flexibleWidth, .flexibleHeight] }
方案2:修正图片渲染模式(针对矢量图或特殊图片)
若图片为矢量图或存在固定渲染尺寸问题,可修改其渲染模式:
let likedImage = UIImage(named: "likedImage")?.withRenderingMode(.alwaysOriginal)
方案3:配合内边距调整(可选)
如果需要控制图片与按钮边缘的间距,可添加imageEdgeInsets:
likeButton.imageEdgeInsets = UIEdgeInsets(top: 5, left: 5, bottom: 5, right: 5)
原理说明
UIButton的contentMode控制的是整体内容的对齐方式,而imageView?.contentMode才是图片的缩放规则。默认情况下imageView大小与图片原始尺寸绑定,通过设置按钮内容对齐为.fill,能让imageView获得可缩放的空间,再配合.scaleAspectFit即可实现图片等比例适配按钮尺寸。
内容的提问来源于stack exchange,提问作者Dave Borucki
相关产品推荐
相关产品推荐

