này nói về một ứng dụng iPhone sử dụng MKMapKit:subclassing MKAnnotationView và trọng setDragState
Tôi tạo ra một MKAnnotationView tùy chỉnh cho một Chú kéo. Tôi muốn tạo một hoạt hình tùy chỉnh. Tôi thiết lập một hình ảnh pin tùy chỉnh và chú thích là có thể kéo (mà cả hai không được hiển thị ở đây, nó sẽ xảy ra trong MapView) với đoạn mã sau:
- (void) movePinUpFinished {
[super setDragState:MKAnnotationViewDragStateDragging];
[self setDragState:MKAnnotationViewDragStateDragging];
}
- (void) setDragState:(MKAnnotationViewDragState) myState {
if (myState == MKAnnotationViewDragStateStarting) {
NSLog(@"starting");
CGPoint endPoint = CGPointMake(self.center.x,self.center.y-20);
self.center = endPoint;
[self movePinUpFinished];
}
if (myState == MKAnnotationViewDragStateEnding) {
NSLog(@"ending");
[super setDragState:MKAnnotationViewDragStateEnding];
[self setDragState:MKAnnotationViewDragStateNone];
[super setDragState:MKAnnotationViewDragStateNone];
}
if (myState == MKAnnotationViewDragStateDragging) {
NSLog(@"dragging");
}
if (myState == MKAnnotationViewDragStateCanceling) {
NSLog(@"cancel");
}
if (myState == MKAnnotationViewDragStateNone) {
NSLog(@"none");
}
}
Tất cả mọi thứ hoạt động tốt, các chú thích được di chuyển lên một chút, là có thể kéo và khi tôi phát hành chú thích, mapview nhận được "dragstateending".
Nhưng bây giờ tôi muốn các hình ảnh động để chạy qua một khoảng thời gian và thay đổi dragStateStarting như sau:
if (myState == MKAnnotationViewDragStateStarting) {
NSLog(@"starting");
CGPoint endPoint = CGPointMake(self.center.x,self.center.y-20);
[UIView animateWithDuration:1.0
animations:^{ self.center = endPoint; }
completion:^(BOOL finished){ [self movePinUpFinished]; }];
}
Những hình ảnh động chạy như muốn trong giai đoạn của một giây và chú thích là có thể kéo được. Nhưng khi tôi phát hành chú thích, mapview không nhận được kết thúc thông qua đại biểu. Điều tôi cũng nhận ra là khi tôi thực hiện hoạt ảnh với "UIView animateWithDuration ..." là ngay sau khi bắt đầu kéo, khi hoạt ảnh bắt đầu, dấu chú giải của chú thích mở ra. Khi tôi thiết lập trung tâm mới mà không có hình động, quả bóng sẽ đóng lại và chỉ mở sau khi hoàn tất việc kéo bằng cách nhả chú thích.
Tôi đang làm gì sai? Đây có phải là cách đúng để ghi đè setDragState không. Tôi có thực sự phải gọi lớp học siêu đẳng không? Nhưng mà không thiết lập các dragstate trong superclass mapview của tôi didnt nhận ra những thay đổi của dragstate.
Tôi tự hỏi về triển khai ban đầu của MKPinAnnotationView, nhưng bởi vì nó là một lớp nội bộ tôi không thể tìm thấy một mô tả của phương pháp setDragState.
Thx để được trợ giúp. Chúc mừng,
Bến
Làm thế nào nó hoạt động hoàn hảo? Khi bạn kéo ghim bên ngoài màn hình, nó sẽ gây ra sự cố. – akshay1188
Điều này làm việc, nhưng có một điều ngăn cản tôi: Trong MKMapViewDelegate của tôi, tôi ghi đè mapView: annotationView: didChangeDragState. Lớp cơ sở MKAnnotationView tạo ra hai chuyển tiếp: Từ 0-> 1 khi kéo bắt đầu, và 1-> 4 khi nó kết thúc. Giải pháp này ở trên dường như tuân theo hướng dẫn của Apple đối với T, nhưng nó tạo ra một chuyển đổi 0-> 2 và 2> 0. Tôi có thể sống với nó nhưng thật kỳ lạ - tôi nghĩ tài liệu của Apple đã tắt, phải trung thực. – n13
Tôi nghĩ bạn cần gọi 'self.dragState = ...', không phải 'dragState ='. Nếu không, thông báo KVO sẽ không được gửi và chế độ xem bản đồ sẽ không thấy thay đổi trạng thái kéo. – Rick