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

推荐订阅源

W
WeLiveSecurity
Jina AI
Jina AI
博客园 - 司徒正美
雷峰网
雷峰网
宝玉的分享
宝玉的分享
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园_首页
WordPress大学
WordPress大学
Google DeepMind News
Google DeepMind News
GbyAI
GbyAI
MyScale Blog
MyScale Blog
Apple Machine Learning Research
Apple Machine Learning Research
美团技术团队
I
InfoQ
博客园 - Franky
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
博客园 - 叶小钗
阮一峰的网络日志
阮一峰的网络日志
Cyberwarzone
Cyberwarzone
C
CXSECURITY Database RSS Feed - CXSecurity.com
S
Schneier on Security
P
Privacy & Cybersecurity Law Blog
T
Threatpost
Cloudbric
Cloudbric
D
Docker
M
MIT News - Artificial intelligence
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Vercel News
Vercel News
Martin Fowler
Martin Fowler
J
Java Code Geeks
AWS News Blog
AWS News Blog
The Cloudflare Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
L
Lohrmann on Cybersecurity
Hacker News: Ask HN
Hacker News: Ask HN
Last Week in AI
Last Week in AI
S
Security @ Cisco Blogs
Help Net Security
Help Net Security
C
Cisco Blogs
V
V2EX
博客园 - 【当耐特】
I
Intezer
爱范儿
爱范儿
F
Fortinet All Blogs
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
P
Privacy International News Feed
IT之家
IT之家
L
LINUX DO - 最新话题
B
Blog RSS Feed
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO

isaced

使用 TypeScript 构建的 appstore-connect-sdk 归档 我用 SwiftUI 写了一个 V2ex 客户端 Docker 容器化多应用部署 Swift Server-side SDWebImage 为什么无法读取 webpmux 生成的 WebP 动图? [译] 探索 Swift 4 中新的 String API 对一个 Django 站点做 ab 压力测试 fir-mac 开发笔记 iOS10 Safari 引导用户信任企业签名 Swift Web 开发之 Vapor - 模版 Leaf(三) Swift Web 开发之 Vapor - 路由(二) HoloLens 初体验 Swift Web 开发之 Vapor - 入门(一) Jenkins for iOS 搭建日记 iOS HOOK 注入与重签名 Xcode 使用 Configuration 来配置不同的项目环境 图床从SAE迁移到七牛 初用 CocoaAsyncSocket 记一次 SQLite 性能优化 有多色 - 开发小记 海岛风情 - 泰国普吉岛六日游 EGOCache 源码解析 日语五十音假名临摹校验算法 [iOS] UITextView 追加文字自动跳到顶部解决方法 Cocoa 新的依赖管理工具:Carthage 新年快乐! 博客主机换到搬瓦工 写了个iOS小游戏:有多色 iOS 后台任务之 Long-running background task 悄悄的就必须用 XCode 5.1.1 上传了! HTTP Content-type 与 AFNetworking Objective-Cloud 初体验(1) 掌中站上架小记 NSLoger 上线了 Python Markdown 做语法限制 Nginx + Gunicorn + Django 部署小记 用Shell脚本批量裁剪App Icon各个尺寸 LaunchRocket使用小记 用宏提速NSCoding 2014新年伊始:近期读过的好文推荐 [iOS] stringWithFormat 和 initWithFormat 有何不同? Apache + Flask + mod_wsgi + Koding 部署小记 收集几个Objective-C的HTML解析库 NSMapTable: 不只是一个能放weak指针的 NSDictionary 2013,再见! Emlog到Typecho的迁移工具:emlog2typecho [iOS]给上拉下拉刷新PullToRefresh做本地化 [iOS]代码推荐:大图缩放视图 - Vertigo iOS:hidesBottomBarWhenPushed的正确用法 Xcode 5新的Interface Builder,你准备好了吗? [翻译]如何使用Django创建简单的博客 我的Mac音乐播放器 初识 NSDataDetector Objective-C 计算代码运行时间 WordPress上传文件自动重命名 iOS:仿jing.fm的音乐播放视图 我的啃黑苹果之路 关于 搜索 项目
给 UIProgressView 脱掉那层微弱的渐变
2016-02-25 · via isaced

日常堆码中遇到一个扁平进度条的需求,需要添加一层进度条在表格中整个 Cell 最底层。第一反应想到了 UIProgressView,拖了一个出来看了看,不能修改高度,但是通过拉 AutoLayout 约束可以强制定高,但是会有一个警告:

强制 UIProgressView 高度警告

效果出来大概是这样:

带渐变的 UIProgressView

不仔细看发现不了,其实 UIProgressView 默认填色有一点点渐变效果,包括底色(progress tint color)。(真的看不太出来,如果你用取色计指一下,能看到几个单位的色值偏差)

于是我猜想 UIProgressView 可能是在 Layer 上绘出来的,抱着疑问,决定先把 subviews 打出来看看:

<__NSArrayM 0x7f7fa2a14c80>(
<UIImageView: 0x7f7fa2a0ecd0; frame = (0 0; 355 65); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x7f7fa2a0ee80>>,
<UIImageView: 0x7f7fa2a0ef50; frame = (0 0; 0 65); opaque = NO; userInteractionEnabled = NO; tintColor = UIDeviceWhiteColorSpace 1 1; layer = <CALayer: 0x7f7fa2a0f100>>
)

po 出来的这个 UIProgressView 正是上图中 “疯狂的海狮” 这一行,这里可以看到里面包着两个 UIImageView,看看其 frame ,第一个宽度 355 差不多正好是整个进度条的宽度,而第二个宽度是 0,所以大致能猜想这两层便是 UIProgressView 控制 UIProgressView 进度的关键。

注:在这个例子里,Progress Tint Color 是白色,Track Tint Color 是黄色。

那么现在得出一个简单结论:

UIProgressView 的 subviews 是两个 UIImageView,第一个是 TrackTintColor 层(轨道),第二个是 Progress Tint Color 层(进度)

那么这两个 UIImageView 是怎么显示的呢?是 Draw 出来的? 还是各一张图片着色?

继续抱着疑问的我决定看看这个内部 UIImageView 有没有 UIImage,有的话会是什么样?

我把显示 TrackTintColor 的 UIImageView 的 image 属性弄出来看看。

渐变UIImageView中的着色image

居然是一张 10x4 的图,而且不是纯色。所以引起看起来微弱渐变的原因就在这,UIImageView 正是用这张图放大做的着色,造成的非扁平化效果。

然后就是怎么解决这个问题了,既然我们可以拿到这张图,那最好的解决方式就是直接对这个图做修改,而不去动 UIProgressView 内部的逻辑结构,我们可以到一个 UIImage 的实例方法 imageWithRenderingMode:,参数我们可以用 UIImageRenderingModeAlwaysTemplate 让该图片忽略原来的颜色布局,通过 UIImageView 的 tintColor 属性来自动着色显示。把图片着色成你想要的单色。然后重新丢给这个 UIImageView 就行了,关键代码如下:

UIImageView *progressTintImageView = [progressView.subviews lastObject];
if (progressTintImageView) {
    UIImage *image = [progressTintImageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
    progressTintImageView.image = image;
    progressTintImageView.tintColor = progressView.progressTintColor;
}

大功告成,曲线救国(偷懒)的方式解决掉 UIProgressView 的自带渐变问题。文中如有错误,还望指正!