2014-04-21 19 views
16

Tôi đang sử dụng nút MKUserTrackingBarButtonItem để cho phép người dùng tự động theo dõi vị trí của họ trên bản đồ. Vấn đề là khi họ chạm vào nút này, nó được thu nhỏ quá xa. Tôi muốn nó bắt đầu ở một mức thu phóng cụ thể (tức là khoảng thời gian). Làm thế nào tôi có thể đạt được điều này?Làm cách nào để chỉ định mức thu phóng khi sử dụng MKUserTrackingBarButtonItem?

Khi người dùng nhấn nút để thay đổi thành MKUserTrackingModeFollow, có vẻ như sử dụng cùng một mức thu phóng mà người dùng cuối cùng đã thay đổi theo cách thủ công (tức là sử dụng cử chỉ trên bản đồ). Cố gắng chỉ định mức thu phóng khác thông qua setRegion hoặc setVisibleMapRect không ảnh hưởng đến mức thu phóng sẽ được sử dụng khi chế độ được thay đổi thành MKUserTrackingModeFollow.

Cố gắng override mapView:didChangeUserTrackingMode: để đặt khu vực làm cho chế độ được thay đổi trở lại thành MKUserTrackingModeNone. Ví dụ:

- (void)mapView:(MKMapView *)mapView didChangeUserTrackingMode:(MKUserTrackingMode)mode animated:(BOOL)animated { 
    if (mode == MKUserTrackingModeFollow) { 
     CLLocationCoordinate2D center = mapView.userLocation.location.coordinate; 
     MKCoordinateSpan span = MKCoordinateSpanMake(0.002306, 0.001717); 
     [mapView setRegion:MKCoordinateRegionMake(center, span) animated:YES]; 
     // [mapView setUserTrackingMode:MKUserTrackingModeFollow animated:NO]; 
    } 
} 

Nếu tôi cố gắng để thiết lập lại chế độ ngay sau khi thiết lập khu vực, nó hoạt động tốt nếu người dùng là tĩnh, nhưng phóng trở ra nếu người dùng đang di chuyển.

Giải pháp đơn giản nhất là nếu có cách đơn giản chỉ định thứ gì đó giống như mức thu phóng cho MKUserTraking bằng cách gửi giá trị khoảng của tôi. Tuy nhiên, vì điều đó dường như không tồn tại, tôi có thể làm gì khác?

+0

Bạn đã tìm thấy một giải pháp cho điều này? Tôi hiện đang đập đầu vào cùng một vấn đề. –

Trả lời

7

Tôi đã gặp vấn đề tương tự và sử dụng một cách tiếp cận khác để khắc phục sự cố. Bạn có thể sử dụng chức năng MapCamera cho mục này thay vì nút đó.

Trên mỗi vị trí mới làm được điều này:

MKMapCamera *newCamera = [MKMapCamera cameraLookingAtCenterCoordinate:[newLocation coordinate] 
fromEyeCoordinate:[oldLocation coordinate] 
eyeAltitude:2000]; 

[mapView setCamera:newCamera animated:TRUE]; 

Và chơi với eyeAltitude.

Nếu người dùng phóng to hoặc thu nhỏ thủ công, bạn có thể đọc giá trị độ cao từ mapview.camera.altitude cũng không cập nhật máy ảnh khi người dùng đang sử dụng bản đồ theo cách thủ công.

+0

có vẻ như đây là cách duy nhất! – Rassam

0

Theo tài liệu táo sử dụng ở đây

https://developer.apple.com/reference/mapkit/mkmapview/1616208-usertrackingmode

Thiết lập chế độ theo dõi để làm theo hoặc làm theo Với Tựa đề gây ra xem bản đồ để căn giữa bản đồ vị trí đó và bắt đầu theo dõi người dùng của vị trí. Nếu bản đồ được thu nhỏ, chế độ xem bản đồ sẽ tự động phóng to trên vị trí của người dùng, thay đổi hiệu quả vùng hiển thị hiện tại.

Tại đây, việc thay đổi khu vực không ảnh hưởng đến khu vực hiển thị của bạn do lý do đó.

- (void)mapView:(MKMapView *)mapView didChangeUserTrackingMode:(MKUserTrackingMode)mode animated:(BOOL)animated { 
if (mode == MKUserTrackingModeFollow) { 
    CLLocationCoordinate2D center = mapView.userLocation.location.coordinate; 
    MKCoordinateSpan span = MKCoordinateSpanMake(0.002306, 0.001717); 
    [mapView setRegion:MKCoordinateRegionMake(center, span) animated:YES]; 
    // [mapView setUserTrackingMode:MKUserTrackingModeFollow animated:NO]; 
} 
} 

Vì vậy, bạn chỉ cần thay đổi trung tâm phối hợp trên didChangeUserTrackingMode thay vì thay đổi toàn bộ khu vực

- (void)mapView:(MKMapView *)mapView didChangeUserTrackingMode:(MKUserTrackingMode)mode animated:(BOOL)animated { 
if (mode == MKUserTrackingModeFollow) { 
    [self.mapView setCenterCoordinate:mapView.userLocation.location.coordinate animated:YES]; 
    } 
} 

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation { 
    [self.mapView setCenterCoordinate:mapViewuserLocation.location.coordinate animated:YES]; 
} 

trên click MKUserTrackingBarButtonItem thay đổi mức độ zoom

CLLocationCoordinate2D center = mapView.userLocation.location.coordinate; 
MKCoordinateSpan span = MKCoordinateSpanMake(0.002306, 0.001717); 
[mapView setRegion:MKCoordinateRegionMake(center, span) animated:YES]; 
Các vấn đề liên quan