在iOS上通过互操作处理触摸事件
在iOS平台上,Compose Multiplatform能够与原生UIKit和SwiftUI框架集成。
这种集成的一个挑战在于触摸事件的处理:当Compose Multiplatform应用包含原生UI元素时,应用可能需要根据上下文对互操作区域内的触摸做出不同响应。
目前,Compose Multiplatform对于原生视图中的触摸事件仅有一种处理策略:
所有触摸事件完全由原生UI处理,Compose完全感知不到这些事件的发生。
随着Compose Multiplatform 1.7.0版本的发布,默认行为和自定义能力都将得到改进。
具体变更将在以下章节描述。建议使用1.7.3版本进行体验。
互操作UI中触摸事件处理的新方案
当互操作区域的每次触摸事件都立即传递到底层原生UI元素时,容器可组合项无法对同一触摸做出响应。
最典型的问题是滚动场景——当互操作区域位于可滚动容器内时,用户可能期望该区域:
在需要交互时响应触摸
在需要滚动父容器时不响应触摸
为此,Compose Multiplatform实现了类似UIScrollView
的行为机制:
首次检测到触摸时,会引入短暂延迟(150毫秒)以供应用判断处理方式:
若在此时间内检测到移动,则认为用户意图滚动容器。Compose Multiplatform不会将此次触摸序列通知原生UI元素
若未检测到移动,则认为触摸目标是底层元素。后续触摸序列将移交原生UI处理
若互操作视图无需交互,可预先禁用所有触摸处理。
只需在创建UIKitView
或UIViewController
时将interactive
参数设为false
即可。
选择触摸处理策略
在Compose Multiplatform 1.7.3中,还可通过实验性API对互操作UI进行更精细控制。
新版UIKitView
和UIViewController
构造函数接收UIKitInteropProperties
参数对象,该对象支持配置:
互操作视图的
interactionMode
参数(用于选择触摸处理策略)改变互操作视图无障碍行为的
isNativeAccessibilityEnabled
选项
interactionMode
参数可设为Cooperative
或NonCooperative
:
Cooperative
模式是上述新默认行为:引入触摸处理延迟。实验性API允许通过不同数值替代默认的150毫秒延迟NonCooperative
模式采用旧策略,Compose Multiplatform不处理互操作视图中的任何触摸事件。尽管存在前述问题,但若确定无需在Compose层面处理互操作触摸时仍可使用通过设置
interactionMode = null
可完全禁用原生UI交互