惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 司徒正美
大猫的无限游戏
大猫的无限游戏
腾讯CDC
J
Java Code Geeks
博客园 - 【当耐特】
Microsoft Azure Blog
Microsoft Azure Blog
V
Visual Studio Blog
人人都是产品经理
人人都是产品经理
博客园 - Franky
博客园 - 聂微东
阮一峰的网络日志
阮一峰的网络日志
美团技术团队
云风的 BLOG
云风的 BLOG
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
U
Unit 42
雷峰网
雷峰网
B
Blog RSS Feed
博客园_首页
量子位
F
Fortinet All Blogs
罗磊的独立博客
H
Hackread – Cybersecurity News, Data Breaches, AI and More
酷 壳 – CoolShell
酷 壳 – CoolShell
C
Check Point Blog

博客园_首页

Plist 二进制格式 Milvus 和 PGVector,哪个更好? OpenClaw 已过时?在 VS Code 中运行 Hermes Agent! 分享一下笔者的 Mac 装机必备软件 第30篇文章:一个大三计科生的自白 Manim如何在数学公式中完美显示中文? Docker 部署 RocketMQ 5 并发编程核心概念辨析 C#事务处理最佳实践:别再让“主表存了、明细丢了”的破事发生 CLI 是什么?为什么大厂突然集体卷命令行? 【从0到1构建一个ClaudeAgent】协作-自主Agent 最小二乘问题详解20:无先验约束下的增量式SFM自由网平差 痞子衡嵌入式:大话双核i.MXRT1180之XIP应用里借助MU实现可靠Flash IAP的方法 AI Chat 封装, SemanticKerne.AiProvider.Unified 已发布 Windows下右键编辑js文件无法打开记事本——在注册表中使用环境变量 在后台服务中使用 Scoped 服务,为什么总是报错? H200 安装驱动并使用sglang启动模型 wireshark 抓包Trap上报告警内容 我用 AI 辅助开发了一系列小工具(2):图片压缩工具 [A Primer On MC and CC] 2.1 Memory Consistency 1 - 指令重排序和 SC 模型 Oracle数据库SCN推进技术详解与实践指南 玩转控件:封装个带图片的Label控件 Claude Code 4.7 真正该升级的不是模型,而是你的工作流 前端小白一句话,AI 帮我做了个颜值拉满的桌面媒体播放器。当代码不再是门槛,一句话编程就是现实。 5. WorkBuddy: 小龙虾的灵魂三件套,让你的小龙虾不只是工具 SQLite 分片方案实战:三种分片策略的深度对比 告别简陋 UI!一款基于 Fluent Design 和基于 WinUI 的开源免费、现代化的 Avalonia UI 控件库 关于二进制排列组合枚举的总结 AI开发-python-LangGraph框架(3-27-LangGraph从零实现大模型智能决策工作流) ElasticSearch主分片和副本分片概念详解
UIImageView 设置图片不生效的原因排查
chaoguo1234 · 2026-04-18 · via 博客园_首页

最近在项目中碰到了一个UIImageView的问题。

需求内容是无论是在浅色还是深色模式,UIImageView都使用深色模式下的图片。

最先想到的方法就是从Image Assets中按照下面方法取出对应的深色模式图片,然后赋值给UIImageViewimage属性:

image

var darkTrait = UITraitCollection(userInterfaceStyle: .dark)
// 取出暗黑模式下图片
let image = UIImage(named: name, in: nil, compatibleWith: darkTrait)
imageView.image = image

但是在浅色模式下,UIImageView还是显示浅色模式下的图片。

// 打印 image
(lldb) po imageView.image
▿ Optional<UIImage>
  - some : <UIImage:0x30ac59cc0 named(main: BDPPersonalPage_video_collection) {16, 16} renderingMode=automatic(original)>
  
// 打印 image 的 configuration
(lldb) expression -l objc -O -- [0x30ac59cc0 configuration]
0x0000000301439a00

// 打印 configuration 的内容
(lldb) expression -l objc -O -- 0x0000000301439a00
<UIImageConfiguration:0x301439a00 traits=(UserInterfaceIdiom = Pad, DisplayScale = 2, DisplayGamut = P3, HorizontalSizeClass = Regular, VerticalSizeClass = Regular, UserInterfaceStyle = Light, UserInterfaceLayoutDirection = LTR, PreferredContentSizeCategory = L, AccessibilityContrast = Normal)>

从上面imageView.imageconfiguration属性输出可以看到,图片的UserInterfaceStyle还是Light

通过调试UIImageViewsetImage:方法,发现内部会调用下面的方法:

-[UIImageView _resolveImagesWithPreviouslyDisplayedImage:]:

_resolveImagesWithPreviouslyDisplayedImage:方法会获取UIImageView当前的traitCollection:

0x19b688834 <+108>: bl     0x199d49170 ; -[UIImageView _effectiveImageViewTraitCollectionForResolvingImages]

lldb输出可以看到,UIImageViewUserInterfaceStyleLight:

(lldb) po $x0
<UITraitCollection: 0x17c7fa1c0; UserInterfaceIdiom = Pad, DisplayScale = 2, DisplayGamut = P3, HorizontalSizeClass = Regular, VerticalSizeClass = Regular, UserInterfaceStyle = Light, UserInterfaceLayoutDirection = LTR, ForceTouchCapability = Unavailable, PreferredContentSizeCategory = L, AccessibilityContrast = Normal, UserInterfaceLevel = Base, HDRHeadroomUsageLimit = 1, SceneCaptureState = 0, ImageDynamicRange = 1>

接着会比较UIImageViewtraitCollection和要设置的图片的traitCollection是否相等:

0x19b68884c <+132>: bl     0x19ad03818  ; -[UITraitCollection _isEqualToTraitCollectionForResolvingImage:]

只有两者相等,设置的图片才生效。

这里由于UIImageViewUserInterfaceStyleLight,而要设置的图片的UserInterfaceStyleDark,因此二者不相等。

在二者不相等的情况下,UIImageView会使用自己的traitCollectionImage Assets中找对应的图片:

 0x19b68898c <+452>: bl     0x19b68858c  ; -[UIImageView _resolvedImageFromImage:withImageViewTrait:]

由于UIImageViewUserInterfaceStyleLight,因此找到的也是Light图片。

最后UIImageView会将找到的图片设置为真正要显示的图片。

这就是为什么使用暗黑模式的图片设置UIImageViewimage属性不成功的原因。

知道了原因,想要解决,就只需要将保证UIImageViewUserInterfaceStyle和要设置的图片一样即可。

imageView.overrideUserInterfaceStyle = .dark

加上上面代码,UIImageView就可以正常显示暗黑模式的图片了。

实际上,设置了UIImageViewoverrideUserInterfaceStyle属性为dark,即使不设置UIImageViewimage属性为暗黑模式图片,系统也会自动切换到暗黑模式图片。