MKMapView 平移导致父 UIScrollView 滚动

Posted

技术标签:

【中文标题】MKMapView 平移导致父 UIScrollView 滚动【英文标题】:MKMapView panning causes parent UIScrollView to scroll 【发布时间】:2012-09-16 20:38:58 【问题描述】:

我将 MKMapView 添加到 UIScrollView。我认为预期的功能是平移地图会导致地图移动,但它的父 UIScrollView 不会滚动。即,如果您正在平移地图,则滚动视图将保持在当前位置。

这是我的代码:

scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.width, self.height)];
    [scrollView setAutoresizingMask:UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth];
    [self.view addSubview:scrollView];

    double mapHeight = 200;
    if([AppDelegate isRunningOniPad])
        mapHeight = 400;

    map = [[MKMapView alloc] initWithFrame:CGRectMake(0, 200, self.width, mapHeight)];
    [map setExclusiveTouch:NO];
    [scrollView map];

我尝试将独占触摸设置为YES和NO,但似乎没有任何效果。

有没有办法让行为正常工作,以便平移地图会阻止 UIScrollView 移动?我也尝试将地图更改为 UIScrollView 而不是 MKMapView,但这具有相同的行为 - 所以我怀疑这是 MKMapView 特定的。

【问题讨论】:

【参考方案1】:

预期的结果是正确的,当 Map View 被触摸时,滚动视图应该保持静止,因为它应该在触摸事件通过响应链传递到滚动视图之前接收到触摸事件。

我已经在一个空项目中快速测试了上面的代码,它按预期工作,对框架和尺寸的创建、iPad 尺寸检测以及将地图添加为滚动的子视图进行了一些更改查看。

UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height)];
[scrollView setAutoresizingMask:UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth];
// Make the content size large to allow scroll view to move
[scrollView setContentSize:CGSizeMake(1000, 2000)];
[self.view addSubview:scrollView];

double mapHeight = 200;
if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 
    mapHeight = 400;


MKMapView *map = [[MKMapView alloc] initWithFrame:CGRectMake(0, 200, self.view.bounds.size.width, mapHeight)];
[map setExclusiveTouch:NO];
[scrollView addSubview:map];

【讨论】:

感谢您的建议。我也创建了几个演示项目,我看到了正确的行为 - 正如你所说。所以我完全删除了我的类,并用你在 viewDidLoad 中发布的代码用一个空类替换它。然而,同样的情况在我的项目中仍然发生......但是完全相同的类在其他项目中工作正常,所以我真的很困惑。 据我所知,它与视图位于选项卡视图控制器或导航控制器内的事实无关。如果不添加这些,它的行为是相同的。 项目中是否有任何地方禁止用户与 MKMapView 交互?因为这会阻止地图视图检测到触摸并传递给滚动视图。使用 Tab/Navigation 控制器应该不会产生影响,因为滚动和地图视图是它们的子视图。 不 - 我已经尝试过你所做的,只是在 init 或 viewDidLoad 中本地声明地图,因此在创建后没有其他任何东西可以访问它。我不认为选项卡/导航控制器会有所作为,但我不知道发生了什么,所以我想试试看! 感谢您的帮助 - 结果是我在项目中使用的 DAKeyboardControl 存在错误。我在这里用 github 上的控件提出了一个错误 - github.com/danielamitay/DAKeyboardControl/issues/11【参考方案2】:

如果它对任何人有帮助,

MKMapView 添加到UIScrollView 应该可以按预期工作。在我的情况下,它不起作用,因为我的视图层次结构设置不正确。

如果您遇到问题,请查看如何添加子视图(即[self.view addSubview:mapView]。确保MKMapView 正确位于UIScrollView 的层次结构中。

另外,我真的很喜欢revealapp.com 来检查视图层次结构(不,我与它们没有关联;)

【讨论】:

以上是关于MKMapView 平移导致父 UIScrollView 滚动的主要内容,如果未能解决你的问题,请参考以下文章

在不干扰平移的情况下向 MKMapView 添加左滑动手势

如何在自定义 UIView 下方的 MKMapview 中启用 touchEvents(滚动和平移)?

在 MKMapView 中释放缓存

如何延迟/减慢 UIScrollView 平移速度

如何在 MKMapView 中将图钉和地图保持在移动叠加层上方的中心

MKMapView 注释取消选择策略