我已将ios的Google地图sdk添加到我的Iphone应用程序中,如果点击的信息窗口弹出标题,我有一些自定义标记,如何在此信息窗口中添加按钮,如果按下将转到新页面?现在我已经尝试使用这篇文章来解决这个问题Adding Click Event on InfoWindow/Marker in Google Maps SDK for native iOS/objective C它不会给我错误,但它不起作用。
这就是我想要的结果:http://www.flickr.com/photos/74719051@N05/6728157477/
答案 0 :(得分:8)
您链接的问题的答案显示了使用MapKit的代码,因此无法使用适用于iOS的Google Maps SDK。
有关如何使用Google Maps SDK for iOS返回自定义视图的信息,请参阅此问题:
Custom annotation view in Google Maps SDK
但是请注意,根据这个问题,看起来显示的内容可能是视图的可视副本而不是实际视图,这可能会限制您可以对视图进行的交互:
Add buttons to view returned by markerInfoWindow delegate method
虽然可以使用didTapWindowOfMarker
来检测信息窗口上的点按并转到其他页面。
请注意,Google问题跟踪器中有一项功能请求,可以为此添加直接支持:
https://code.google.com/p/gmaps-api-issues/issues/detail?id=4961
答案 1 :(得分:5)
此代码完全符合您的要求。它的灵感来自Saxon Druce推荐的link中的#9,但做得不同,更完整。它会检测添加到我的自定义infoWindow的按钮。我创建了一个带有2个假按钮的自定义infoWindow(它们实际上可以被图像替换,因为它们不会触发任何动作)并且我在infoWindow上添加了一个带有2个真实但透明按钮的透明UIView。这些按钮将触发操作。
最后,我使用一些委托方法或KVC,以便在infoWindow本身移动时移动重叠的UIView。
- (UIView *)mapView:(GMSMapView *)mapView markerInfoWindow:(GMSMarker *)marker {
[self.actionOverlayCalloutView removeFromSuperview];
UIView *calloutView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, infoWindowWidth, infoWindowHeight)];
float offset = anchorSize * M_SQRT2;
CGAffineTransform rotateBy45Degrees = CGAffineTransformMakeRotation(M_PI_4);
UIView *arrow = [[UIView alloc] initWithFrame:CGRectMake((infoWindowWidth - anchorSize)/2.0, infoWindowHeight - offset, anchorSize, anchorSize)];
arrow.transform = rotateBy45Degrees;
arrow.backgroundColor = [UIColor lightGrayColor];
[calloutView addSubview:arrow];
UIView *contentView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, infoWindowWidth, infoWindowHeight - offset/2)];
[contentView setBackgroundColor:[UIColor whiteColor]];
contentView.layer.cornerRadius = 5;
contentView.layer.masksToBounds = YES;
contentView.layer.borderColor = [UIColor lightGrayColor].CGColor;
contentView.layer.borderWidth = 1.0f;
self.actionOverlayCalloutView =
[NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:contentView]]; //hack to copy a view...
self.actionOverlayCalloutView.backgroundColor = [UIColor lightGrayColorWithAlpha:0.5];
self.actionOverlayCalloutView.layer.cornerRadius = 5;
NSMutableArray *falseButtons = [NSMutableArray array];
NSMutableArray *actionButtons = [NSMutableArray array];
PointMapItem *pointAnnotation = marker.userData;
if ([pointAnnotation canPerformSend]) {
UIButton *button = [[UIButton alloc] init];
[button setImage:[UIImage imageNamed:@"imageButton1.png"] forState:UIControlStateNormal];
[falseButtons addObject:button];
UIButton *activableButton = [[UIButton alloc] init];
[activableButton addTarget:self action:@selector(onButton1Clicked) forControlEvents:UIControlEventTouchUpInside];
[actionButtons addObject:activableButton];
}
if ([pointAnnotation canPerformShowDetails]) {
UIButton *button = [[UIButton alloc] init];
[button setImage:[UIImage imageNamed:@"imageButton1.png"] forState:UIControlStateNormal];
[falseButtons addObject:button];
UIButton *activableButton = [[UIButton alloc] init];
[activableButton addTarget:self action:@selector(onButton2Clicked) forControlEvents:UIControlEventTouchUpInside];
[actionButtons addObject:activableButton];
}
int buttonWidth = contentView.frame.size.width / [falseButtons count];
int currentOffset = 0;
for (int i=0; i<falseButtons.count; i++) {
UIButton *falseButton = [falseButtons objectAtIndex:i];
UIButton *activableButton = [actionButtons objectAtIndex:i];
[falseButton setFrame:CGRectMake(currentOffset, 0, buttonWidth, contentView.frame.size.height)];
currentOffset += buttonWidth;
activableButton.frame = falseButton.frame;
[activableButton setTitle:@"" forState:UIControlStateNormal];
[self.actionOverlayCalloutView addSubview:activableButton];
[contentView addSubview:falseButton];
}
[calloutView addSubview:contentView];
CLLocationCoordinate2D anchor = [self.mapView.selectedMarker position];
CGPoint point = [self.mapView.projection pointForCoordinate:anchor];
point.y -= self.mapView.selectedMarker.icon.size.height + offset/2 + (infoWindowHeight - offset/2)/2;
self.actionOverlayCalloutView.center = point;
[self.mapView addSubview:self.actionOverlayCalloutView];
return calloutView;
}
- (void)mapView:(GMSMapView *)pMapView didChangeCameraPosition:(GMSCameraPosition *)position {
if (pMapView.selectedMarker != nil && self.actionOverlayCalloutView.superview) {
CLLocationCoordinate2D anchor = [self.mapView.selectedMarker position];
CGPoint point = [self.mapView.projection pointForCoordinate:anchor];
float offset = anchorSize * M_SQRT2;
point.y -= self.mapView.selectedMarker.icon.size.height + offset/2 + (infoWindowHeight - offset/2)/2;
self.actionOverlayCalloutView.center = point;
} else {
[self.actionOverlayCalloutView removeFromSuperview];
}
}
- (void)mapView:(GMSMapView *)mapView didTapAtCoordinate:(CLLocationCoordinate2D)coordinate {
[self.actionOverlayCalloutView removeFromSuperview];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if ([keyPath isEqualToString:@"mapView.selectedMarker"]) {
if (!self.mapView.selectedMarker) {
[self.actionOverlayCalloutView removeFromSuperview];
}
}
}
- (void)onButton2Clicked {
//your code
self.mapView.selectedMarker = nil;
}
- (void)onButton1Clicked {
// your code;
self.mapView.selectedMarker = nil;
}
答案 2 :(得分:1)
答案 3 :(得分:0)
1)创建一个要在infoWindow中显示的子视图。 2)设置子视图的帧等于infoWindow视图的帧。
ASIFormDataRequest *videoUploadRequest = [ASIFormDataRequest requestWithURL:url];
//[videoUploadRequest setPostFormat:ASIMultipartFormDataPostFormat];
NSLog(@"%@",objProductInfo1.videoData);
[videoUploadRequest setData:objProductInfo1.videoData withFileName:@"sample.mp4" andContentType:@"video/quicktime" forKey:@"video_file"];
videoUploadRequest.requestMethod = @"POST";
//[videoUploadRequest setData:videoData forKey:@"video_file"];
// [videoUploadRequest addRequestHeader:@"content-type" value:@"multipart/form-data"];
[videoUploadRequest setTimeOutSeconds:60000000]; // try using time out for your post...
videoUploadRequest.allowCompressedResponse = NO;
videoUploadRequest.useCookiePersistence = NO;
videoUploadRequest.shouldCompressRequestBody = NO;
[videoUploadRequest setDelegate:self];
[videoUploadRequest setDidFinishSelector:@selector(VideoStartUpload:)];
[videoUploadRequest startAsynchronous];