MapView Pin 注释的问题 - 当地图缩放/平移/区域更改时 Pin 会失去颜色

2023-12-14

我有一个显示现金点位置的地图视图。注释将被删除,并且可以单击标注以转到包含有关该位置的更多详细信息的页面。提款机分为免费和付费两类,免费提款机的针脚为绿色,另一种为红色。当别针掉落时,它们的颜色是正确的。一切正常,直到我缩放到用户位置或地图的其他区域,然后当我返回到图钉时,它们已经失去了颜色格式并且全部是原始的红色。

我认为这与下载图块时地图重新加载有关,并且没有正确重新加载引脚,尽管我可能是错的。

任何帮助都感激不尽。

这是我的代码:

#import "CashPointMapViewController.h"
#import "PinDrop.h"
#import "CashPointDetailViewController.h"

@implementation CashPointMapViewController
@synthesize app, theCashList, mapview, ann, count, myArray, pinColor;

- (IBAction) getlocation { 

    MKCoordinateRegion region;
    region.center = self.mapview.userLocation.coordinate;
    region.span.longitudeDelta = 0.01f;
    region.span.longitudeDelta = 0.01f;
    [mapview setRegion:region animated:YES];
}

- (void)viewDidLoad {

    [super viewDidLoad];

    mapview.showsUserLocation = YES;

    [mapview setMapType:MKMapTypeStandard];
    [mapview setZoomEnabled:YES];
    [mapview setScrollEnabled:YES];

    MKCoordinateRegion region = { {0.0, 0.0 }, {0.0, 0.0 } };
    region.center.latitude = 53.801279;
    region.center.longitude = -1.548567;
    region.span.longitudeDelta = 0.3f;
    region.span.longitudeDelta = 0.3f;
    [mapview setRegion:region animated:YES];

    app = [[UIApplication sharedApplication]delegate];

    UIImage *locate = [UIImage imageNamed:@"location arrow white.png"];

    UIBarButtonItem *userlocatebutton = [[UIBarButtonItem alloc] initWithImage:locate     style:UIBarButtonItemStylePlain target:self action:@selector(getlocation)];

    self.navigationItem.rightBarButtonItem = userlocatebutton;

    [self performSelectorInBackground:@selector(annloop) withObject:self];

}


