Google Maps SDK 中的自定义注释视图

2023-12-27

我创建了一个基于地图的 iOS 应用程序,其中我想使用 iOS 版 Google Maps SDK 而不是 Mapkit,我找到了文档,但没有找到与自定义注释视图相关的方法,任何人都可以为我提供解决方案创建自定义注释视图(信息窗口)以及如何为其添加内容(标题、片段)。


我不知道你们怎么想,但我发现 Google 渲染的 UIView 信息窗口有点限制。使用SMCallout视图 https://github.com/nfarina/calloutview and Ryan Maxwell 的示例项目 https://github.com/ryanmaxwell/GoogleMapsCalloutView,可以呈现更多交互式视图。

截至 2014 年 6 月 10 日,这适用于 Google Maps SDK v1.8.1。

首先,做一些设置:

#import <SMCalloutView/SMCalloutView.h>

static const CGFloat CalloutYOffset = 10.0f;

@interface ViewController ()
@property (strong, nonatomic) SMCalloutView *calloutView;
@property (strong, nonatomic) UIView *emptyCalloutView;
@end

初始化SMCalloutView,向其添加一个按钮,然后创建一个空的UIView:

- (void)viewDidLoad
{
    /* all your other view init, settings, etc... */

    self.calloutView = [[SMCalloutView alloc] init];
    self.calloutView.hidden = YES;

    UIButton *button = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
    [button addTarget:self
               action:@selector(calloutAccessoryButtonTapped:)
     forControlEvents:UIControlEventTouchUpInside];
    self.calloutView.rightAccessoryView = button;

    self.emptyCalloutView = [[UIView alloc] initWithFrame:CGRectZero];
}

我们必须画出那个空的UIView以满足Maps SDK的要求,但我们将显示的视图是SMCalloutView。我还为标注视图设置了可重用的垂直偏移。

添加委托方法来处理信息窗口调用:

#pragma mark - GMSMapViewDelegate

- (UIView *)mapView:(GMSMapView *)mapView markerInfoWindow:(GMSMarker *)marker {
    CLLocationCoordinate2D anchor = marker.position;

    CGPoint point = [mapView.projection pointForCoordinate:anchor];

    self.calloutView.title = marker.title;

    self.calloutView.calloutOffset = CGPointMake(0, -CalloutYOffset);

    self.calloutView.hidden = NO;

    CGRect calloutRect = CGRectZero;
    calloutRect.origin = point;
    calloutRect.size = CGSizeZero;

    [self.calloutView presentCalloutFromRect:calloutRect
                                      inView:mapView
                           constrainedToView:mapView
                                    animated:YES];

    return self.emptyCalloutView;
}

- (void)mapView:(GMSMapView *)pMapView didChangeCameraPosition:(GMSCameraPosition *)position {
    /* move callout with map drag */
    if (pMapView.selectedMarker != nil && !self.calloutView.hidden) {
        CLLocationCoordinate2D anchor = [pMapView.selectedMarker position];

        CGPoint arrowPt = self.calloutView.backgroundView.arrowPoint;

        CGPoint pt = [pMapView.projection pointForCoordinate:anchor];
        pt.x -= arrowPt.x;
        pt.y -= arrowPt.y + CalloutYOffset;

        self.calloutView.frame = (CGRect) {.origin = pt, .size = self.calloutView.frame.size };
    } else {
        self.calloutView.hidden = YES;
    }
}

- (void)mapView:(GMSMapView *)mapView didTapAtCoordinate:(CLLocationCoordinate2D)coordinate {
    self.calloutView.hidden = YES;
}

- (BOOL)mapView:(GMSMapView *)mapView didTapMarker:(GMSMarker *)marker {
    /* don't move map camera to center marker on tap */
    mapView.selectedMarker = marker;
    return YES;
}

处理标注按钮上的触摸,此处使用带有标记标题和片段的警报视图:

- (void)calloutAccessoryButtonTapped:(id)sender {
    if (mapView_.selectedMarker) {
        GMSMarker *marker = mapView_.selectedMarker;
        //NSDictionary *userData = marker.userData;

        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:marker.title
                                                            message:marker.snippet
                                                           delegate:nil
                                                  cancelButtonTitle:@"OK"
                                                  otherButtonTitles:nil];
        [alertView show];
    }
}

显然,请确保您的 ViewController(.h) 监听 GMSMapViewDelegate:

@interface ViewController : UIViewController <GMSMapViewDelegate>

这基本上应该有效。完整的xcode项目请参见前述example https://github.com/ryanmaxwell/GoogleMapsCalloutView来自瑞恩·麦克斯韦。

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

Google Maps SDK 中的自定义注释视图 的相关文章

