Trên thực tế trên mặc định MKMapView- chú thích (ví dụ pin hoặc hình ảnh) và callout (ví dụ bong bóng) vẫn là kích thước tương tự như bạn phóng to hoặc thu. Họ không quy mô. Nhưng tôi nhận được point- của bạn liên quan đến bản đồ chúng xuất hiện để được phát triển như bản đồ thu nhỏ và co lại như bản đồ phóng to
Vì vậy, có hai giải pháp cho vấn đề của bạn và họ làm việc hơi khác nhau:.
- Triển khai
-(void)mapView:(MKMapView *)pMapView regionDidChangeAnimated:(BOOL)animated
từ Tham chiếu giao thức MKMapViewDelegate - mà bạn đã thực hiện.
- Đính kèm một
UIPinchGestureRecognizer
vào đối tượng MKMapView và sau đó triển khai tác vụ.
Tùy chọn # 1 - mapView:regionDidChangeAnimated:
sẽ được gọi là cuộn hoặc sự kiện thu phóng - về cơ bản bất cứ khi nào khu vực bản đồ thay đổi theo tên ngụ ý. Điều này dẫn đến việc thay đổi kích thước nhỏ hơn một chút các biểu tượng, bởi vì các sự kiện trên bản đồ được kích hoạt ít thường xuyên hơn.
Tùy chọn của tôi là cho Tùy chọn # 2 - Đính kèm một UIPinchGestureRecognizer
vào đối tượng MKMapView và sau đó triển khai tác vụ. Các sự kiện cử chỉ chụm được kích hoạt khá nhanh, do đó bạn có thể thay đổi kích thước của biểu tượng. Và họ chỉ bắn cho một sự kiện pinch được công nhận - vì vậy họ sẽ không cháy trong một sự kiện di chuyển.
Các phương pháp hành động gọi phải phù hợp với một trong những dấu hiệu sau đây:
- (void)handleGesture;
- (void)handleGesture:(UIGestureRecognizer *)gestureRecognizer;
Bạn phải cẩn thận để không ghi đè lên các hành vi zoom bản đồ mặc định. Xem bài đăng này: "UIMapView: UIPinchGestureRecognizer không được gọi là" để biết thêm thông tin. Câu trả lời ngắn gọn là bạn phải thực hiện shouldRecognizeSimultaneouslyWithGestureRecognizer:
và trả lại CÓ.
Tất cả đã nói đây là một số mẫu mã:
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad
{
[super viewDidLoad];
self.mapView.mapType = MKMapTypeStandard; // also MKMapTypeSatellite or MKMapTypeHybrid
// Add a pinch gesture recognizer
UIPinchGestureRecognizer *pinchRecognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handlePinchGesture:)];
pinchRecognizer.delegate = self;
[self.mapView addGestureRecognizer:pinchRecognizer];
[pinchRecognizer release];
}
#pragma mark -
#pragma mark UIPinchGestureRecognizer
- (void)handlePinchGesture:(UIPinchGestureRecognizer *)pinchRecognizer {
if (pinchRecognizer.state != UIGestureRecognizerStateChanged) {
return;
}
MKMapView *aMapView = (MKMapView *)pinchRecognizer.view;
for (id <MKAnnotation>annotation in aMapView.annotations) {
// if it's the user location, just return nil.
if ([annotation isKindOfClass:[MKUserLocation class]])
return;
// handle our custom annotations
//
if ([annotation isKindOfClass:[MKPointAnnotation class]])
{
// try to retrieve an existing pin view first
MKAnnotationView *pinView = [aMapView viewForAnnotation:annotation];
//Format the pin view
[self formatAnnotationView:pinView forMapView:aMapView];
}
}
}
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
return YES;
}
Vì vậy, tại này point- bạn lại có nhiều lựa chọn cho làm thế nào để thay đổi kích thước chú thích. Cả hai mẫu mã sau dựa trên Troy Brant's code for getting the zoom level of an MKMapView.
- Thay đổi kích thước Cả hình ảnh chú thích và chú dẫn sử dụng biến đổi. Cá nhân tôi nghĩ rằng các kết quả biến đổi trong một thay đổi kích thước tìm kiếm sạch hơn. Nhưng trong hầu hết các trường hợp, thay đổi kích thước chú thích không được gọi.
- Thay đổi kích thước hình ảnh chú thích - Tôi sử dụng Trevor Harmon's Resize a UIImage the right way nhưng một lần nữa ý kiến của tôi là nó không phải là sạch sẽ tìm kiếm một thay đổi kích cỡ.
Dưới đây là một số mẫu mã hơn:
- (void)formatAnnotationView:(MKAnnotationView *)pinView forMapView:(MKMapView *)aMapView {
if (pinView)
{
double zoomLevel = [aMapView zoomLevel];
double scale = -1 * sqrt((double)(1 - pow((zoomLevel/20.0), 2.0))) + 1.1; // This is a circular scale function where at zoom level 0 scale is 0.1 and at zoom level 20 scale is 1.1
// Option #1
pinView.transform = CGAffineTransformMakeScale(scale, scale);
// Option #2
UIImage *pinImage = [UIImage imageNamed:@"YOUR_IMAGE_NAME_HERE"];
pinView.image = [pinImage resizedImage:CGSizeMake(pinImage.size.width * scale, pinImage.size.height * scale) interpolationQuality:kCGInterpolationHigh];
}
}
Nếu công trình này, đừng quên để đánh dấu nó như là câu trả lời.
Hey. Tôi sẽ cố gắng này, cảm ơn cho một câu trả lời tuyệt vời. Và không phải lo lắng về việc chấp thuận :) – shannoga
điều này không hợp lệ trên iOS6 – user501836
Đúng vậy, không còn hoạt động trên iOS6 nữa. Bất cứ ai đã đưa ra một giải pháp cho điều đó? – Bach