滚动MKMapView时淡入弹出窗口

时间:2012-04-06 11:32:51

标签: objective-c ios mkmapview fade uipopover

我有一个带有按钮栏的基于MKMapView的应用程序,当用户在地图视图上选择一个注释时,一个按钮可用于显示按钮栏中的弹出窗口。

popover只覆盖地图视图的一部分我想要做的是当用户滚动popover后面的地图视图的可见部分时我希望popover淡出以显示它后面的地图视图,当用户停止滚动时,我希望弹出窗口在一秒左右后再次淡入。

我知道我可以定义视图,我仍然希望能够在弹出窗口结束时进行交互,但是最好的方法是什么呢?

谢谢, 标记

1 个答案:

答案 0 :(得分:1)

要知道用户何时拖动地图,您需要delegate on the MKMapView,并回复regionWillChangeAnimated和regionDidChangeAnimated。文档声称在拖动过程中可能会多次调用这些文件,但我看不到这种情况。

但是,请参阅this discussion of these delegate methods not being called reliably

编辑:我的原始答案建议使用Core Animation淡化弹出窗口,但这是不可行的。查看评论。即使您获得了popover的contentViewController并获得其view,并更改了该视图的alpha,弹出窗口也会留下阴影,除非您搜索图层层次结构。如果可能的话,dismisspresent代替popover。这可能不如Core Animation方便,因为您可能需要NSTimer来控制延迟才能恢复。

对于地图视图顶部的其他视图,一旦知道何时进行拖动,请使用Core Animation将弹出窗口淡出并重新打入。调整视图的持续时间,延迟和名称以淡化以适应。

- (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated;
{
    [UIView animateWithDuration:0.25 delay:0.0 options:UIViewAnimationOptionAllowUserInteraction animations:^
    {
        [[self viewOnTopOfMapView] setAlpha:0.0];
    }
    completion:nil];
}

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated;
{
    [UIView animateWithDuration:0.25 delay:2.0 options:UIViewAnimationOptionAllowUserInteraction animations:^
    {
         [[self viewOnTopOfMapView] setAlpha:1.0];
    }
    completion:nil];
}