随机推荐

  • 如何强制android将应用程序安装到内存上

    我有一个从私人服务器下载的应用程序 它可以在大多数手机上安装 但我在 HTC Desire C 上安装它时遇到问题 该手机没有 SD 卡 我四处搜索 发现一个清单设置应该暗示内部存储 或者说至少没有对应用程序安装位置的偏好
  • Visual Studio:我可以复制项目的属性以在另一个项目中使用吗?

    我添加了几个目录 库 例如 matlab opencv 等 来编译 Visual Studio 项目中当前的 C 文件 我即将进行的所有项目都需要相同的设置 属性 我是否需要单独设置每个项目的属性 或者我可以做一些事情将其应用到所有项目 尝
  • 检测音量按钮按下并释放 iOS [重复]

    这个问题在这里已经有答案了 可能的重复 程序访问 iPhone 音量按钮 https stackoverflow com questions 772832 program access to iphone volume buttons 是否
  • 如何合并单个数据框中具有相同索引的行?

    我有一个如下所示的数据框 A B C 1 1234 Win 1 2345 Win 2 1987 Loss 3 3456 Win 3 4567 Win 我希望这成为 A B C 1 1234 2345 Win 2 1987 Loss 3 34
  • 路由到子路由模块,无需延迟加载

    我想要多个routing模块 以保持我的应用程序干净且易于阅读 我目前使用延迟加载SubComponent但我不想这样做 所以我正在寻找一种方法来改变这种情况 无论如何 这是当前正在工作的代码 我有以下两个路由文件 app routing
  • C 中的函数模拟?

    我正在编写一个单元测试来检查一些 API 调用 我正在使用检查来测试 我的模块是使用 CMake 构建的 如果重要的话 我不知道 我的测试调用一个函数 我需要测试 并且该函数调用另一个二进制文件 它的简化版本看起来像这样 unitTest
  • jQuery isFunction 检查错误“函数未定义”

    我想在尝试运行函数之前检查它是否存在 这是我的代码 if isFunction myfunc console log function exist run it 但是 当该功能不可用时 我收到错误 myfunc 未定义 我该如何进行检测 这
  • egit 中被拒绝的非快进问题

    我已经从分支 2 0 结帐了 现在我对其中一个文件进行了更改 我想将其提交到分支 即 2 0 分支 所以我右键单击文件 选择团队 gt 提交选项 我要求我选择分支 所以我选择了 2 0 和存储库 url 当我点击时 commit push
  • conda 错误:无法导入 zstandard

    我的 Conda 在 Ubuntu 18 04 上 出现以下错误消息 但所有功能都运行正常 home td7920 miniconda3 lib python3 8 site packages conda package streaming
  • App Engine 端点 API - 具有自定义域的 404

    我正在尝试将自定义域与应用程序引擎一起使用 本地主机一切正常并且应用程序点网址 https conference center 1177 appspot com 但与自定义域 https cc mdsarowar me 端点 API 不起作
  • Cakephp 翻译行为的默认行为不起作用

    谁能告诉我为什么当字段没有翻译时它会返回空 而不是默认翻译 我会感激所有的建议 不知道你想看我的代码的哪一部分 因为它都是直接来自 www book cake org 的 所以我粘贴一些代码 型号定义
  • 在 Linux 上安装 NPM

    我的目的是安装 angularjs 为此 我需要 gt npm 所以我想安装nodejs以获得 NPM 但我有这个错误 File configure line 16 in
  • Eclipse 上使用 Dataflow Runner 的 Apache Beam MinimalWordcount 示例

    我正在尝试在 Windows 上使用 Eclipse 中的 DataFlowRunner 运行 MinimalWordCount 示例 使用 MinimalWordCount gt 在 Eclipse 中运行作为 Java 应用程序 它与使
  • 使用 xclip 后 Tmux 中的键盘快捷键被停用

    我在 tmux conf 中使用以下配置从 xclip 来回复制文本 bind C c run tmux save buffer xclip i sel clipboard bind C v run tmux set buffer xcli
  • 消息控制器中未定义的方法“stringify_keys”

    当我尝试提交表单时 出现以下错误 当 1 个用户想要向另一个用户发送消息时 该表单就会显示 NoMethodError in MessagesController create undefined method stringify keys
  • 如何删除 Firestore 文档中的字段?

    如何删除 Cloud Firestore 中的文档字段 我正在使用下面的代码 但我不能 this db doc ProfileUser userId followersCount FollowersCount update currentU
  • 在 Web 上正确使用 SVG

    我想知道在 HTML 文档上使用 SVG 的最佳方法是什么 我读过一篇文章说 使用 SVG 图标比图标字体更好 即 fontawesome 等 以获得更好的性能并减少 HTTP 网络 调用 并提高搜索引擎优化 我知道如何使用 包含 SVG
  • 如何使用domains.google.com 验证我的自定义域

    如何使用验证我的自定义域domains google com如果 它不允许重复的密钥 并且 firebase 托管需要重复的密钥条目 并且 firebase 需要具有相同主机的 2 个文本条目 Google Domains 中的 DNS 记
  • UIPageControl 中的问题

    pageControl UIPageControl alloc initWithFrame CGRectMake 153 356 38 36 pageControl userInteractionEnabled YES pageContro
  • Google Maps SDK 中的自定义注释视图

    我创建了一个基于地图的 iOS 应用程序 其中我想使用 iOS 版 Google Maps SDK 而不是 Mapkit 我找到了文档 但没有找到与自定义注释视图相关的方法 任何人都可以为我提供解决方案创建自定义注释视图 信息窗口 以及如何