2010-10-18 10 views

Trả lời

190

Bạn có thể sử dụng UILongPressGestureRecognizer cho việc này. Bất cứ nơi nào bạn tạo hoặc khởi tạo MapView, đầu tiên gắn recognizer với nó:

UILongPressGestureRecognizer *lpgr = [[UILongPressGestureRecognizer alloc] 
    initWithTarget:self action:@selector(handleLongPress:)]; 
lpgr.minimumPressDuration = 2.0; //user needs to press for 2 seconds 
[self.mapView addGestureRecognizer:lpgr]; 
[lpgr release]; 

Sau đó, trong xử lý cử chỉ:

- (void)handleLongPress:(UIGestureRecognizer *)gestureRecognizer 
{ 
    if (gestureRecognizer.state != UIGestureRecognizerStateBegan) 
     return; 

    CGPoint touchPoint = [gestureRecognizer locationInView:self.mapView]; 
    CLLocationCoordinate2D touchMapCoordinate = 
     [self.mapView convertPoint:touchPoint toCoordinateFromView:self.mapView]; 

    YourMKAnnotationClass *annot = [[YourMKAnnotationClass alloc] init]; 
    annot.coordinate = touchMapCoordinate; 
    [self.mapView addAnnotation:annot]; 
    [annot release]; 
} 

YourMKAnnotationClass là một lớp học mà bạn xác định rằng phù hợp với các giao thức MKAnnotation. Nếu ứng dụng của bạn sẽ chỉ chạy trên iOS 4.0 trở lên, bạn có thể sử dụng lớp được xác định trước MKPointAnnotation thay thế.

Ví dụ về cách tạo lớp MKAnnotation của riêng bạn, xem các ứng dụng mẫu WeatherMapMapCallouts.

+0

Cảm ơn bạn, nó làm việc –

+6

câu trả lời Awesome, cảm ơn. Cá nhân tôi lật câu lệnh if thành '==' để nó trả về nếu nó không phải là * 'UIGestureRecognizerStateBegan'. Thực hiện việc này sẽ thả ghim sau khoảng thời gian đã chỉ định, ngay cả khi người dùng vẫn đang giữ bản đồ mà tôi mong muốn (và cách ứng dụng Maps chính thức thực hiện). –

+0

Tôi chỉ muốn nói rằng tôi đã thực hiện câu trả lời của bạn vào dự án của tôi và nó hoạt động như một sự quyến rũ. Cảm ơn bạn vì câu trả lời tuyệt vời nhất của bạn. – DoubleDunk

32

Nhờ Anna đã cung cấp câu trả lời tuyệt vời như vậy! Đây là phiên bản Swift nếu có ai quan tâm (câu trả lời đã được cập nhật thành cú pháp Swift 3.0).

Tạo UILongPressGestureRecognizer:

let longPressRecogniser = UILongPressGestureRecognizer(target: self, action: #selector(MapViewController.handleLongPress(_:))) 
longPressRecogniser.minimumPressDuration = 1.0 
mapView.addGestureRecognizer(longPressRecogniser) 

Xử lý các cử chỉ:

func handleLongPress(_ gestureRecognizer : UIGestureRecognizer){ 
    if gestureRecognizer.state != .began { return } 

    let touchPoint = gestureRecognizer.location(in: mapView) 
    let touchMapCoordinate = mapView.convert(touchPoint, toCoordinateFrom: mapView) 

    let album = Album(coordinate: touchMapCoordinate, context: sharedContext) 

    mapView.addAnnotation(album) 
} 
+0

Wow ... Tôi đã không nhận thấy điều này và đã dành một thời gian dài chuyển đổi nó. –

+2

Có thể sử dụng _ ** để longPressRecogniser = UILongPressGestureRecognizer (đích: tự, hành động: "handleLongPress:") ** _ –

+0

@Dx_ có bạn có thể vì trình nhận dạng không bị sửa đổi. Các thuộc tính trong trình nhận dạng đang được sửa đổi. – 3366784