- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
在我的应用程序中,用户在 map 上绘制了一个形状并使用 UIBeizerPath 我正在绘制该路径。然后根据路径的坐标,我显示仅在该区域的结果。一切都很好,除了现在当注释落在 map View 上时,图钉看起来像是在路径后面,这意味着路径看起来在前面。
我正在使用这段代码来显示注释和路径:
-(void)clearAnnotationAndPath:(id)sender {
[_mapView removeAnnotations:_mapView.annotations];
path = [UIBezierPath bezierPath];
[shapeLayer removeFromSuperlayer];
}
- (void)handleGesture:(UIPanGestureRecognizer *)gesture
{
CGPoint location = [gesture locationInView:_pathOverlay];
if (gesture.state == UIGestureRecognizerStateBegan)
{
shapeLayer = [[CAShapeLayer alloc] init];
shapeLayer.fillColor = [[UIColor clearColor] CGColor];
shapeLayer.strokeColor = [[UIColor greenColor] CGColor];
shapeLayer.lineWidth = 5.0;
//[_mapView.layer addSublayer:shapeLayer];
[pathOverlay.layer addSublayer:shapeLayer];
path = [UIBezierPath bezierPath];
[path moveToPoint:location];
}
else if (gesture.state == UIGestureRecognizerStateChanged)
{
[path addLineToPoint:location];
shapeLayer.path = [path CGPath];
}
else if (gesture.state == UIGestureRecognizerStateEnded)
{
// MKMapView *mapView = (MKMapView *)gesture.view;
[path addLineToPoint:location];
[path closePath];
allStations = [RoadmapData sharedInstance].data;
for (int i=0; i<[allStations count]; i++) {
NSDictionary * itemNo = [allStations objectAtIndex:i];
NSString * fullAddress = [NSString stringWithFormat:@"%@,%@,%@,%@",[itemNo objectForKey:@"address"],[itemNo objectForKey:@"city"],[itemNo objectForKey:@"state"],[itemNo objectForKey:@"zip"]];
CLGeocoder * geoCoder = [[CLGeocoder alloc]init];
[geoCoder geocodeAddressString:fullAddress completionHandler:^(NSArray *placemarks, NSError *error) {
if (error) {
NSLog(@"Geocode failed with error: %@", error);
return;
}
if(placemarks && placemarks.count > 0)
{
CLPlacemark *placemark = placemarks[0];
CLLocation *location = placemark.location;
CLLocationCoordinate2D coords = location.coordinate;
CGPoint loc = [_mapView convertCoordinate:coords toPointToView:_pathOverlay];
if ([path containsPoint:loc])
{
NSString * name = [itemNo objectForKey:@"name"];
stationAnn = [[LocationAnnotation alloc]initWithCoordinate:coords Title:name subTitle:@"Wells Fargo Offer" annIndex:i];
stationAnn.tag = i;
[_mapView addAnnotation:stationAnn];
}
else{
NSLog(@"Out of boundary");
}
}
}];
[self turnOffGesture:gesture];
}
}
}
- (void)mapView:(MKMapView *)aMapView didAddAnnotationViews:(NSArray *)views{
if (views.count > 0) {
UIView* firstAnnotation = [views objectAtIndex:0];
UIView* parentView = [firstAnnotation superview];
if (_pathOverlay == nil){
// create a transparent view to add bezier paths to
pathOverlay = [[UIView alloc] initWithFrame: parentView.frame];
pathOverlay.opaque = NO;
pathOverlay.backgroundColor = [UIColor clearColor];
[parentView addSubview:pathOverlay];
}
// make sure annotations stay above pathOverlay
for (UIView* view in views) {
[parentView bringSubviewToFront:view];
}
}
}
此外,一旦我从这里返回并查看并再次出现,它甚至没有绘制路径。
请帮忙。
谢谢,
最佳答案
显然,当您通过以下方式将贝塞尔路径添加到 map 时:
[_mapView.layer addSublayer:shapeLayer];
它被添加到之上一些MKMapView
用来绘制注释的内部层。如果you take a look at this somewhat related question ,您会看到您可以实现 MKMapViewDelegate
协议(protocol),并在添加新站点注释时获得回调。发生这种情况时,您基本上会检查新添加的注释的 View 层次结构,并在它们下方 插入一个新的透明 UIView
层。您注意将所有注释都放在这个透明的 UIView
前面。
// always remember to assign the delegate to get callbacks!
_mapView.delegate = self;
...
#pragma mark - MKMapViewDelegate
- (void)mapView:(MKMapView *)aMapView didAddAnnotationViews:(NSArray *)views{
if (views.count > 0) {
UIView* firstAnnotation = [views objectAtIndex:0];
UIView* parentView = [firstAnnotation superview];
// NOTE: could perform this initialization in viewDidLoad, too
if (self.pathOverlay == nil){
// create a transparent view to add bezier paths to
pathOverlay = [[UIView alloc] initWithFrame: parentView.frame];
pathOverlay.opaque = NO;
pathOverlay.backgroundColor = [UIColor clearColor];
[parentView addSubview:pathOverlay];
}
// make sure annotations stay above pathOverlay
for (UIView* view in views) {
[parentView bringSubviewToFront:view];
}
}
}
然后,不是将形状层添加到 _mapView.layer
,而是将其添加到透明 View 层,同时在坐标转换中使用这个新层:
- (void)handleGesture:(UIPanGestureRecognizer*)gesture
{
CGPoint location = [gesture locationInView: self.pathOverlay];
if (gesture.state == UIGestureRecognizerStateBegan)
{
if (!shapeLayer)
{
shapeLayer = [[CAShapeLayer alloc] init];
shapeLayer.fillColor = [[UIColor clearColor] CGColor];
shapeLayer.strokeColor = [[UIColor greenColor] CGColor];
shapeLayer.lineWidth = 5.0;
[pathOverlay.layer addSublayer:shapeLayer]; // <- change here !!!
}
self.path = [[UIBezierPath alloc] init];
[path moveToPoint:location];
}
else if (gesture.state == UIGestureRecognizerStateChanged)
{
[path addLineToPoint:location];
shapeLayer.path = [path CGPath];
}
else if (gesture.state == UIGestureRecognizerStateEnded)
{
/*
* This code is the same as what you already have ...
*/
// But replace this next line with the following line ...
//CGPoint loc = [_mapView convertCoordinate:coords toPointToView:self];
CGPoint loc = [_mapView convertCoordinate:coords toPointToView: self.pathOverlay];
/*
* And again use the rest of your original code
*/
}
}
我还为新的透明层添加了 ivar(和属性):
UIView* pathOverlay;
我用伪造的站点网格对此进行了测试,得到了以下结果:
附言我还建议摆脱您的 static
变量。只需将它们设为您类(class)的 ivars/属性即可。
关于ios - 如何将 UIBezierPath 带到 MKAnnotation 对象的后面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14714374/
我在 MKAnnotation 上有一个标注。标注上的附件应该在点击时更改 MKAnnotationView 的图像。有没有办法改变这个,而无需重新创建 MKAnnotation?我问的原因是我想更改
我正在使用 MKMapview 在我的原生 iPhone 应用程序中显示 map ,并向 map View 添加两个标记。单击注释标记时,我希望显示一个电话号码,然后单击电话号码应该调用该号码。 我怎
我正在开发一个 tvOS 应用程序,我希望能够在注释之间滑动。我将注释存储在字典中,并将字典存储在数组中以备将来使用。我只是为加拿大、美国和墨西哥绘制了三个注释。我希望能够在这些注释之间滑动 Remo
为了在 Swift 中向 mapview 添加注释,我有这段有效的代码,例如: 让 myLocation = CLLocationCoordinate2D(55.55, -77.77) let ann
我可以创建一个 MKAnnotation,还是只读的?我有坐标,但我发现使用 setCooperative 手动创建 MKAnnotation 并不容易。 想法? 最佳答案 MKAnnotation
我有一个 MKMapView 查询服务器并在中心更改时显示一组 MKAnnotations 但我遇到重复 MKAnnotations 的问题,因为我阅读并添加了它们。 我正在考虑用 for 查看每个注
我有一个对象列表,每个对象都有标题、名称、描述、纬度、经度和地址。 是否可以将此对象显示为 MKAnnotations?我已经坚持了几个小时了。当我尝试使对象具有 CLLocationCoordina
class Point: NSObject, MKAnnotation { var id: String? var title: String? var coordinate: CLLocationC
在我的应用程序出现问题后,我为 MKMapView 编写了一个测试应用程序。我的问题是我无法在 map 上放置多个图钉。在 viewDidLoad: 方法中使用此代码,应在指定坐标的对角线上显示 10
到目前为止,我已经在一些应用程序中看到了这一点,当用户缩小时,注释会彼此靠得更近,如果它们靠得太近,则会被替换为例如“+5”别针或其他东西。 该怎么做?我认为应该在 regionDidChangeAn
MKAnnotation 有问题。有一个自定义的 pinview 并且在第一次加载时工作正常。去删除引脚,然后重新加载相同的引脚,它们会改变颜色。我从两个不同的数据库中添加引脚并且工作正常。移除并分别
我知道之前有一个关于这个的问题。但是,我觉得有点菜鸟,因为我无法解决它。 尝试此操作时出现错误: MKAnnotation *annotation = [[MKAnnotation alloc] in
我正在尝试将 MKAnnotations 保存到我正在学习的类(class)中的项目的核心数据中。 我查看了 github 上其他学生的代码,他们都采用相同的方法创建自定义 NSManagedObje
我在 map 上显示了几个图钉,就像这样: for (int i = 0; i )annotation { static NSString *identifier = @"CarPin"; if ([
我在我的 map 中使用自定义图标作为注释。大约有 200 个引脚。 在模拟器中,我的 map 看起来像这张图片。 但是,在我的设备中,有一些红点注释靠近我的用户位置。就像下图所示。 我猜这是速度引起
我已经阅读了很多关于 MKAnnotation 的内容以及您需要如何在您的子类中实现 setCoordinate 以及 draggable=TRUE 的顺序使整个 shebang 可拖动。 我的情况是
在我的应用程序中,我正在显示一个 TableView ,其中包含从数据库中搜索用户的结果。现在在该 TableView 中有一个按钮,通过单击该用户可以在 map 中查看所有搜索到的用户的位置。当用户
亲切的问候, 我正在使用下面的代码在 iOS 上显示注释 mkmapview在 map 上点击时。 MKPointAnnotation *aAnnotationPoint = [[MKPointAnn
我有一个 MKMapView,它有一个图钉,按下时会显示注释的标题和副标题。 代码中是否有一种方法可以自动显示此文本,以便用户无需单击它? 如果我有很多图钉,它们是否也能同时出现? 最佳答案 您需要使
我有一个 map View Controller (UIViewController、MKMapView)及其委托(delegate)(HCIResultMapViewController)。 我希望
我是一名优秀的程序员,十分优秀!