我想實現MapBox地圖,使用它的特殊原因,它是高度可定製的,我需要創建一種不同種類的地圖,使用所有不同的顏色,我得到了完美的工作精細。MapBox在位置添加交互式註釋/視圖iOS
問題我想在地圖上添加註釋,應該從內部交互,通常註釋是交互式的,只需點擊它,它的工作原理,我需要類似註釋中的UIButton和點擊按鈕操作應執行。
問題 如何使用MapBox中的按鈕/視圖創建註釋,我應該如何處理。
任何幫助表示讚賞。
謝謝。
編輯:
更精確我想類似下面用於註釋圖像..
我想實現MapBox地圖,使用它的特殊原因,它是高度可定製的,我需要創建一種不同種類的地圖,使用所有不同的顏色,我得到了完美的工作精細。MapBox在位置添加交互式註釋/視圖iOS
問題我想在地圖上添加註釋,應該從內部交互,通常註釋是交互式的,只需點擊它,它的工作原理,我需要類似註釋中的UIButton和點擊按鈕操作應執行。
問題 如何使用MapBox中的按鈕/視圖創建註釋,我應該如何處理。
任何幫助表示讚賞。
謝謝。
編輯:
更精確我想類似下面用於註釋圖像..
我終於可以得到這個工作。我在MapBox項目中創建了一個Subclassed RMMarker類,我將所有組件添加爲CALayer,在UIView
中添加組件,然後添加UIView.layer
不起作用。您必須在UIView圖層中添加子圖層。
然後我創建了自定義代理來處理觸摸事件。
請確保您使用here的MapBox,並將MapBox項目中的MyMarker作爲組件添加。
我在這裏添加我的代碼
MyMarker.h
#import "RMMarker.h"
@interface MyMarker : RMMarker
@end
MyMarker.m
@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];
[email protected]"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);
}
}
}
希望它可以幫助別人,誰想要創建標記/註釋,並希望多個動作超過它。
看一看這個例子中,MapBox文檔中:http://www.mapbox.com/mapbox-ios-sdk/examples/callout-accessory-view/這個工程非常相似MapKit 。
感謝@incanus,但上面的鏈接並沒有解決我的目的。 – iphonic
爲什麼不簡單使用- (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")
}
}
它雖然很古老,但你沒有正確閱讀要求我猜,使用上述功能將允許選擇整個註釋,我的要求是設計一個單一的註釋與多個動作,我會很高興你添加更正確的答案。可能'MapBox'隨着時間的推移有所改善,我沒有長期跟隨它。我爲MapBox貢獻了我的解決方案,他們也接受了它。 – iphonic
您還可以使用:
func mapView(mapView: RMMapView!, didSelectAnnotation annotation: RMAnnotation!)
委託方法,做你想做的東西在按鈕點擊動作。
否,在didSelectAnnotation上,出現按鈕。這些按鈕將添加到註釋中。 – iphonic
對不起,我誤解了你的問題。但是,不是在註釋中添加按鈕,你可以將它們添加到超級視圖並根據註釋位置進行佈局嗎?我假設這些按鈕將顯示每個註釋。這樣你就可以避免圖層和東西,*((MyMarker)[[superlayer superlayer] superlayer] *不好),只需在視圖控制器中實現按鈕操作。你可以通過以下方式獲得註釋點:* self.mapView.coordinateToPixel(annotation.coordinate)* – berilcetin
不,這也不可能,因爲MapBox使用CALayer來實現它,而不是UIView,否則它會像你說的那樣完成。 – iphonic
我可以用awesomeMenu實現一個類似的方法,但我會嘗試這一點。謝謝。 – Felix