-(void) annloop {

    int i;
    for (i=0; i<=count-1; i = i+1) {
    theCashList = [myArray objectAtIndex:i];

    NSString *trimlat = [theCashList.lat stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
    NSString *trimlon = [theCashList.lon stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

    double latdouble = [trimlat doubleValue];
    double londouble = [trimlon doubleValue];

    CLLocationCoordinate2D coord = {(latdouble),(londouble)};

    ann = [[PinDrop alloc] init];

    ann.index = i;

    ann.title = [theCashList.name stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

    NSString *street = [theCashList.street stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
    NSString *town = [theCashList.town stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
    NSString *postcode = [theCashList.postcode stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

    NSString *address = [[NSString alloc] initWithFormat:@"%@, %@, %@", street, town, postcode];

    ann.subtitle = address;
    ann.coordinate = coord;

    NSString *trimprice = [theCashList.price stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

    if ([trimprice isEqualToString:@"Free"])
    {
        ann.price = 1;
    }
    else
    {
        ann.price = 0;
    }
    [mapview performSelectorOnMainThread:@selector(addAnnotation:) withObject:ann waitUntilDone:YES];
    }
}


-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation {

    if ([annotation isKindOfClass:[MKUserLocation class]])
    return nil;

    MKPinAnnotationView *mypin = [[MKPinAnnotationView alloc]initWithAnnotation:ann reuseIdentifier:@"current"];
    mypin.backgroundColor = [UIColor clearColor];
    UIButton *goToDetail = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
    mypin.rightCalloutAccessoryView = goToDetail;
    mypin.draggable = NO;
    mypin.animatesDrop = TRUE;
    mypin.canShowCallout = YES;


    if (ann.price == 1)
    {
        mypin.pinColor = MKPinAnnotationColorGreen;
    }
    else
    {
        mypin.pinColor = MKPinAnnotationColorRed;
    }
    return mypin;
    }


- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view
calloutAccessoryControlTapped:(UIControl *)control {

   PinDrop *annView = view.annotation;
    CashPointDetailViewController *detailView = [[CashPointDetailViewController alloc]init];
    theCashList = [myArray objectAtIndex:annView.index];
    detailView.theCashList = theCashList;
    [self.navigationController pushViewController:detailView animated:YES];

}


- (void)viewDidUnload {

    [super viewDidUnload];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:   (UIInterfaceOrientation)interfaceOrientation {
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

@end

编辑:这是我的 .h 如果有帮助的话。

#import <UIKit/UIKit.h>
#import "AppDelegate.h"
#import "CashPointList.h"
#import <MapKit/MapKit.h>
#import "PinDrop.h"

@interface CashPointMapViewController : UIViewController  {

    MKMapView *mapview;
    PinDrop *ann;
}

    @property (nonatomic, retain) AppDelegate *app;
    @property (nonatomic, retain) CashPointList *theCashList;
    @property (nonatomic, retain) PinDrop *ann;
    @property (nonatomic, retain) IBOutlet MKMapView *mapview;
    @property (nonatomic, readwrite) int count;
    @property (nonatomic, retain) NSMutableArray *myArray;
    @property (nonatomic) MKPinAnnotationColor pinColor;

    -(IBAction) getlocation;


@end

这不是与地图重新加载图块相关的问题。

问题是代码中的viewForAnnotation代表正在使用ann对象具有错误的假设,即类实例级别ann每当调用委托方法时,对象都会同步。

The viewForAnnotationdelegate 不一定按照添加注解的顺序调用,也可以调用multiple如果地图返回视图时需要重新显示注释,则相同注释的时间。

当之前添加的注释再次调用委托方法时,ann and annotation不再指向同一个对象。ann现在可能指向最后添加的注释,因此所有注释都会更改为其颜色。

在该委托方法中,您必须使用annotation参数,它是对地图视图想要视图的注释的引用在当前通话中(这可能与您的外部循环完全无关)。

所以这一行:

MKPinAnnotationView *mypin = [[MKPinAnnotationView alloc] 
    initWithAnnotation:ann reuseIdentifier:@"current"];

应该:

MKPinAnnotationView *mypin = [[MKPinAnnotationView alloc] 
    initWithAnnotation:annotation reuseIdentifier:@"current"];
                       ^^^^^^^^^^

并且在检查注释的属性时,使用annotation参数(并将其转换为您的自定义类以获取自定义属性):

PinDrop *ann = (PinDrop *)annotation;
//Note that this local "ann" is NOT the same as the class-level "ann".
//May want to use a different name to avoid confusion.
//The compiler may also warn you about this.

if (ann.price == 1)
...


一个单独的、不相关的但强烈推荐的建议是通过使用来实现注释视图的重用dequeueReusableAnnotationViewWithIdentifier。当您有大量注释时,这将提高性能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MapView Pin 注释的问题 - 当地图缩放/平移/区域更改时 Pin 会失去颜色 的相关文章

  • 如何使用MKMapView完成加载委托,可能的“完成显示”委托?

    当用户在选择注释后点击 保存 时 我尝试保存地图视图的缩略图 当用户尚未放大该注释时会出现问题 因此尚未加载关闭缩放级别 这就是用户点击保存后我正在做的事情 将布尔值 saving 设置为 true 居中并放大注释 无动画 当调用mapVi
  • 两者都实现了类。将使用两者之一

    我有一个项目 它具有使用 SocketRocket 的依赖项 通过 CocoaPods 安装 并从 HeapAnalytics 导入了静态库 显然 HeapAnalytics 库已经使用了 SocketRocket 编译时没有出现错误 但在
  • ViewWillAppear 没有被 UISplitViewController 调用

    背景和目标 我有一个基于 UISplitViewController 的 iPad 应用程序 到目前为止它支持 4 个方向 但现在我想将其锁定为仅横向 我变了shouldAutorotateToInterfaceOrientation左视图
  • “同时创建 xib 文件”按钮已禁用

    我在创建时遇到这个问题UIView s子类 创建 例如 UIViewControllers or UITableViewCells没关系 为什么会出现这种情况 I create view using cmd N and Xcode Vers
  • iOS Storyboards 我应该使用它们吗? [复制]

    这个问题在这里已经有答案了 我是 iOS 开发新手 尚未创建应用程序 但我向我的朋友寻求建议 他在市场上拥有非常高评价的应用程序 他说不要使用故事板 尽管我很想听取他的建议 但它们似乎确实很有帮助 这是否会在将来给我的应用程序带来问题 我有
  • 带有 Core Data 对象的动态 UITableView 高度

    过去几天我一直在试图解决一个谜团 即为什么我的批处理大小为 20 的 NSFetchedResultsController 总是在获取完成后立即错误 即加载到内存中 我的所有对象 从而导致请求需要约 20 秒 事实证明 这是因为在我的 he
  • 图像目录中矢量 pdf 的渲染模式设置为模板,但 UIImageView 不会在自定义单元格中对图像进行着色

    我已将所有图像文件迁移到资产目录中 它们都是大小为 1x 的 pdf 向量 它们被设置为呈现为模板 它们的大小和颜色在任何地方都表现得很好 但是有一个来自 xib 的自定义 TableView Cell 我有 6 个 UIImageView
  • GMSMapView 中的倒多边形

    我必须在我的 iPhone 项目中使用 Google 地图 并且我正在使用 GMSPolygon 来绘制多边形 但是如何填充地图上除多边形内部之外的所有位置 就像下图一样 谢谢 我玩过你的问题 主要思想是用多边形填充整个地球 然后为您的特定
  • 无法将 admob 与 firebase iOS/Android 项目链接

    我有两个帐户 A 和 B A 是在 Firebase 上托管 iOS Android unity 手机游戏的主帐户 B 用于将 admob 集成到 iOS Android 手机游戏中 我在尝试将 admob 分析链接到 Firebase 项
  • 为什么 Xcode 4 不会对我未完整实现 UITableViewDataSource 协议发出警告?

    如果我在 Xcode 中使用以下代码声明并不完全实现我自己的协议 一些协议 h protocol SomeProtocol
  • 如何在 Swift 3 中解析 JSON 数组 [重复]

    这个问题在这里已经有答案了 我从 Socket 获取了一些我想访问的数据 但收到错误消息 指出每次都无法将 NSArray 转换为 NSDictionary struct SocketEventHandler let event Strin
  • 暂停视频录制[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在尝试创建一个应用程序 用户可以在其中从相机录制视频 该应用程序的功能之一必须是文件录制中的暂停 例如 用户通过按 开始 按钮开始
  • 在后台任务中安排通知

    我正在为 iOS 开发一个日历 闹钟应用程序 它与网络服务器同步 当在服务器上添加活动时 会发出推送通知 以便 iOS 客户端可以获取新数据 并根据需要更新和安排下一次警报的时间 本地通知 但这仅在应用程序在客户端打开时才有效 我希望客户端
  • 检查 touchend 是否在拖动后出现

    我有一些代码可以更改表的类 在手机上 有时表格对于屏幕来说太宽 用户将拖动 滚动来查看内容 但是 当他们触摸并拖动表格时 每次拖动都会触发 touchend 如何测试触摸端是否是触摸拖动的结果 我尝试跟踪dragstart和dragend
  • 如何更改已上传的 Firebase 存储图像文件名?

    我需要更改已上传到 firebase 存储中的文件名 因为 在 firebase 存储中上传图像后 我将 url 保存在 firebase 数据库中的特定子 文件夹 下 但是 当我将图像移动到另一个子 文件夹 时 我需要根据新名称更改存储中
  • 自定义 MKAnnotationView - 如何捕获触摸而不忽略标注?

    我有一个自定义 MKAnnotationView 子类 它完全按照我想要的方式显示视图 在那个视图中 我有一个按钮 我想捕获按钮上的事件来执行操作 这很好用 但是 我不希望标注被忽略或消失 基本上 触摸标注中的按钮将开始播放声音 但我想保留
  • 应用程序未通过协同设计验证?

    我在提交 iPhone 申请时遇到问题 我看到了一些类似的问题 但没有找到答案 当我存档项目并单击 验证 时 收到错误消息 应用程序未通过协同设计验证 签名无效 或者未使用 Apple 提交证书进行签名 我假设我在协同设计部分做错了什么 我
  • 显示键盘时如何在 TextView 下方添加更多填充

    当我在 ScrollView 中有 TextField 并点击它时 键盘会按预期显示 但似乎 TextField 已向上移动到足以显示输入区域 但我希望移动到足够的位置 以便整体可见 否则它看起来像是被剪裁了的 我找不到改变这种行为的方法
  • 为什么这个 SKPhysicsJointPin 不能将这 2 个精灵保持在一起?

    我显然不太了解 SKPhysicsJoint 但是除了 Apple 文档之外 网上的信息还很少 下面的代码有什么问题 我认为应该保持头部和颈部永久连接 我的意图是它们就像两张带有大头针的纸 这样它们可以旋转一点 但不仅仅是完全分开 当我运行
  • KeyboardAvoidingView - 隐藏键盘时重置高度

    我正在使用 React NativeKeyboardAvoidingView设置我的高度View当显示键盘时 但是当我关闭应用程序中的键盘时 视图的高度不会变回原来的值

随机推荐

  • 我备份了一个 git 项目,并得到“致命:不是 Git 存储库”

    我将 Linux 上的 git 文件夹备份到 FAT32 外部驱动器上 稍后将其复制回来 它说 fatal Not a git repository or any of the parent directories git 可能出了什么问题
  • 错误:变量可能尚未初始化

    收到错误 Pay java 81 错误 变量hourlyWage可能不是 已初始化JOptionPane showMessageDialog null hourlyWage 对于以下代码 双hourlyWage已声明 这些陈述位于主要论点内
  • 应用程序处于后台模式时的文本到语音功能?

    我正在研究一个TextToSpeech应用程序 我在一篇文章中写了一段UITextField 然后我按Speak按钮 声音根据写入的文本播放UITextField 但是 当应用程序处于后台模式时 音频将停止播放 如何在后台模式下继续播放声音
  • Angularjs如何上传多部分表单数据和文件?

    我是 angular js 的初学者 但我很好地掌握了基础知识 我想要做的是将文件和一些表单数据作为多部分表单数据上传 我读到这不是 Angular 的功能 但是第 3 方库可以完成此任务 我已经通过 git 克隆了 Angular fil
  • 在循环中为 Tkinter Entry 小部件创建 StringVar 变量

    我有一个小脚本 可以生成随机数量的条目小部件 每个都需要一个 StringVar 以便我可以将文本分配给小部件 由于我无法提前知道会有多少个 因此如何将它们创建为循环的一部分 from Tkinter import import rando
  • Pygame 应用程序中的 SVG 渲染。在 Pygame 2.0 之前,Pygame 不支持 SVG。那你是怎么加载的呢?

    In a Pygame应用程序中 我想渲染 SVG 中描述的无分辨率 GUI 小部件 我怎样才能实现这个目标 我喜欢OCEMP图形用户界面工具包 但它的渲染似乎依赖于位图 这是一个完整的例子 结合了其他人的提示 它应该从当前目录渲染一个名为
  • 如何将 TextView 文本颜色设置为特定主题颜色

    我尝试学习 Android 主题 但在设置主题时遇到了麻烦TextViewTextColor 为另一种颜色 然后是全局的
  • Delphi:Char 和 TCharArray“不兼容类型”数组

    我在下面的评论中遇到过几次 不兼容的类型 错误 并且一直对为什么 Delphi 2007 不直接支持此错误感到满意 program Project1 APPTYPE CONSOLE type TCharArray array of Char
  • 查找图像的方向

    我正在使用 OpenCv 进行模式匹配 我有一个模型 我将目标与函数 cvMatchShapes 进行比较 它有效 但我想知道目标的方向 我该怎么做 例如 边界旋转矩形是否适合轮廓方向相差 180 度的情况 解决问题的另一种方法是计算轮廓矩
  • 从另一个文件获取变量 - python

    我正在创建一个 Tkinter 程序 允许用户在一个漂亮的框中输入文本 而不是在 python shell 中 因为我想在多个程序中使用它 所以我将其制作成一个可以在其他文件中使用的函数 我可以让它在另一个文件中运行 但不能导入变量 这是我
  • PHP中相对路径还是绝对路径以及如何设置

    我正在开发一个网站 我正在尝试访问该网站的主目录 但我不知道如何进行设置 我想做的是包括 inc config php通过 inc config php而不必使用 inc config php有什么想法如何添加这个吗 一般来说 处理路径时需
  • OpenXML 从 Excel 创建数据表 - 货币单元格值不正确

    我正在尝试使用 OpenXML 从 Excel 电子表格创建数据表 使用 Cell CellValue innerXml 获取行的单元格值时 为用户输入的货币值返回的值 在电子表格上可见 与解释的值不同 电子表格单元格格式为文本 单元格值为
  • 在 iOS 10+ 中,有什么方法可以可靠地唤醒应用程序

    我已经这样做了三个多月了 我的头发都被拔掉了 所以请不要回复初学者的答案 我想知道 在 2017 年的 iOS 10 中 是否有任何方法可以将应用程序从终止状态唤醒 最好是通过蓝牙外围设备 但我会采取我能得到的 我认为终止的时间是用户在任务
  • 如何比较签名和未签名(并避免问题)

    最近我听说 C 中的有符号 无符号比较可能很棘手 例如 有符号 无符号比较还有其他一些问题 我的问题是 如果我们必须将有符号类型与无符号类型进行比较 例如 包括 gt 存在哪些策略可以避免这种比较产生的问题 或者我们应该确保我们总是只比较i
  • Magento 价格格式 - 2 或 3 位小数

    我需要将某些商品的价格设置为小数点后 3 位 我通过将 精度 变量更改为 3 来实现此目的 但这意味着网站上的每个价格都显示为小数点后 3 位 即 空购物车显示为 0 000 英镑 我只想在需要时显示小数点后第三位 但我不确定在代码库中哪里
  • 创建/追加节点与innerHTML

    有人有充分的理由使用其中一种而不是另一种吗 据我所知 创建 附加节点只是防止您创建无效代码 而innerHTML允许您一次注入多个节点 考虑到我需要插入几个标签 使用innerHTML似乎是有意义的 有人有不同的看法吗 这始终是一个有争议的
  • SaveMany 在 cakePHP 中同时更新多条记录不起作用

    我面临着使用 saveMany 同时更新多个记录的问题 我有如下关联 候选人hasMany候选人雇主 候选人雇主属于候选人 Candidate php 中的模型关联 public hasMany array CandidatesEmploy
  • 按顺序生成数字 Order

    我想生成由支票中输入的位置搜索的值 例如 如果输入 20 则函数应生成从 0 开始的数字 并继续按升序排列 直到创建 20 位数字 然后输出生成的数字字符串中第 20 位的值 01234567891011121314 即 4 我在下面尝试了
  • 主题已在云发布/订阅上创建,但无法创建该主题的监视

    我想在云发布 订阅主题上创建监视 但无法创建它 为此 我正在使用其余请求 request Req post url https www googleapis com gmail v1 users me watch headers conte
  • MapView Pin 注释的问题 - 当地图缩放/平移/区域更改时 Pin 会失去颜色

    我有一个显示现金点位置的地图视图 注释将被删除 并且可以单击标注以转到包含有关该位置的更多详细信息的页面 提款机分为免费和付费两类 免费提款机的针脚为绿色 另一种为红色 当别针掉落时 它们的颜色是正确的 一切正常 直到我缩放到用户位置或地图