Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 尝试使用didSelectAnnotationView和didSelectAnnotationView在视线内和视线外设置子视图的动画_Iphone_Ios_Mkmapview_Mkannotation_Uiviewanimation - Fatal编程技术网

Iphone 尝试使用didSelectAnnotationView和didSelectAnnotationView在视线内和视线外设置子视图的动画

Iphone 尝试使用didSelectAnnotationView和didSelectAnnotationView在视线内和视线外设置子视图的动画,iphone,ios,mkmapview,mkannotation,uiviewanimation,Iphone,Ios,Mkmapview,Mkannotation,Uiviewanimation,我在MKMapView上设置了多个注释。我不想在单击pin时使用地图注释标注,而是想在屏幕底部设置子视图(self.detailView)的动画,并在未选择任何内容时将其移回。当用户选择了一个pin,然后选择了另一个pin时,我希望我的视图在屏幕外设置动画,然后立即在屏幕上设置动画(当然,使用与新选择的注释相对应的不同信息) 不费吹灰之力,我尝试了一件看似简单的事情——选择注释时,在屏幕上设置self.detailView动画,取消选择时,在屏幕下设置self.detailView动画: - (

我在MKMapView上设置了多个注释。我不想在单击pin时使用地图注释标注,而是想在屏幕底部设置子视图(
self.detailView
)的动画,并在未选择任何内容时将其移回。当用户选择了一个pin,然后选择了另一个pin时,我希望我的视图在屏幕外设置动画,然后立即在屏幕上设置动画(当然,使用与新选择的注释相对应的不同信息)

不费吹灰之力,我尝试了一件看似简单的事情——选择注释时,在屏幕上设置
self.detailView
动画,取消选择时,在屏幕下设置
self.detailView
动画:

- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view
{
    NSLog( @"selected annotation view" );

    [UIView animateWithDuration:0.2f
                          delay:0.0f
                        options:UIViewAnimationOptionCurveEaseInOut | UIViewAnimationOptionAllowUserInteraction
                      animations:^{
                          [self.detailView setFrame:CGRectMake(0, 307, 320, 60)];       
                      }
                      completion:^(BOOL finished){                

                      }];
}

- (void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view
{
    NSLog( @"deselected annotation view" );

    [UIView animateWithDuration:0.2f
                          delay:0.0f
                        options:UIViewAnimationOptionCurveEaseInOut | UIViewAnimationOptionAllowUserInteraction
                      animations:^{
                          [self.detailView setFrame:CGRectMake(0, 367, 320, 60)];       
                      }
                      completion:^(BOOL finished){

                      }];

}
当未选择pin且用户选择pin时,以及当选择pin且用户通过单击空白来取消选择pin时,此功能正常工作。当然,当一个pin已经被选中时会出现问题:如果用户单击另一个pin,
didDecelectAnnotationView
didSelectAnnotationView
会快速连续触发,两个动画会试图同时运行,结果效果无法正常工作。通常我会通过将第二个动画放在第一个动画的完成块中来将动画链接在一起,但由于它们采用不同的方法,我显然不能在这里这样做


有人对我如何避开这个问题有什么想法吗?谢谢

也许有更好的方法来做你想做的事,但我会先回答你的具体问题

在控制器中实现公共方法,以控制关闭和再次打开动画的视图:

- (void)showInfoView:(MyInfoClass*)theInfo;
- (void)hideInfoView;
showInfoView
中,您设置一个在屏幕上显示/显示的标志,并对其设置动画-在块中执行此代码,并立即调用它,以使其像这样工作

dispatch_block_t showBlock = ^
{
    self.isShowing = YES;
    /* show code goes here */
};
showBlock();
dispatch_block_t nextShowBlock = [toShowBlocks objectAtIndex:0];
[toShowBlocks removeObjectAtIndex:0];
nextShowBlock();
hideInfo视图
中,可以将其设置为关闭动画,并在动画完成块中取消设置标志

现在,在调用该
showBlock
之前,在
showInfoView
中检查该标志以确保它尚未显示-如果它已显示,而不是立即执行该块,则将其添加到名为
toShowBlocks
NSMutableArray
的末尾。然后在取消设置标志之前,在
hideInfo视图中检查
toShowBlocks
数组是否为空,如果不是空,则删除并调用第一项(将数组用作FIFO队列),如下所示

dispatch_block_t showBlock = ^
{
    self.isShowing = YES;
    /* show code goes here */
};
showBlock();
dispatch_block_t nextShowBlock = [toShowBlocks objectAtIndex:0];
[toShowBlocks removeObjectAtIndex:0];
nextShowBlock();
然后,您只需在选择/取消选择管脚时调用show和hide方法,这将为您解决问题。这至少会让你走上正确的道路

也许是更好的方法:


上面的方法有一些问题,如果用户疯狂地按图钉,动画视图可能会被隐藏和显示很多,从而导致在用户获取最后一个动画之前,动画队列冗长。此外,视图不会像用户平移和缩放地图时的注释那样跟随地图。因此,您最好为您的信息视图使用自定义注释。这是一个真正的难题,因为
MKAnnotation
视图的行为与常规
UIView
s不同,这会导致各种问题。然而,我在这个答案中描述了一种使用
MKAnnotation
s作为自定义调用的方法:。

使用标志来协调动画。您可以在完成块中链接动画,但是您也可以通过将第二个动画的延迟设置为第一个动画的持续时间来连续制作动画,尽管时间不那么精确。回答得很好。我对自定义注释做了一系列研究,认为不值得继续这样做——相反,我基于pin选择显示和隐藏的视图将仅位于整个屏幕底部,而不管pin位于何处或地图如何移动。虽然感觉上与定制呼出略有不同,但我认为它仍然会产生很好的效果。关于用户“发疯”的可能性,您是对的,但我现在将使用您的block方法,看看它是如何运行的。