Objective-C如何通过代码修改按钮的系统图片颜色
你之前设置属性不生效,核心是没匹配按钮的渲染规则、API版本差异,直接按下面的场景套写法就行:
常见失效原因先排查
setTitleColor:forState:仅控制按钮文字颜色,对图片完全无效,不用再试这个属性- 单独修改
btn.imageView.tintColor没用,按钮切换状态时会自动重写内部imageView的配置,手动赋值会被覆盖 - 没改图片渲染模式、用错iOS版本对应API、Storyboard残留配置覆盖代码设置,是90%场景下的失效原因
分场景正确写法
1. iOS15以下版本 / 未使用Configuration新API
不管你用.system还是.custom类型的按钮,核心是给系统图片显式指定alwaysTemplate渲染模式,再给按钮本身设tintColor:
// 初始化按钮,用system类型会少很多配置坑 let btn = UIButton(type: .system) // 加载系统图片时必须显式改渲染模式,默认的automatic模式在custom类型、部分状态下会走原彩渲染,不响应tint let sysImage = UIImage(systemName: "heart.fill")?.withRenderingMode(.alwaysTemplate) btn.setImage(sysImage, for: .normal) // 直接给按钮设tintColor即可,不用碰内部imageView btn.tintColor = .systemPink
如果是从Storyboard拖线的按钮,先去Storyboard里把对应图片的Render As选项改成Template Image,不然Storyboard的默认Original Image配置会覆盖代码设置。
2. iOS15及以上版本 / 使用UIButton.Configuration新API
用Configuration配置按钮时,旧的tintColor、setImage:forState:属性优先级低于Configuration配置,直接在配置结构体里改颜色:
// 初始化对应样式的配置 var btnConfig = UIButton.Configuration.plain() // 设置系统图片,不用手动改渲染模式,配置会自动处理 btnConfig.image = UIImage(systemName: "heart.fill") // 方案1:统一设置前景色,同时生效于图片和按钮标题 btnConfig.baseForegroundColor = .systemGreen // 方案2:单独给图片设置颜色,不影响文字 btnConfig.imageColorTransformer = .init({ _ in .systemPurple }) // 用配置初始化按钮 let btn = UIButton(configuration: btnConfig)
额外注意
- 如果你是直接把UIImageView当成子视图加到按钮上、不是通过按钮自带的
setImage接口加的图,上面的方法都不生效,需要直接给你自定义的UIImageView设置tintColor,同时把图片渲染模式改成alwaysTemplate。 - 不要给按钮加多余的
setBackgroundImage配置当按钮图标,背景图的渲染逻辑和前景图不一样,要改背景图颜色需要单独处理图片的纯色渲染。
内容的提问来源于stack exchange,提问作者liangdapang
相关产品推荐
相关产品推荐

