iOS 13 darkmode 适配的动态颜色 cheatsheet

深色模式,作为 iOS 13 最大的新特性,从设计者角度,带来设计体系、颜色、材质、系统控件、SF Symbols 等若干方面的新的变化;对于开发者来讲,我们熟知的适配;
– 屏幕尺寸
– 屏幕方向
– View 渲染阶段(指 viewDidLoad 和 viewDidAppear 两个阶段,view 的尺寸是变化的)
– iOS SDK 适配

等适配维度,而后又多了一个维度,
– 外观模式(dark or light)

SwiftUI: 苹果的一次天才尝试

时间回到一个月前的 WWDC 19 现场,当苹果宣布推出 SwiftUI 时,所有观众为其优雅的语法、 强大的实时预览 preview特性而欢呼雀跃,在发布之后几天,各路人马推入巨大的热情,研究 SwiftUI DSL 语言设计、Swift5.1 的新特性、 Combine 库的使用方法,产出了很多的文章。熟悉 Swift 语言的会从 Swift 演进的角度对新特性的来由、场景用法等深度解析;熟稔动画的作者,则用 SwiftUI 用极简的代码玩出酷炫的效果;以前玩 reactive-cocoa 类型开发模式的大佬,则对 Combine 库做了深入的探讨。

作者对 Swift 语言是新手、水平有限,这篇文章不会深入的讨论 Swift 语法特性和 Combine 的使用及实现原理。而是分享在这几星期期间,一边学习其他人的文章,一遍使用 SwiftUI 构建网易严选的 iPad 版本 —— YanxuanHD(源码见参考链接)过程中思考和感悟。从最初的惊喜到迷茫、再到困惑直到若有所得,拙作在这里抛砖引玉。

WKWebview 加载过程中的性能指标图解

背景

讨论 WKWebview 在加载 h5 页面时,Objective-C里的 WKNavigationDelegate、window.performance.timing、WKUserScriptInjectionTimeAtDocumentStart、WKUserScriptInjectionTimeAtDocumentEnd,以及和前端最常用的document.readystate\domContentLoaded\document.onload 事件等时间维度的关系,为native和前端在相互调用时,能够明确沟通的时机。

探索 messageHandler 的传输性能极限

本次测试的目标是 iOS 8+ 之后提供的 WKWebview 提供的 JS 和 Native 通讯机制之 messageHandler,比较浅显的探索下它各方面的极限。 测试 Demo

主要的测试场景包括

  1. messageHandler 可传输的数据类型有哪些?
  2. 以字符串为例,messageHandler 最多可传输多少字节?
  3. 承接 2,在不同量级下的传输效果(是否丢失、速度等)如何?
  4. 如果是 native 向 WKWebview 传输数据,是否有类似的表现?
  5. 探索使用 messageHandler 的最佳方法。

测试方法

  1. 测试设备,iPhone XR 模拟器,Xcode 10.2
  2. 硬件,MacBook Pro (13-inch, 2016),Mem 16 GB 2133 MHz LPDDR3,3.1 GHz Intel Core i5
  3. 测试流程。启动 App,将 Xcode 切换到 Debug Navigation,观察内存消耗;同时打开 Safari 开发者工具,切换到 Timing tab 里,观察内存的占用情况

objc 中最好的多行字符串声明方式

1. 问题

在 AppHost.framework【注1】(以下简称 AppHost) 的编码中,需要处理很多预先导入到 webview 里的 js 文件,有一些不关键功能是用 .js 的文件读到内存的,还有一些比较短小的 js 源码,如;

1
2
3
4
          (function(e){
                e.setAttribute('src','%@');
                document.getElementsByTagName('body')[0].appendChild(e);
            })(document.createElement('script'));

要写到代码里和 objc 代码一起。还有,在 AppHost 里,有个 ah_doc 模块,在编写注释时,需要输出完整的 js 代码,如

1
2
3
4
5
6
7
8
window.appHost.invoke('startNewPage', { 'url': 'http://you.163.com/','title': 'title',
    'type': "push",
    'backPageParameter': {
        'url': 'http://qian.163.com',
        'title': 'title',
        'type': 'push'
    }
})

这个字符串里包含了大量的单引号、双引号,而且为了保持可读性、维护性,需要多行输出。

这是非常典型的问题,传统的多行字符串声明有没有方法很好的解决?

记一次独自带小宝宝

今天是妈妈的生日,她和其他的兄弟 3 个人去看《风中有朵雨做的云》电影,晚上 9 点到 11 点就是我和宝宝两个人了,丈母娘他们在楼下,也有自己的事情,想想自己配宝宝逗他玩,应该不是问题,所以给他们买好票,到 8 点半了,还送他们上车。 在临走之前,我还告诉老婆,让宝宝自己先吃好奶,这样就不用怕她一会需要吃奶,然后吃不到,哇哇哇的哭。 没想到我还是想的太简单了。 刚刚开始的时候我陪她在床上玩她的玩具,她对当当当响的东西,

关于TapGesture、UIResponder 链和 target-action 事件的相互影响的机理和应用

https://github.com/hite/IOSEventTest

这是一个供探索、验证、对比测试而精心设计的demo。
用来研究 UIControl,普通的 View 在 使用 target-action, addTapGestureRecognizer 方式时,不同情况下如何相互作用。
试图解答以下问题;

  1. 第一响应者如何确认?(包括 alpha,hidden,clipToBound 属性的影响,都不是本次试验的重点)
  2. target-action 和 tapGesture 混用时,如何表现,加入变量 cancelsTouchesInView 时,是否有不同?
  3. target-action 或者 tapGesture 是否各自都有多个?
  4. 包括相同类型 event state 和 gesture Type 是否有多个?
  5. 包括不同类型 event state 和 gesture Type 是否有多个?
  6. 相同和不同类型 target-action 或者 tapGesture 的添加顺序和执行顺序是否有关系?

新型 code review 系统设计

主要设计方案在 keynote 里,属于一个前期的功能规划设计,它的特点是让 发掘 code 本身的资源,让 code 可以流动起来,建立人和 code 直接的关系。 详细见链接