2010-06-10 16 views
10

Tôi có một số MKMapView với đại biểu đã đăng ký để tôi có thể nghe các sự kiện thay đổi khu vực (cụ thể là regionDidChangeAnimated). Tôi đang tìm một cách mạnh mẽ để nói nếu sự kiện thay đổi khu vực là kết quả của việc người dùng kéo bản đồ hoặc từ yêu cầu setRegion: có lập trình.Làm thế nào tôi có thể biết khi nào sự kiện regionChange trên MKMapView là chương trình hoặc kéo người dùng của MKMapView?

Mục tiêu của tôi là có ứng dụng tự động căn giữa bản đồ dựa trên theo dõi vị trí, trừ khi người dùng đã quét bản đồ bằng tay, tại thời điểm tự động định tâm sẽ tắt. Vì vậy, tôi đang gọi setRegion: để recenter xem bản đồ là thích hợp, nhưng tôi có một thời gian khó nói nếu kết quả cuộc gọi regionDidChangeAnimated: cho các đại biểu là lập trình hoặc từ một người sử dụng chảo. Tôi đã thử hack một cái gì đó với nhau, nhưng tôi tiếp tục chạy vào điều kiện chủng tộc khi người dùng bắt đầu panning cũng giống như một bản cập nhật vị trí đến.

Trả lời

5

Tôi đã khắc phục vấn đề này với một boolean theo dõi các thay đổi vùng/trung tâm mã kích hoạt. Không phải là giải pháp thanh lịch nhất, nhưng nó hoạt động như một sự quyến rũ. Đó là một UIMapView đáng xấu hổ không xuất phát từ UIScrollView.

init:

regionChangeFromCode = FALSE; 

nút hành động:

-(IBAction) butCenterPressed:(id)sender 
{ 
    butCenter.selected = !butCenter.selected;  
    if(butCenter.selected) 
     [self setCenter]; 
} 

trung tâm thiết lập:

-(void) setCenter 
{ 
    regionChangeFromCode = TRUE; //before setCenterCoordinate, otherwise this is FALSE in regionWillChangeAnimated 
    [theMap setCenterCoordinate:[self calcCenter]]; //this could also be [theMap setRegion]. Works the same 
} 

và các đại biểu đồ:

- (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated 
{ 
    if(!regionChangeFromCode) //so a user did it 
    { 
     if(butCenter.selected) 
      butCenter.selected = FALSE; 
    } 
    regionChangeFromCode = FALSE; 
} 

Ngoài ra, tôi có một vòng lặp cập nhật cập nhật vị trí và gọi setCenter. Khi nút được chọn, trung tâm bản đồ sẽ theo sau và nếu không trung tâm sẽ bị bỏ lại một mình.

+0

Đã xảy ra sự cố này. Mã của bạn là một giải pháp tốt đẹp. Đó là một chút hacky, nhưng không phải là xấu vì nó vẫn đọc như tiếng Anh tốt. Nó chỉ là một cờ boolean :) – chakrit

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