Telegram 技巧档案UIKIT · APPKIT

两端对照

14 组主题,并排比较 Telegram-iOS 与 TelegramSwift 对同一问题的解法。

两个客户端由不同团队维护,但面对的问题相同:长列表、倒序聊天、富文本、动画贴纸、系统菜单和键盘。每组对照先写共同问题,再分别列出 iOS 与 macOS 的做法和对应条目,最后写出差异。用左侧列表或方向键切换主题,右上角可以只看一端。

对照 01 / 14

视图基础:节点与图层

共同问题默认视图栈带有隐式动画和主线程绘制成本。两端都要绕开它。
差异iOS 的重点是把绘制移出主线程。macOS 的重点是抹平 AppKit 与 UIKit 的习惯差异,并让 Core Animation 只执行显式动画。两端都用“空 action”拦截层级事件。

AppKit 特有难点

以下问题只在 macOS 端出现,iOS 端没有对应条目。

  • 翻转坐标。 TGUIKit 统一 flip = true,并在 updateLayer 中同步,避免多处坐标系分歧。见 #12-05。
  • NSTableView 行几何。 代码禁用自动行高,手工调用 noteHeightOfRow,并自己计算粘性标题的推挤。见 #13-21 和 #13-06。
  • 非激活窗口的 hover。 NSTrackingArea 使用 .activeInActiveApp 和 .assumeInside,窗口失焦时仍更新悬停状态。见 #12-10。
  • 窗口键盘分发。 代码自建优先级链与全局处理器,覆盖默认 responder 链。见 #12-03。
  • 显式 Core Animation 管理。 SimpleLayer 的空 action 关闭隐式动画,关键转场手动补动画。见 #12-06。