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
相关产品推荐
相关产品推荐

