2013-08-28 38 views
5

Dựa trên những gì tôi tìm thấy trên câu hỏi SO này (Touch events on MKMapView's overlays), tôi đã thực hiện một cách để đánh chặn cử chỉ chạm trên MKPolygon.Phát hiện Chạm vào MKPolygonXem trong MKMapView trên iOS7

Nó hoạt động tốt trong ứng dụng của chúng tôi được xây dựng bằng Xcode 4.6.3 so với iOS 6. Tuy nhiên mọi thứ ngừng hoạt động khi tôi thử trên thiết bị iOS 7.

Cụ

CLLocationCoordinate2D coord = [neighborhoodMap_ convertPoint:point 
              toCoordinateFromView:neighborhoodMap_]; 

    // We get view from MKMapView's viewForOverlay. 
    MKPolygonView *polygonView = (MKPolygonView*) view; 
    CGPoint polygonViewPoint = [polygonView pointForMapPoint:mapPoint]; 
    BOOL mapCoordinateIsInPolygon = CGPathContainsPoint(polygonView.path, 
                 NULL, 
                 polygonViewPoint, 
                 NO); 

Đối với một số lý do cuộc gọi đến CGPathContainsPoint không còn trả YES thậm chí tọa độ nhất định là trong MKPolygonView. Bạn không chắc chắn nếu có ai gặp vấn đề này, nhưng tôi sẽ đánh giá cao bất kỳ thông tin chi tiết nào bạn có thể có.

Cảm ơn!

+0

Nó chỉ ra rằng tài sản của con đường polygonView là NULL. Nó chắc chắn là một lỗi kỳ lạ .. – dfujiwara

+0

Chắc chắn là một lỗi, tôi có cùng một vấn đề. Đăng nhập một vé với Apple. – Dwill

+0

Vâng, tôi đã gửi một vé lỗi cho Apple với một ứng dụng mẫu. Hy vọng rằng họ sẽ sửa chữa nó cho iOS7 GA .. qua các ngón tay của tôi. – dfujiwara

Trả lời

1

Tôi đã gặp sự cố tương tự và chỉ đọc qua các tài liệu tôi thấy rằng MKPolygonView đã không được chấp nhận trong iOS7 và nên sử dụng MKPolygonRenderer thay thế.

+0

Lưu ý rằng MKPolygonRenderer chỉ là iOS7. – sethpollack

0

Tôi đã gặp phải vấn đề tương tự và có thể khắc phục sự cố với một giải pháp thay thế, nhưng nó chắc chắn trông giống như một lỗi trên đầu của quả táo. Tôi nhận thấy rằng các "đường dẫn" tài sản không phải là NULL ngay khi MKpolygonView được tạo ra, nhưng là NULL bất cứ khi nào tôi muốn tham khảo nó. Giải pháp là để thêm tài sản khác để phân lớp MKPolygonView như sau:

@property CGPathRef savedPath; 

và sau đó bạn phải gán nó khi nó không phải là NULL:

polygonOverlay.savedPath = CGPathCreateCopy(polygonOverlay.path); 

Sau đó, chỉ cần kiểm tra chống self.savedPath bất cứ khi nào cần thiết. Một lần nữa đây không phải là một giải pháp lâu dài, nhưng sẽ giải quyết vấn đề của các ứng dụng nhắm mục tiêu đến ios6 trên các thiết bị ios7.

+0

Điều này không hiệu quả đối với tôi, đường dẫn luôn rỗng trong ios7 – Dwill

+0

Tôi sử dụng phần sau để tạo lớp phủ: 'polygonOverlay = [[Phân bố đa giácOverlay] lớp phủ initWithPolygon: (MKPolygon *)]' Trong chế độ xemĐểxóa lớp nơi polygonOverlay là một lớp con của MKPolygonView. Sau này nó có một thuộc tính path cho tôi có thể được lưu lại. – RJDubz

+0

Tôi đã thử phương pháp này, và một khi tôi tham khảo .path để sao chép vào .savedPath, lớp phủ của tôi không còn rút ra (và thử nghiệm hit CGPathContainsPoint vẫn không hoạt động). RJDubz có lẽ bạn có thể gửi một mẫu mã hoàn chỉnh hơn? – sethpollack

2

Kể từ iOS 7 bạn cần phải sử dụng MKOverlayRenderer:

BOOL tapInPolygon = NO; 
MKOverlayRenderer * polygonRenderer = [mapView rendererForOverlay:polygonOverlay]; 
if ([polygonRenderer isKindOfClass:[MKPolygonRenderer class]]) { 

    //Convert the point 
    CLLocationCoordinate2D coordinate = [self.mapView convertPoint:tapPoint 
               toCoordinateFromView:self.mapView]; 
    MKMapPoint mapPoint = MKMapPointForCoordinate(coordinate); 
    CGPoint polygonViewPoint = [polygonRenderer pointForMapPoint:mapPoint]; 

    // with iOS 7 you need to invalidate the path, this is not required for iOS 8 
    [polygonRenderer invalidatePath]; 

    tapInPolygon = CGPathContainsPoint(polygonRenderer.path, NULL, polygonViewPoint, NO); 
} 
Các vấn đề liên quan