2010-06-12 36 views
8

trên iPhone 3GS trong ứng dụng "Bản đồ", bạn có thể nhấp vào biểu tượng thường hiển thị vị trí của bạn hai lần và chấm xanh dương trông giống như một chùm từ đèn pha. bạn hướng bạn đang phải đối mặt trên bản đồ và xoay hình ảnh cho phù hợp.làm cách nào tôi có thể hiển thị la bàn/tiêu đề trên bản đồ mapkit

Tùy chọn này có sẵn bằng MapKit MapView không?

Tôi biết rằng tôi có thể nhận tiêu đề của tôi với một cái gì đó giống như

- (void)locationManager:(CLLocationManager *) manager didUpdateHeading:(CLHeading *) newHeading { 

// Nếu tính chính xác là hợp lệ, quá trình sự kiện này.

if (newHeading.headingAccuracy > 0) { 

    CLLocationDirection theHeading = newHeading.magneticHeading; 
    ... 
} 

}

nhưng tôi không biết làm thế nào để nhận được rằng tác dụng đèn pha ngơi thoải mái tại Mapkit và có dường như không có bất kỳ tài liệu.

Bất kỳ ý tưởng nào?

+0

này là một câu hỏi id tốt cũng muốn biết câu trả lời – si28719e

+0

Tôi nghĩ câu trả lời là nó không thể được thực hiện bằng cách sử dụng MapKit. Tôi tự hỏi làm thế nào các ứng dụng như Geocaching làm điều này? Hay đúng hơn là, nếu có rất nhiều công việc, hãy xem chế độ xem bản đồ của riêng bạn. – PEZ

+0

Có thể được thực hiện bằng cách sử dụng self.mapView.userTrackingMode = RMUserTrackingModeFollowWithHeading; – ScarletWitch

Trả lời

2

Tôi có thể nghĩ ra một phương pháp, mặc dù tôi chưa triển khai nhưng có thể giúp bạn một chút.

  1. Trước tiên, bạn cần hình ảnh có con trỏ là lựa chọn ur, con trỏ này phải trỏ lên trên 90 độ.
  2. Bây giờ, trong MapKit của bạn, hãy tắt Điểm đánh dấu vị trí hiện tại.
  3. Trong số didUpdateHeading, hãy sử dụng giá trị x và y để tính góc của hướng.
  4. Sử dụng góc này để xoay hình ảnh của con trỏ
  5. Sử dụng hình ảnh được xoay này làm Ghim chú thích trong bản đồ của bạn.
  6. Bạn sẽ cần cập nhật vị trí của con trỏ thường xuyên.

Vui lòng gửi đề xuất/thay đổi của bạn cho phương pháp trên.

Cảm ơn

+0

Im Maps không phải là "con trỏ" được xoay nhưng bản thân bản đồ, con trỏ luôn luôn giữ nguyên giống với đầu thiết bị của bạn. Vấn đề là khi cập nhật vị trí của chú thích. – myell0w

4

Tôi tìm thấy một giải pháp:

tôi xoay bản đồ bằng cách sử dụng tiêu đề-thông tin có sẵn với

[mapView setTransform:CGAffineTransformMakeRotation(heading.magneticHeading * M_PI/-180.0)]; 

Do đó "chùm" luôn luôn chỉ vào phía trên cùng của thiết bị. Tôi bây giờ chỉ hiển thị một ImageView trên bản đồ và thay đổi vị trí của nó trong locationManager: didUpdateToLocation: fromLocation:

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { 
     // scroll to new location 
    MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(newLocation.coordinate, 2000, 2000); 
    [self.mapView setRegion:region animated:YES]; 

     // set position of "beam" to position of blue dot 
    self.headingAngleView.center = [self.mapView convertCoordinate:newLocation.coordinate toPointToView:self.view]; 
     // slightly adjust position of beam 
    self.headingAngleView.frameTop -= self.headingAngleView.frameHeight/2 + 8; 
} 

Nhờ đó mà frameTop và frameHeight là phím tắt cho frame.origin.y và frame.size.height. Nó không phải là lý tưởng và đôi khi thiếu một chút khi dấu chấm thay đổi vị trí của nó, nhưng tôi hài lòng với giải pháp b/c nó hoạt động.

Hãy nhìn vào mã nguồn mở khuôn khổ MTLocation của tôi mà thực hiện điều này tất cả (và rất nhiều mát mẻ thứ đồ khác liên quan đến cho bạn):

3

Logic xoay các câu trả lời khác là tốt, tuy nhiên, dựa vào các phương thức đại biểu của người quản lý vị trí sẽ không dẫn đến một giải pháp tốt. Hình ảnh "chùm" sẽ hiếm khi ở cùng một vị trí với chấm màu xanh và sẽ trả lại rất nhiều.

Giải pháp tốt nhất là lấy tham chiếu đến chế độ xem chấm màu xanh lam và thêm hình ảnh "chùm" làm tiểu sử vào nó. Tôi đã đi với một hình ảnh chùm đó là một hình vuông, với chùm lên trên và minh bạch xung quanh nó. Hãy tưởng tượng chấm màu xanh lam nằm ở giữa hình ảnh.


// An MKMapViewDelegate method. Use this to get a reference to the blue dot annotation view as soon as it gets added 
- (void)mapView:(MKMapView *)aMapView didAddAnnotationViews:(NSArray *)views { 

    for (MKAnnotationView *annotationView in views) { 

     // Get the user location view, check for all of your custom annotation view classes here 
     if (![annotationView isKindOfClass:[MKPinAnnotationView class]]) 
     { 
      self.userLocationAnnotationView = annotationView; 
      gotUsersLocationView = YES; 
     } 
    } 
} 


// Adds the 'viewPortView' to the annotation view. Assumes we have a reference to the annotation view. Call this before you start listening to for heading events. 
- (void)addViewportToUserLocationAnnotationView { 
    TTDASSERT(self.userLocationAnnotationView != nil); 
    if (self.userLocationAnnotationView == nil) { 
     // No reference to the view, can't do anything 
     return; 
    } 

    if (self.viewPortView == nil) { 
     self.viewPortView = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"map_viewport.png"]] autorelease]; 
    } 

    [self.userLocationAnnotationView addSubview:self.viewPortView]; 
    [self.userLocationAnnotationView sendSubviewToBack:self.viewPortView]; 

    self.viewPortView.frame = CGRectMake((-1 * self.viewPortView.frame.size.width/2) + self.userLocationAnnotationView.frame.size.width/2, 
             (-1 * self.viewPortView.frame.size.height/2) + self.userLocationAnnotationView.frame.size.height/2, 
             self.viewPortView.frame.size.width, 
             self.viewPortView.frame.size.height); 
} 
+0

Mã này có phù hợp với bạn không? Tôi đã thử nó nhưng userLocationAnnotationView remians không thay đổi. – chatur

+0

nơi bạn gọi phương thức addViewportToUserLocationAnnotationView? – chatur

+0

Cập nhật: didAddAnnotationXem không nhận được gọi cho tôi trên thiết bị nhưng được gọi trên trình mô phỏng và giải pháp của bạn hoạt động hoàn hảo trên trình mô phỏng. bạn có ý kiến ​​gì không? – chatur

3

Việc thêm chế độ theo dõi người dùng cũng sẽ giúp ích. Tôi biết tôi là muộn, nhưng có thể là một sự giúp đỡ để các nhà phát triển khác như tôi :)

self.mapView.userTrackingMode = RMUserTrackingModeFollowWithHeading; 
1

Swift 3 thực hiện

mapView.userTrackingMode = MKUserTrackingMode.followWithHeading 
Các vấn đề liên quan