滚动 MKMapView 时淡出弹出框
Posted
技术标签:
【中文标题】滚动 MKMapView 时淡出弹出框【英文标题】:Fade popover while scrolling MKMapView 【发布时间】:2012-04-06 11:32:50 【问题描述】:我有一个带有按钮栏的基于 MKMapView 的应用程序,当用户在地图视图上选择注释时,一个按钮可用于显示按钮栏上的弹出框。
弹出框只覆盖地图视图的一部分我想要做的是当用户滚动弹出框后面的地图视图的可见部分时,我希望弹出框淡出以显示它后面的地图视图,当用户停止滚动时,我希望弹出框在一秒钟左右后再次淡入。
我知道我可以定义在弹出框结束时仍希望能够与之交互的视图,但是处理淡入淡出的最佳方法是什么?
谢谢, 标记
【问题讨论】:
【参考方案1】:要知道用户何时拖动地图,需要一个delegate on the MKMapView,并响应regionWillChangeAnimated和regionDidChangeAnimated。文档声称这些可能在拖动过程中被多次调用,但我没有看到这种情况发生。
但是,请参阅this discussion of these delegate methods not being called reliably。
编辑:我最初的回答建议使用 Core Animation 来淡化弹出框,但这是不可行的。见 cmets。即使您获得了弹出框的contentViewController
,并获得了它的view
,并更改了该视图的alpha
,除非您通过层层次结构进行搜索,否则弹出框会留下阴影。如果可能的话,dismiss
和 present
会改为弹出框。这可能不如 Core Animation 方便,因为您可能需要NSTimer
来控制恢复之前的延迟。
对于地图视图顶部的其他视图,一旦您知道何时发生拖动,请使用核心动画淡出您的弹出框并再次淡入。调整视图的持续时间、延迟和名称以适应淡入淡出。
- (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];
【讨论】:
我查看了您的代码示例,但我认为您不能在弹出窗口上调用 setAlpha 或者我有什么问题? 糟糕,是的。您可以访问popoverController.contentViewController.view
,但使其透明或移动它会留下单独的阴影。该阴影是由视图层次结构中的几个级别的视图创建的,其类为_UIPopoverView
,并且阴影应用于其主层的第一个子层。就个人而言,我不会弄乱它。出于您的目的,是否可以像上面那样检测地图移动,然后关闭弹出框直到地图移动结束?您可能需要一个 UITimer 来延迟弹出框重新出现,但这很简单。以上是关于滚动 MKMapView 时淡出弹出框的主要内容,如果未能解决你的问题,请参考以下文章
updatepanel 里面放ASPxGridView,使用RegisterClientScriptBlock方法,弹出框弹不出