我有一个带有按钮栏的基于 MKMapView 的应用程序,当用户在地图视图上选择注释时,一个按钮可用于显示按钮栏中的弹出框。
弹出框只覆盖地图视图的一部分我想要做的是当用户滚动弹出框后面的地图视图的可见部分时我希望弹出框淡出以显示它后面的地图视图,当用户停止滚动我希望弹出框在一秒钟左右后再次淡入。
我知道我可以定义在弹出窗口结束时我仍然希望能够与之交互的视图,但是处理淡入淡出的最佳方法是什么?
谢谢,马克
我有一个带有按钮栏的基于 MKMapView 的应用程序,当用户在地图视图上选择注释时,一个按钮可用于显示按钮栏中的弹出框。
弹出框只覆盖地图视图的一部分我想要做的是当用户滚动弹出框后面的地图视图的可见部分时我希望弹出框淡出以显示它后面的地图视图,当用户停止滚动我希望弹出框在一秒钟左右后再次淡入。
我知道我可以定义在弹出窗口结束时我仍然希望能够与之交互的视图,但是处理淡入淡出的最佳方法是什么?
谢谢,马克
要知道用户何时拖动地图,您需要MKMapView 上的委托,并响应 regionWillChangeAnimated 和 regionDidChangeAnimated。文档声称这些可能在拖动过程中被多次调用,但我没有看到这种情况发生。
但是,请参阅有关这些委托方法未被可靠调用的讨论。
编辑:我原来的答案建议使用核心动画来淡化弹出框,但这是不可行的。见评论。即使你得到了 popover 的contentViewController
, 并得到它的view
, 并改变了 view 的alpha
, popover 也会留下阴影,除非你通过层层次结构进行搜索。如果可能的话,dismiss
用present
弹出框代替。这可能不如 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];
}