sha*_*oga 7 mkmapview mkannotationview ios
是)我有的
我在地图上有大约150个MKAnnotationViews.每个MKAnnotationView都有一个替换默认引脚的图像.
现在发生了什么
当地图放大时,MKAnnotationViews变小,而缩小时则相反.
我希望发生什么
好吧,我希望它是另一种方式.由于地图很小,我希望MKAnnotationViews更小,以便用户可以看到所有这些,当他放大时我希望它们会更大.
到目前为止我有什么代码
我知道如何获得变焦,我知道我可以将"pMapView.region.span.latitudeDelta"作为缩放量的参考.我知道我可以更改annotationView.frame.
-(void)mapView:(MKMapView *)pMapView regionDidChangeAnimated:(BOOL)animated{
NSLog(@"mapView.region.span.latitudeDelta = %f",pMapView.region.span.latitudeDelta);
for (id <MKAnnotation> annotation in pMapView.annotations) {
MKAnnotationView *annotationView = [pMapView viewForAnnotation: annotation];
}
}
Run Code Online (Sandbox Code Playgroud)
请有人帮帮我吗? 谢谢shani
Fun*_*nal 25
实际上在默认的MKMapView上 - 注释(例如图钉或图像)和标注(例如气泡)保持与放大或缩小相同的尺寸.他们没有规模.但是当地图放大时,随着地图缩小和缩小,我得到了与地图相关的点 - 它们看起来正在增长.
因此,您的问题有两种解决方案,它们的工作方式略有不同:
-(void)mapView:(MKMapView *)pMapView regionDidChangeAnimated:(BOOL)animated你已经完成了-从MKMapViewDelegate协议参考.UIPinchGestureRecognizer到MKMapView对象,然后执行该操作.选项#1 - mapView:regionDidChangeAnimated:将被调用滚动或缩放事件 - 基本上任何时候地图区域改变顾名思义.这会导致图标的调整大小稍微平滑,因为地图事件的触发频率较低.
我的首选项是选项#2 - 将一个附加UIPinchGestureRecognizer到MKMapView对象,然后实现该操作.捏手势事件会相当快速地触发,因此您可以顺利调整图标大小.而且他们只为一个公认的捏事件开火 - 所以他们不会在滚动事件期间开火.
调用的操作方法必须符合以下签名之一:
- (void)handleGesture;
- (void)handleGesture:(UIGestureRecognizer *)gestureRecognizer;
您必须小心不要覆盖地图默认缩放行为.看到这篇文章:"UIMapView:UIPinchGestureRecognizer未被调用"了解更多信息.简短的回答是你必须实现shouldRecognizeSimultaneouslyWithGestureRecognizer:并返回YES.
这里讲的是一些示例代码:
// 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;
}
Run Code Online (Sandbox Code Playgroud)
所以在这一点上 - 你再次有几个选项可以调整注释的大小.以下两个代码示例都依赖于Troy Brant的代码来获取MKMapView的缩放级别.
这是一些示例代码:
- (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];
}
}
Run Code Online (Sandbox Code Playgroud)
如果这样做,请不要忘记将其标记为答案.
| 归档时间: |
|
| 查看次数: |
14269 次 |
| 最近记录: |