显而易见,UICollectionViewCompositionalLayout 给我们带来易用性的同时也牺牲了 UICollectionViewLayout 的灵活性。当我们决定选择前者的时候,内心多少会祈祷着在需求范围之内不要有什么坑啊拜托!然而,Apple 不遂人意,问就是解决提出问题的人可解千愁~
玩笑终归是玩笑,该搬的🧱一块也少不了……
显而易见,UICollectionViewCompositionalLayout 给我们带来易用性的同时也牺牲了 UICollectionViewLayout 的灵活性。当我们决定选择前者的时候,内心多少会祈祷着在需求范围之内不要有什么坑啊拜托!然而,Apple 不遂人意,问就是解决提出问题的人可解千愁~
玩笑终归是玩笑,该搬的🧱一块也少不了……
在 ChatGPT-4o 推出之后,白嫖党终于可以使用多模态相关功能了。对于 GUI Developer,最希望的莫过于将设计图稿喂给 AI,让其使用特定编程语言输出指定平台的相关代码。Bingo,程序员不生产代码,TA 们只是代码的搬运工。于是,有了下文~(忽略多余的解释和换行)
作为 YYText 的核心组件,YYAsyncLayer 与 YYTextTransaction 通过非常精简的代码定义了整个异步渲染流程。前者负责处理绘制逻辑并进行渲染,后者则是在适当的时机提交界面刷新事务(类似于 CATransaction)。为了提升渲染的效率,这两者内部都使用了一些优化技巧。原理相关的文章不胜枚举,本文旨在记录 Swift 化中遇到的问题以及一些思考。
YYText 是一个非常强大的文本处理框架,不过遗憾的是原作者已经很久没有进行维护了。为了跟上时代(Swift 化)的进程,鄙人不才,期望能够接住前辈们的火炬,让开源精神能够一直传承下去!
SwiftyYYText 是 YYText 非官方的 Swift 版本,旨在将这一优秀的库迁移至 Swift,同时开始逐渐处理历史遗留问题,以便更好地服务于广大开发者和社区。由于个人的精力和能力受限,项目的推进进度会比较慢,故在此邀请对此有兴趣的伙伴加入。相信在这之后,我们对 Apple 的文本渲染相关流程会有进一步的领悟,🤝
当你把 UIScrollView 的 isPagingEnabled 属性设置为 true 时,你便得到了 Apple 精心准备好的分页动画过渡效果。即当你停止拖拽时,系统会根据滚动进度来决定回到上一页还是去往下一页。不过它的局限性在于分页的大小完全取决于 UIScrollView 本身的 frame.size,无法自定义 pageSize。在某个时间开始,占据整个容器大小的轮播或者滚动视图已经无法满足设计的审美以及产品的需求了。取而代之的是除了完全显示当前页之外,还需要露出前一页和后一页的部分内容。如果用“象形文字”描述的话,大致长这样:(请全屏查看,🤪)
1 | /** |
那么,接下来我们一起来讨论一下需求的实现方式~
Dictionary、String 是 swift 标准库中的值类型数据结构,单从使用层面上而论,相信铁子们都可以不假思索、信手拈来。但如果在某种使用条件下,发生了运行时崩溃,阁下又将如何应对?
如果你看“题干”的话,就自然而然地想到这个情况就是多线程下数据一致性问题。至于如何保护临界区数据不在这篇文章的讨论范围,但我们不妨深入 Swift 源码,去揭开崩溃原因的神秘面纱~
在这样一个信息时代里,有无数人不择手段利用信息差为自身获取利益。所幸,在技术领域里总有那么一帮人愿意无私奉献出自己的时间,免费向从业人员或者普罗大众分享专业技能与工作成果,成就了蓬勃发展的开源社区。🙇🏼
这个系列会通过🔗的形式(省去可能的版权纠纷)转载个人觉得非常具有价值的技术文章,也为后续自我地不断提高积累食粮~
自 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
又有什么作用?调用环境的不同行为是否一致呢?让我们一探究竟!
优先级反转是一个出乎意料的多线程任务调度状态,往往出现于高优先级任务等待低优先级释放临界资源。同时,该次优先级任务被次高优先级任务抢占打断执行,导致次高优先级任务先于高优先级任务执行。优先级反转带来的程序问题可大可小,因为任务的延迟执行很难被察觉(火星探测器上的那次绝对是最值钱的一次,🤣),如下文中提到的这个🌰。
在 Apple 提供的 UI 开发套件中,UIButton 是一个比较特殊的存在。在系统默认样式下,当用户点击时会有一个文本或者图片透明度变化的高亮效果。这个简单的交互行为能够一定程度上提升用户的使用体验,因为它含蓄地提醒了某个功能区的响应范围。不过遗憾的是这个特性并没有推广开来,UIButton 自身也是缺胳膊少腿的。而隔壁 Google 在自家 App 上已经把它玩出花儿来了,君不见那 Gmail 按钮按下时水波已经荡漾在了用户心头,而自家“孩子”却依旧像是事不关己油盐不进?
好好好!既如此,那就不妨让我们花点时间完成设计师想要的点点交互效果。