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

推荐订阅源

Hugging Face - Blog
Hugging Face - Blog
GbyAI
GbyAI
Engineering at Meta
Engineering at Meta
有赞技术团队
有赞技术团队
博客园 - 【当耐特】
H
Hackread – Cybersecurity News, Data Breaches, AI and More
WordPress大学
WordPress大学
博客园_首页
美团技术团队
H
Help Net Security
MongoDB | Blog
MongoDB | Blog
宝玉的分享
宝玉的分享
大猫的无限游戏
大猫的无限游戏
小众软件
小众软件
J
Java Code Geeks
A
About on SuperTechFans
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
IT之家
IT之家
T
The Blog of Author Tim Ferriss
Microsoft Azure Blog
Microsoft Azure Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
B
Blog
雷峰网
雷峰网
爱范儿
爱范儿

博客园_首页

Linux实操--组管理、权限管理和定时任务 Java + EasyExcel 实现单个接口导出多个Excel Mem0 源码解析系列(二):提示词工程的深度剖析 Openclaw TaskFlow究竟是什么?和普通Skill技能有什么区别 博文阅读密码验证 - 博客园 嘉立创开源:应该是全网MicroPython教程最多的开发板 Hermes Agent 集成实践:从协议到生产 2026年AI编程工具横评:Cursor、Codex、Claude Code、Zed、Windsurf Java程序员必看的RAG入门教程 2026 AI效率神器:Superpowers + Claude Code 保姆级教程 本地大模型部署全攻略:从 0 到 1 玩转 Ollama 【从0到1构建一个ClaudeAgent】内存管理-上下文压缩 .NET 高级开发 | 设计、实现一个事件总线框架 电子小白入门之NE555 3. WorkBuddy:隐藏玩法,一键召唤专家,让 AI 以"专家身份"给你干活 和AI一起搞事情#3:Claude Teammate 游戏开发翻车实录 【OpenClaw】通过 Nanobot 源码学习架构---(7)Memory C# .NET 周刊|2026年3月3期 我在 Debian 11 上把 K8s 单机搭起来了,过程没你想的那么顺(/opt 目录版) 深度学习进阶(七)Data-efficient Image Transformer CLI+Skill搭建浏览器AI自动化框架,告别一切重复枯燥任务 告别Token账单无底洞:OpenClaw本地部署,重塑企业数据主权的唯一解 FastAPI+Vue:文件分片上传+秒传+断点续传,这坑我帮你踩平了! SBTI 爆火后,我做了个程序员版的 CBTI。。已开源 + 附开发过程 多模态检索开始进入工程期:用 Sentence Transformers 搭建可落地的 Multimodal RAG 100多行代码实现一个最简单的Agent(用ReAct) Claude Code 通关手册(八):推荐 5 个 Hooks,代码质量提升 3 倍 老板:“有人截图了!”。安全部门:“收到,马上查暗水印!” - why技术 技术之外,皆是人间 C#/.NET/.NET Core技术前沿周刊 | 第 69 期(2026年4.01-4.12)
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属性为暗黑模式图片,系统也会自动切换到暗黑模式图片。