Kotlin Multiplatform Development Help

在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处理

若互操作视图无需交互,可预先禁用所有触摸处理。
只需在创建UIKitViewUIViewController时将interactive参数设为false即可。

选择触摸处理策略

在Compose Multiplatform 1.7.3中,还可通过实验性API对互操作UI进行更精细控制。

新版UIKitViewUIViewController构造函数接收UIKitInteropProperties参数对象,该对象支持配置:

  • 互操作视图的interactionMode参数(用于选择触摸处理策略)

  • 改变互操作视图无障碍行为的isNativeAccessibilityEnabled选项

interactionMode参数可设为CooperativeNonCooperative

  • Cooperative模式是上述新默认行为:引入触摸处理延迟。实验性API允许通过不同数值替代默认的150毫秒延迟

  • NonCooperative模式采用旧策略,Compose Multiplatform不处理互操作视图中的任何触摸事件。尽管存在前述问题,但若确定无需在Compose层面处理互操作触摸时仍可使用

  • 通过设置interactionMode = null可完全禁用原生UI交互

后续步骤

了解更多关于Compose Multiplatform中UIKitSwiftUI的集成方案。

22 四月 2025