我希望在地图放大和缩小时缩放MKAnnotationView,这样如果我的视图占用100米,它将继续在视觉上占据那么多。
这是我到目前为止所拥有的:
- (void)detectPinch:(UIPinchGestureRecognizer*)pinch{
NSArray* annotations = self.mapView.annotations;
for(id<MKAnnotation>annotation in annotations){
if(![annotation isKindOfClass:[MKUserLocation class]] && [annotation isMemberOfClass:[CustomAnnotation class]]){
CustomAnnotationView* annotationView = (CustomAnnotationView*)[self.mapView viewForAnnotation:annotation];
CGAffineTransform transform;
MKZoomScale currentZoomScale = self.mapView.bounds.size.width / self.mapView.visibleMapRect.size.width;
self.previousMapScale = (self.previousMapScale == 0 ? currentZoomScale : self.previousMapScale);
if(self.previousMapScale == currentZoomScale) return;
else transform = CGAffineTransformMakeScale(pinch.scale*((currentZoomScale-self.previousMapScale)+1), pinch.scale*((currentZoomScale-self.previousMapScale)+1));
annotationView.transform = transform;
self.previousMapScale = (pinch.state == UIGestureRecognizerStateEnded ? 0 : currentZoomScale);
}
}
}
除了第一个之后的每次捏合之外,这几乎都有效,注释视图不会保持它的先前状态并且奇怪地缩放。在第一次调用捏手势识别器处理程序之后,它会针对手势的其余部分正确缩放。这只是捏的初始部分。
有人知道我的数学出错了吗?
答案 0 :(得分:2)
我弄清楚我做错了什么,它不在数学中,这是因为我在做transform = CGAffineTransformMakeScale(scale, scale);
而不是使用CGAffineTransformScale
传递现有的转换。我不能理解数学,我发现它在SO帖子上,如果我找到帖子,我会在底部添加学分。
以下代码是使用地图视图缩放注释的完整代码。
- (void)detectPinch:(UIPinchGestureRecognizer*)pinch{
NSArray* annotations = self.mapView.annotations;
for(id<MKAnnotation>annotation in annotations){
if(![annotation isKindOfClass:[MKUserLocation class]] && [annotation isMemberOfClass:[CustomAnnotation class]]){
CustomAnnotationView* annotationView = (CustomAnnotationView*)[self.mapView viewForAnnotation:annotation];
CGAffineTransform transform;
CGFloat currentScale = self.view.width/self.view.bounds.size.width;
CGFloat newScale = pinch.scale*currentScale;
transform = CGAffineTransformScale(annotationView.transform, newScale, newScale);
annotationView.transform = transform;
pinch.scale = 1;
}
}
}
编辑:
我想出了一种更好的缩放注释视图的方法。 而不是在捏手势上使用缩放属性,有时会导致视图缩放错误,如果捏是尖锐和快速,只需这样做:
CLLocationDistance currentMapWidth = [self.mapView mapWidthInMeters];
CGFloat scale = self.previousMapWidth/currentMapWidth;
//apply the transformation with that scale
self.previousMapWidth = currentMapWidth;
mapWidthInMeters
是MKMapView上的一个类别。
- (CLLocationDistance)mapWidthInMeters{
CLLocationDegrees deltaLongitude = self.region.span.longitudeDelta;
CGFloat latitudeCircumference = 40075160 * cos(self.region.center.latitude * M_PI / 180);
return deltaLongitude * latitudeCircumference/360;
}
答案 1 :(得分:0)
这就是MKOverlays的用途。它们是自然缩放的