这里是我的代码。 我想添加自己的自定义详图索引视图,而不是iOS的默认。 我知道,只有左标注和右边标注的观点,但我需要添加视图工具提示类型与我自己的背景和标签。
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{
MKAnnotationView *userAnnotationView = nil;
if ([annotation isKindOfClass:MKUserLocation.class])
{
userAnnotationView = (MKAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:@"UserLocation"];
if (userAnnotationView == nil) {
userAnnotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"UserLocation"];
}
else
userAnnotationView.annotation = annotation;
userAnnotationView.enabled = YES;
userAnnotationView.canShowCallout = YES;
userAnnotationView.image = [UIImage imageNamed:@"map_pin.png"];
UIView *view = [[UIView alloc]initWithFrame:CGRectMake(0,0,141,108)];
view.backgroundColor = [UIColor clearColor];
UIImageView *imgView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"toltip.png"]];
[view addSubview:imgView];
userAnnotationView.leftCalloutAccessoryView = view;
return userAnnotationView;
}
}
我有同样的问题,并最终做以下的事情:
当我收到的MapView委托回调
-(void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view
(它的时候,我想告诉我的自定义CalloutView)
我使用的参数*(MKAnnotationView)查看接受的观点(这是一个引脚图),并简单地用添加自定义查看到该引脚图
[view addSubview:customView];
它将对销视图上添加自定义视图,所以如果我们希望它是上述销我们要改变自定义视图中心财产是这样的:
CGRect customViewRect = customView.frame;
CGRect rect = CGRectMake(-customViewRect.size.width/2, -customViewRect.size.height-7, customViewRect.size.width, customViewRect.size.height);
customView.frame = rect;
[view addSubview:customView];
在我的情况下,它看起来像这样
!注意 :
有一点需要注意哪些但可以很容易固定, 自定义视图将忽略触摸事件 ,因为MapView的与触摸的工作方式不同。 这里有一个快速的解决办法 :
1)子类MKAnnotationView(或MKPinAnnotationView取决于你的需要)
2)在你的MapView委托
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
用你的子类,而不是MKAnnotationView / MKPinAnnotationView
3)在你的子类.m文件覆盖两个方法如下:
- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent*)event
{
UIView* hitView = [super hitTest:point withEvent:event];
if (hitView != nil)
{
[self.superview bringSubviewToFront:self];
}
return hitView;
}
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent*)event
{
CGRect rect = self.bounds;
BOOL isInside = CGRectContainsPoint(rect, point);
if(!isInside)
{
for (UIView *view in self.subviews)
{
isInside = CGRectContainsPoint(view.frame, point);
if(isInside)
break;
}
}
return isInside;
}
全部完成!
我创建了一个库显示自定义标注。
DXCustomCallout-ObjC
我们可以传递标注任何自定义视图! 它支持UIControls事件也是如此。
上文斯威夫特最佳答案
这样可以节省几分钟重写本身。
!注意:
有一点需要注意哪些但可以很容易固定,自定义视图将忽略触摸事件,因为MapView的与触摸的工作方式不同。 这里有一个快速的解决办法:
1)子类MKAnnotationView(或MKPinAnnotationView取决于你的需要)
2)在你的MapView委托
func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView?
用你的子类,而不是MKAnnotationView / MKPinAnnotationView
3)在你的子类.m文件覆盖两个方法如下:
override func hitTest(point: CGPoint, withEvent event: UIEvent?) -> UIView? {
let hitView = super.hitTest(point, withEvent: event)
if (hitView != nil)
{
self.superview?.bringSubviewToFront(self)
}
return hitView;
}
override func pointInside(point: CGPoint, withEvent event: UIEvent?) -> Bool {
let rect = self.bounds
var isInside = CGRectContainsPoint(rect, point)
if(!isInside) {
for view in self.subviews {
isInside = CGRectContainsPoint(view.frame, point)
break;
}
}
return isInside
}
下面是标注查看最好的例子
http://www.cocoacontrols.com/platforms/ios/controls/gikanimatedcallout
http://www.cocoacontrols.com/platforms/ios/controls/multirowcalloutannotationview
我刚刚创建一个自定义标注为窃听时避免与标注消失问题,我的地图视图。 这是我所执行的操作要点。
你可以使用这个库。 它还提供了一个现成使用的模板标注视图。 添加清凉的动画,并为您的自定义视图的锚视图。
https://github.com/okhanokbay/MapViewPlus