Lottie 是一个让开发者“轻松搞定炫酷动画”的利器。设计师用 After Effects 做好动画后,只需导出一个 JSON 文件,开发者就可以直接用 Lottie 加到 App 或网页中,无需写复杂的动画代码。它体积小、效率高,还能交互控制,比如暂停、进度跳转、颜色变换,非常适合做 App 的加载动画、图标动效等。
但是在 iOS 上,如果你把开发者模式中的卡顿检测打开,你会发现在渲染一些复杂的 JSON 文件时,会出现明显的主线程卡顿。🤔
- Aug 15, 2024...more
⌈iOS⌋NSCollectionLayoutDecorationItem 如何排除自适应宽高的 NSCollectionLayoutBoundarySupplementaryItem
Aug 13, 2024...more
显而易见,UICollectionViewCompositionalLayout 给我们带来易用性的同时也牺牲了 UICollectionViewLayout 的灵活性。当我们决定选择前者的时候,内心多少会祈祷着在需求范围之内不要有什么坑啊拜托!然而,Apple 不遂人意,问就是解决提出问题的人可解千愁~
玩笑终归是玩笑,该搬的🧱一块也少不了……
⌈iOS⌋一次和 ChatGPT 的“结对编程”体验
Jul 31, 2024...more
在 ChatGPT-4o 推出之后,白嫖党终于可以使用多模态相关功能了。对于 GUI Developer,最希望的莫过于将设计图稿喂给 AI,让其使用特定编程语言输出指定平台的相关代码。Bingo,程序员不生产代码,TA 们只是代码的搬运工。于是,有了下文~(忽略多余的解释和换行)
⌈iOS⌋Swifty YYText II —— 事务与异步绘制
Jul 17, 2024...more
作为 YYText 的核心组件,YYAsyncLayer 与 YYTextTransaction 通过非常精简的代码定义了整个异步渲染流程。前者负责处理绘制逻辑并进行渲染,后者则是在适当的时机提交界面刷新事务(类似于 CATransaction)。为了提升渲染的效率,这两者内部都使用了一些优化技巧。原理相关的文章不胜枚举,本文旨在记录 Swift 化中遇到的问题以及一些思考。
⌈iOS⌋Swifty YYText I —— “宣言”
Jun 25, 2024...more
YYText 是一个非常强大的文本处理框架,不过遗憾的是原作者已经很久没有进行维护了。为了跟上时代(Swift 化)的进程,鄙人不才,期望能够接住前辈们的火炬,让开源精神能够一直传承下去!
SwiftyYYText 是 YYText 非官方的 Swift 版本,旨在将这一优秀的库迁移至 Swift,同时开始逐渐处理历史遗留问题,以便更好地服务于广大开发者和社区。由于个人的精力和能力受限,项目的推进进度会比较慢,故在此邀请对此有兴趣的伙伴加入。相信在这之后,我们对 Apple 的文本渲染相关流程会有进一步的领悟,🤝
⌈iOS⌋自定义 UIScrollView pageSize 的两种方案
Jun 12, 2024...more
当你把 UIScrollView 的 isPagingEnabled 属性设置为 true 时,你便得到了 Apple 精心准备好的分页动画过渡效果。即当你停止拖拽时,系统会根据滚动进度来决定回到上一页还是去往下一页。不过它的局限性在于分页的大小完全取决于 UIScrollView 本身的 frame.size,无法自定义 pageSize。在某个时间开始,占据整个容器大小的轮播或者滚动视图已经无法满足设计的审美以及产品的需求了。取而代之的是除了完全显示当前页之外,还需要露出前一页和后一页的部分内容。如果用“象形文字”描述的话,大致长这样:(请全屏查看,🤪)
1
2
3
4
5/**
|--| |-----------------| |--|
| P| | C | | N|
|--| |-----------------| |--|
*/那么,接下来我们一起来讨论一下需求的实现方式~
⌈Swift⌋数据结构在竞态条件下引发的崩溃问题
May 5, 2024...more
Dictionary、String 是 swift 标准库中的值类型数据结构,单从使用层面上而论,相信铁子们都可以不假思索、信手拈来。但如果在某种使用条件下,发生了运行时崩溃,阁下又将如何应对?
如果你看“题干”的话,就自然而然地想到这个情况就是多线程下数据一致性问题。至于如何保护临界区数据不在这篇文章的讨论范围,但我们不妨深入 Swift 源码,去揭开崩溃原因的神秘面纱~
⌈转⌋目前已知最具干货的离屏渲染文章
Apr 18, 2024...more
在这样一个信息时代里,有无数人不择手段利用信息差为自身获取利益。所幸,在技术领域里总有那么一帮人愿意无私奉献出自己的时间,免费向从业人员或者普罗大众分享专业技能与工作成果,成就了蓬勃发展的开源社区。🙇🏼
这个系列会通过🔗的形式(省去可能的版权纠纷)转载个人觉得非常具有价值的技术文章,也为后续自我地不断提高积累食粮~
⌈Swift⌋这一次,搞懂 @objc 和 dynamic
Apr 15, 2024...more
自 Swift 问世以来,于 iOS 中的运用在很长的一段时间内就注定离不开与 Objective-C 的混编问题。而如何让广大开发者更快地接受并逐步使用这个“亲儿子”,一定程度上会受到它的操作难度的影响。官方也给出了他们的解决方案:编译器标识符 + 混编头文件。即:
XXX-Swift.h
(可在编译设置「Generated Header Name」中修改名称) 由编译器自动生成可供 Objective-C 使用的 Swift 接口(前提是为能够桥接到 Objective-C 的接口加上public @objc
)XXX-Bridging-Header.h
(可在编译设置「Objective-C Bridging Header」中修改路径)管理能被 Swift 访问的 Objective-C 接口
如果你经历过初期的阵痛,就一定会疯狂吐槽因 Xcode 的缓存导致
XXX-Swift.h
无法即使更新而出现的各种莫名其妙的编译错误,对于同一个模块里必须加 public 才能识别的限制使组件封装性被破坏的神奇操作亦让人叫苦不迭,🤣那么在
@objc
背后发生了什么?dynamic
又有什么作用?调用环境的不同行为是否一致呢?让我们一探究竟!⌈iOS⌋记一次遇到的优先级反转问题
Apr 10, 2024...more
优先级反转是一个出乎意料的多线程任务调度状态,往往出现于高优先级任务等待低优先级释放临界资源。同时,该次优先级任务被次高优先级任务抢占打断执行,导致次高优先级任务先于高优先级任务执行。优先级反转带来的程序问题可大可小,因为任务的延迟执行很难被察觉(火星探测器上的那次绝对是最值钱的一次,🤣),如下文中提到的这个🌰。