2013-10-03 22 views
5

Tôi đang cố gắng tải nó sao cho khi bạn xoay bản đồ iOS 7 mà các chú thích xoay cùng với tiêu đề camera. Hãy tưởng tượng tôi đã có chú thích pin phải trỏ đến Bắc mọi lúc.Cập nhật chú thích bản đồ trên máy ảnh bản đồ iOS 7 xoay

Điều này có vẻ đơn giản lúc đầu, cần có một MKMapViewDelegate để quay camera nhưng không có.

Tôi đã cố gắng sử dụng các đại biểu đồ để sau đó truy vấn xem bản đồ của đối tượng camera.heading nhưng trước hết các đại biểu chỉ dường như được gọi là một lần trước và một lần sau khi một cử chỉ xoay:

- (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated 
- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated 

Tôi cũng đã cố gắng sử dụng KVO trên đối tượng camera.heading nhưng điều này không hoạt động và đối tượng máy ảnh dường như là một loại đối tượng proxy chỉ cập nhật khi cử chỉ xoay hoàn tất.

Phương pháp thành công nhất của tôi cho đến nay là thêm trình nhận dạng cử chỉ xoay để tính toán đồng bằng xoay và sử dụng điều này với tiêu đề máy ảnh được báo cáo ở đầu đại biểu thay đổi vùng. Điều này làm việc đến một điểm nhưng trong hệ điều hành 7 bạn có thể 'flick' cử chỉ quay của bạn và nó cho biết thêm vận tốc mà tôi dường như không thể theo dõi. Có cách nào để theo dõi tiêu đề máy ảnh trong thời gian thực không?

- (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated 
{ 
    heading = self.mapView.camera.heading; 
} 

- (void)rotationHandler:(UIRotationGestureRecognizer *)gesture 
{ 
    if(gesture.state == UIGestureRecognizerStateChanged) { 

     CGFloat headingDelta = (gesture.rotation * (180.0/M_PI)); 
     headingDelta = fmod(headingDelta, 360.0); 

     CGFloat newHeading = heading - headingDelta; 

     [self updateCompassesWithHeading:actualHeading];   
    } 
} 

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated 
{ 
    [self updateCompassesWithHeading:self.mapView.camera.heading]; 
} 

Trả lời

3

Apple không cập nhật thời gian thực cho bất kỳ thông tin bản đồ nào. Đặt cược tốt nhất của bạn là thiết lập một CADisplayLink và cập nhật bất cứ điều gì bạn cần khi nó thay đổi. Một cái gì đó như thế này.

@property (nonatomic) CLLocationDirection *previousHeading; 
@property (nonatomic, strong) CADisplayLink *displayLink; 


- (void)setUpDisplayLink 
{ 
    self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(displayLinkFired:)]; 

    [displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes]; 
} 


- (void)displayLinkFired:(id)sender 
{ 
    double difference = ABS(self.previousHeading - self.mapView.camera.heading); 

    if (difference < .001) 
     return; 

    self.previousHeading = self.mapView.camera.heading; 

    [self updateCompassesWithHeading:self.previousHeading]; 
} 
+0

Cảm ơn @Ross, có vẻ như đây là lựa chọn duy nhất. Bực bội. Tôi có thể gửi báo cáo lỗi. – Electron

Các vấn đề liên quan