常见问题解答
视图问题
颜色格式问题
Hummer 支持的颜色格式是和前端和 iOS 保持一致的 RGBA 16 进制格式,即 #FF000022
,最后的 22
是透明度,这个和 Android 原生支持的 ARGB 颜色格式不一样,需要特别注意。
appendChild 问题
Image、Text、Button 等叶子组件,在 iOS 端是自带有 appendChild
方法的,因为都是继承至 UIView,而 Android 端这些组件不是继承至 View 的,所以没有 appendChild
方法。为了保持两端对齐,我们取了两者的交集,即 Hummer 中的这些叶子组件,是没有 appendChild
等容器组件的方法的。
Text 组件设置空字符串时的高度问题
当 Text 组件设置了空字符串("")时,在 Android 中是占高度的,而在 iOS 中是不占高度的,这点需要特别注意。
Text 组件文本基线对齐问题
当两个不同大小文本的Text组件,水平布局按底部对齐时,内部的文字无法实现基线对齐,原因是目前Text组件文本周围实际上是有一圈自带的padding间隙的,而小文本和大文本的间隙是不一样的,所以基线就会对不齐。
边框绘制不一致
Android 端目前支持绘制单边圆角和边框,并且连接处可以平滑过渡,而 iOS 端目前在绘制单边圆角和边框时,连接处会断开不自然。
子控件超出父容器部分无法响应点击事件
由于端上的点击事件都是由父容器分发给子控件的,如果点击发生在超出父容器部分的子控件上,也就是没有点击在父容器上,那么点击事件就不会传递到子控件上,所以超出部分的子控件是无法响应点击事件的。
滚动组件嵌套滑动冲突问题
目前滚动相关的组件(Scroller、List等)相互嵌套会有滑动冲突的问题。
阴影无法显示(Android)
在 Android 端,如果某个控件有设置阴影,而在该控件同一层级上存在 Image、Scroller 或 List 组件的话,阴影会不起作用,会被父容器裁剪掉,原因是由于 Android 端原生 setClipChildren
方法的限制,需要在 Image、Scroller 或 List 组件外再包一层 View 才能解决。
子控件超出父容器部分会被裁剪掉(Android)
原因同上。
点击事件穿透问题(Android)
Android 端所有视图的点击事件默认行为是会从上层视图穿透到下层视图的,如果想要不穿透,需要在上层视图中添加一个空实现的 tap
点击事件,这样就可以拦截掉点击事件了。iOS 端点击事件默认是不穿透的。
Image 组件加载相对路径图片失败(Android)
要使用相对路径图片,需要调用者告诉 Hummer 框架当前执行的 JS 文件的绝对路径,可以在原生侧调用 HummerRender 的 render 方法时,传入第二个参数 sourcePath,并以 file:///
开头。
父容器边框盖住子控件的问题(iOS)
iOS 端父容器边框的层级要比子控件的层级高,导致在绘制容器边框时,如果子控件是超出父容器的,那么父容器的边框会盖住子控件。
背景图片的圆角设置无效(iOS)
iOS 端由于背景图片的绘制受系统行为限制,无法和背景颜色一样可以设置圆角,需要特殊处理,目前设置圆角是无效的。
其他问题
子线程回调 JSCallback 出现的 Crash/StackOverflow 问题
JS 只支持单线程运行,目前 Hummer 都在主线程运行 JS,当原生侧某些异步场景下(如网络请求回来后),在子线程中调用 JSCallback 时,在 iOS 端可能会出现 Crash 问题,在 Android 端可能会出现 StackOverflow 问题。
页面跳转后之前注册的回调失效了(Android)
这是由于首页的 Hummer 容器,和跳转后的默认 Hummer 容器,一般不是同一个,跳转后的默认 Hummer 容器是 Hummer SDK 自带的 HummerActivity。如果希望跳转后的 Hummer 容器和首页 Hummer 容器公用同一个,需要在 Hummer.init()
时设置自定义路由适配器 NavigatorAdapter
来指定自己的 Hummer 容器。
按 Home 键不触发 onDisappear 生命周期方法(iOS)
由于 iOS 系统本身按 Home 键退到后台和打开另一个页面时是不同的生命周期,目前还未处理按 Home 键的生命周期实现。
可选链语法(?.)在 iOS 系统中崩溃(iOS)
iOS 端使用的 JS 引擎是系统自带的 JavaScriptCore,在低版本系统中不支持可选链语法(?.),需要替换成标准 ES6 的语法。