2012-10-19 29 views
11

Tôi đang cố gắng lưu hình thu nhỏ của chế độ xem bản đồ khi người dùng nhấn vào lưu khi một chú thích đã được chọn. Sự cố xảy ra khi người dùng chưa thu nhỏ chú thích đó, vì vậy mức thu phóng gần chưa được tải.Làm thế nào để sử dụng MKMapView tải xong đại biểu, có thể "hoàn thành hiển thị" đại biểu?

Đây là những gì tôi đang làm sau khi các vòi sử dụng tiết kiệm:

  1. Đặt một bool "tiết kiệm" true
  2. Trung tâm và phóng to trên chú thích (không động)
  3. Khi Phương thức ủy quyền mapViewDidFinishLoadingMap được gọi và nếu lưu là đúng:
  4. Tạo UII ra khỏi chế độ xem và lưu nó. Loại bỏ chế độ xem phương thức.

Tuy nhiên khi hình ảnh được lưu lại, và xem đó bị hình ảnh kết quả đã lưu thực sự chưa tải xong, như tôi vẫn thấy một bản đồ dỡ với gridlines như hình dưới đây:

Gridlines unfinished

Câu hỏi của tôi là, làm thế nào tôi có thể đảm bảo bản đồ được tải xong và hoàn tất hiển thị trước khi tôi lưu hình thu nhỏ này?

+0

Tôi đã nộp của Apple Bug # 13.774.496 liên quan đến điều này và tạo ra một ứng dụng ví dụ cho thấy vấn đề này vẫn còn tồn tại trên iOS6 : https: // github.com/iwasrobbed/MapKitDelegateBug – iwasrobbed

Trả lời

15

Cập nhật: iOS7 có new delegate có thể khắc phục sự cố này. Tôi chưa xác nhận cách này hay cách khác.

- (void)mapViewDidFinishRenderingMap:(MKMapView *)mapView fullyRendered:(BOOL)fullyRendered 

Pre iOS6 hỗ trợ:

mapViewDidFinishLoadingMap: dường như là unreliable. Tôi nhận thấy đôi khi nó không được gọi, đặc biệt là nếu các ô bản đồ đã được lưu trong bộ nhớ cache và đôi khi nó được gọi nhiều lần.

Tôi nhận thấy rằng khi được gọi nhiều lần cuộc gọi cuối cùng sẽ hiển thị chính xác. Vì vậy, tôi nghĩ bạn có thể làm việc này nếu bạn thiết lập bộ hẹn giờ 2 giây sau khi người dùng chạm vào lưu. Tắt tương tác để không có gì khác có thể xảy ra và cho phép tương tác của người dùng khi bộ hẹn giờ biến mất.

Nếu mapViewDidFinishLoadingMap được gọi là đặt lại hẹn giờ lại trong 2 giây trong tương lai. Khi bộ hẹn giờ cuối cùng đã tắt, hãy chụp nhanh bản đồ và nó sẽ chính xác.

Bạn cũng sẽ muốn xem xét các cuộc gọi lại khác như mapViewDidFailLoadingMap. Ngoài ra kiểm tra này trên một kết nối ồn ào, kể từ 2 giây có thể không đủ dài nếu phải mất một thời gian dài để lấy gạch.

- (void)restartTimer 
{ 
    [self.finishLoadingTimer invalidate]; 
    self.finishLoadingTimer = [NSTimer scheduledTimerWithTimeInterval:2.0 
                   target:self 
                  selector:@selector(mapLoadingIsFinished) 
                  userInfo:nil 
                   repeats:NO]; 
} 

- (void)userClickedSave 
{ 
    assert(self.saving == NO); 
    if (self.saving == NO) { 
     self.saving = YES; 
     assert(self.finishLoadingTimer == nil); 
     self.view.userInteractionEnabled = NO; 
     [self restartTimer]; 
    } 
} 

- (void)mapLoadingIsFinished 
{ 
    self.finishLoadingTimer = nil; 
    [self doSnapshotSequence]; 
    self.saving = NO; 
    self.view.userInteractionEnabled = YES; 
} 

- (void)mapViewDidFinishLoadingMap:(MKMapView *)mapView 
{ 
    if (self.saving) { 
     [self restartTimer]; 
    } 
} 
+0

Đoạn mã trên sẽ gọi mapLoadingIsFinished: phương thức chỉ hai lần khi người dùng chạm vào lưu và trong mapViewDidFinishLoadingMap: phương thức, nếu lưu là CÓ .. Nhưng trong câu hỏi đó, anh ta đã nói "anh ta vẫn thấy một bản đồ chưa được tải với gridlines ngay cả sau khi mapViewDidFinishLoadingMap: phương pháp được gọi là ".. Tôi không nghĩ rằng điều này sẽ làm việc trong anyway –

+0

@RA Như tôi đã đề cập ở trên, mapLoadingIsFinished được gọi là nhiều lần và lần cuối cùng nó được gọi là nó là đáng tin cậy. Mã này tận dụng điều đó. Vui lòng thử mã và cho tôi biết nếu bạn thấy bất kỳ sự cố nào. – Skotch

0

Bạn có chắc chắn khu vực bạn chụp ảnh màn hình có mức thu phóng được hỗ trợ mà bạn đang áp dụng hay không. Ví dụ: ở mức hỗ trợ mức thu phóng của Hoa Kỳ cao hơn, bạn có thể phóng to chi tiết tối đa, trong khi ở Châu Á có thể là mức thu phóng cao có thể không được hỗ trợ.

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