2011-04-07 54 views

回答

58

首先在地圖和viewForAnnotation方法中添加一個註釋,將rightCalloutAccessoryView設置爲一個類型爲UIButtonTypeDetailDisclosure的按鈕(我不認爲藍色信息按鈕默認可用)。

按下按鈕將調用calloutAccessoryControlTapped委託方法。在此方法中,取消選擇註釋並顯示彈出窗口。例如:

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control 
{ 
    [mapView deselectAnnotation:view.annotation animated:YES]; 

    YourContentViewController *ycvc = [[YourContentViewController alloc] init... 
    UIPopoverController *poc = [[UIPopoverController alloc] initWithContentViewController:ycvc]; 
    [ycvc release]; 

    //hold ref to popover in an ivar 
    self.annotationPopoverController = poc; 

    //size as needed 
    poc.popoverContentSize = CGSizeMake(320, 400); 

    //show the popover next to the annotation view (pin) 
    [poc presentPopoverFromRect:view.bounds inView:view 
     permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; 

    [poc release]; 
} 

YourContentViewController是的UIViewController的一個子類,其可以編碼像任何其他視圖控制器。地圖應用看起來像在內容中具有UITableView。

+0

很好的答案,真的很詳細。 – Robert 2011-04-07 16:37:06

+0

在地圖應用程序中,在這種情況下有一個有趣的動畫,而不是較小的氣泡被解散和新的彈出窗口,小氣泡實際上擴展到適合彈出視圖。任何想法如何做到這一點? – 2011-08-17 17:39:23

+0

@Chris Wagner:不知道Maps應用是如何執行它,但是嘗試最初顯示具有較小高度的彈出窗口,然後使用timer或performSelector:withObject:afterDelay,手動激活popoverContentSize並使用更新的rect重新呈現彈出窗口(原點向上移動,身高增加)。另一個選擇可能是首先顯示/動畫從中間展開的常規自定義UIView,然後顯示最終大小的彈窗(並移除下面的自定義UIView)。在地圖應用程序中,標註也左右移動,這可以通過更新view.calloutOffset來完成。 – Anna 2011-08-17 19:09:27

2

看來,有對酥料餅的一個更好的位置,你必須從該矩形目前它:

CGPoint lc_point = [mapView convertCoordinate:view.annotation.coordinate toPointToView:mapView]; 
CGRect lc_frame = CGRectMake(lc_point.x,lc_point.y-view.frame.size.height,0,0); 
2

您可以使用像戈登休斯Animated Callout庫。不幸的是,它仍然不能在iOS 6上完美運行(標註出現奇怪)。

這裏的iOS 5:

enter image description here

相關問題