You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift:如何显示多个视图并保持所有视图处于活跃状态

解决地图与拖动视图同时交互的问题

你的问题根源在于自定义PresentationViewController默认会拦截背景视图的交互事件,导致地图无法响应操作。下面给你两种可行的解决方案,优先推荐适合Swift新手的简单方案:

方案一:使用子视图(Child Views)推荐给新手

直接把可拖动视图作为地图所在ViewController的子视图,这种方式逻辑简单,完全不会影响地图的交互:

  • 在地图控制器里创建拖动视图实例,用addSubview(_:)添加到视图层级,通过AutoLayout或者frame设置初始位置(比如底部向上偏移一段距离)。
  • 给拖动视图添加UIPanGestureRecognizer手势,在手势回调里根据拖动的偏移量调整视图的位置(修改约束的constant值或者frame)。
  • 这种方式下,只有拖动视图自身的区域会响应拖动手势,其他区域的触摸事件会直接传递给下方的地图,完美实现你要的同时操作效果。

方案二:调整自定义PresentationViewController的设置

如果想继续用Presentation模式,需要修改几个关键配置来允许背景交互:

  • 给要展示的拖动视图控制器设置modalPresentationStyle = .custom,并指定自定义的transitioningDelegate。
  • 在自定义的PresentationController中:
    • 重写shouldPresentInFullscreen返回false,让presented视图不是全屏展示。
    • 重写frameOfPresentedViewInContainerView来定义拖动视图的位置和尺寸,保持你之前的设置。
    • 设置passthroughViews = [你的地图实例],这个属性会让指定的视图绕过presented视图的交互拦截,直接接收触摸事件。
    • 确保presented视图的背景是透明的,不然会挡住地图的显示。

新手建议

如果是刚接触Swift,优先选方案一,子视图的方式代码更少、逻辑更直观,不需要理解Presentation的复杂生命周期和交互拦截规则,调试起来也更简单。

内容的提问来源于stack exchange,提问作者Jan L

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 06:55:24