MapBox добавить интерактивную аннотацию / вид в месте iOS
Я пытаюсь реализовать карты MapBox, особая причина для его использования, он очень настраиваемый, мне нужно создать другой вид карты со всеми разными цветами, я получил, что работает отлично.
проблема я хочу добавить аннотацию на карте, которая должна быть интерактивной изнутри, обычно аннотация является интерактивной, просто нажав на нее, она работает, мне нужно что-то вроде UIButton в аннотации и нажав на кнопку действие должно выполнять.
вопрос Как создать аннотацию с помощью кнопки / вида в MapBox, как мне подойти.
любая помощь приветствуется.
спасибо.
Edit:
чтобы быть более точным, я хочу что-то вроде изображения ниже для аннотации..
4 ответов
Я могу заставить это работать, наконец. Я создал подкласс класса RMMarker в проекте MapBox, и я добавляю все компоненты как CALayer, добавляя компоненты в UIView
затем добавить UIView.layer
не работает. Вы должны добавить подслои в слой UIView.
затем я создал пользовательские делегаты для обработки сенсорных событий.
убедитесь, что вы используете MapBox от здесь и добавьте MyMarker внутри проекта MapBox в качестве деталь.
я добавляю свой код здесь
MyMarker.h
#import "RMMarker.h"
@interface MyMarker : RMMarker
@end
MyMarker.м
@implementation MyMarker
-(id)init{
self=[super init];
if(self){
UIView *subLayer=[[UIView alloc] initWithFrame:CGRectMake(0, 0, 126, 91)];
UIView *smallView=[[UIView alloc] initWithFrame:CGRectMake(36.0, 0, 88, 91)];
//smallView.contents=(id)image;
[subLayer.layer addSublayer:smallView.layer];
subLayer.backgroundColor=[UIColor blueColor];
subLayer.layer.name=@"Annotation";
[self addSublayer:smallView.layer];
float y=11.0;
float x=12.0;
for(int i=0;i<4;i++){
CGPoint pt=CGPointMake(x, y);
UIView *handle=[self createHandle:@"Handle" fromPos:pt];
y=y+14.0;
handle.layer.name=[NSString stringWithFormat:@"Handle at %@",NSStringFromCGPoint(pt)];
[self addSublayer:handle.layer];
}
}
return self;
}
-(UIView *)createHandle:(NSString *)handle fromPos:(CGPoint)pos{
UIView *view=[[UIView alloc] initWithFrame:CGRectMake(pos.x, pos.y, 60.0, 5.0)];
view.backgroundColor=[UIColor brownColor];
return view;
}
@end
RMMapViewDelegate.h
- (void)tapOnMarker:(MyMarker *)marker at:(CGPoint )pt;
RMMapView.м
добавил BOOL _delegateHasMyMarkerDelegate;
настройка свойств метода делегата
- (void)setDelegate:(id <RMMapViewDelegate>)aDelegate{
_delegateHasMyMarkerDelegate=[_delegate respondsToSelector:@selector(tapOnMarker:at:)];
}
- (void)tapOnMarker:(MyMarker *)marker at:(CGPoint)aPoint
{
if (_delegateHasMyMarkerDelegate)
{
[_delegate tapOnMarker:marker at:aPoint];
}
}
- (void)handleSingleTap:(UIGestureRecognizer *)recognizer{
//Default initializers
CALayer *superlayer = [hit superlayer];
// See if tap was on an annotation layer or marker label and send delegate protocol method
//Added conditions for MyMarker touch events
if ([superlayer superlayer] != nil && [[superlayer superlayer] isKindOfClass:[MyMarker class]]){
[self tapOnMarker:((MyMarker *)[superlayer superlayer]) at:[recognizer locationInView:self]];
}else if ([[superlayer superlayer] superlayer] != nil && [[[superlayer superlayer] superlayer] isKindOfClass:[MyMarker class]]){
[self tapOnMarker:((MyMarker *)[[superlayer superlayer] superlayer]) at:[recognizer locationInView:self]];
}else if (superlayer != nil && [superlayer isKindOfClass:[MyMarker class]]){
[self tapOnMarker:((MyMarker *)superlayer) at:[recognizer locationInView:self]];
}
}
реализация
-(RMMapLayer *)mapView:(RMMapView *)mapView layerForAnnotation:(RMAnnotation *)annotation{
if(annotation.isUserLocationAnnotation)
return nil;
MyMarker *marker=[[MyMarker alloc] init];
[marker setFrame:CGRectMake(0, 0, 126, 91)];
return marker;
}
#pragma mark MyMarker Delegate
-(void)tapOnMarker:(MyMarker *)marker at:(CGPoint)pt{
for (CALayer *layer in marker.sublayers) {
CGPoint convertedPt=[[marker superlayer] convertPoint:pt toLayer:layer];
if([layer containsPoint:convertedPt]){
NSLog(@"%@ selected",layer.name);
}
}
}
надеюсь, это поможет кому - то, кто хотите создать маркер / аннотацию и хотите несколько действий над ней.
почему бы просто не использовать - (void) singleTapOnMap:(RMMapView *)map at:(CGPoint)point
делегат? Я не вижу, чтобы вы использовали какие-либо состояния кнопок, поэтому мне кажется, что самый простой способ:
func singleTapOnMap(map: RMMapView!, at point: CGPoint) {
let layer = someObject.layer
let frameOnScreen = layer.superlayer.convertRect(layer.frame, toLayer: map.layer)
if CGRectContainsPoint(frameOnScreen, point) {
NSLog("hit")
}
}
вы также можете использовать:
func mapView(mapView: RMMapView!, didSelectAnnotation annotation: RMAnnotation!)
делегировать метод и делать то, что вы хотели сделать в действии кнопки.
посмотрите на этот пример в документации MapBox:http://www.mapbox.com/mapbox-ios-sdk/examples/callout-accessory-view/ это работает очень похоже на MapKit.