当半径增加时如何在 CLLocationManager 中为区域绘制固定圆

2024-02-05

我有一个要求,我必须在 CLLocationManager 中为区域绘制一个圆圈。我已经完成了本准则的要求,

CLLocationDegrees latitude = 37.33492222;
    CLLocationDegrees longitude = -122.03304215;
    CLLocationCoordinate2D centerPoint = CLLocationCoordinate2DMake(latitude, longitude);
    CLLocationDistance radius = 100.0;
    CLRegion *region = [[CLRegion alloc]initCircularRegionWithCenter:centerPoint radius:radius identifier:@"Apple"];
    [locationManager startMonitoringForRegion:region];
    CAShapeLayer *circle = [CAShapeLayer layer];
    circle.path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, 2.0*radius, 2.0*radius) 
                                             cornerRadius:radius].CGPath;
    // Center the shape in self.view
    circle.position = CGPointMake(CGRectGetMidX(self.view.frame)-radius, 
                                  CGRectGetMidY(self.view.frame)-radius);

    // Configure the apperence of the circle
    circle.fillColor = [UIColor clearColor].CGColor;
    circle.strokeColor = [UIColor redColor].CGColor;
    circle.lineWidth = 1;
    circle.opacity = 0.5;

    // Add to parent layer
    [self.view.layer addSublayer:circle;

I have Got Out Put asenter image description here

问题是当我将半径值指定为 100 时,我得到的结果为 ScreenShot。如果我将值指定为 200,那么显然圆将会增加。

我的问题是,当给定任何值(例如 200、300 或 400)时,我希望圆具有相同的大小。


您的问题涉及增加半径,但在本论坛中,“半径”通常被解释为以点/像素为单位测量的圆的半径。

显然,这不是您所要求的。现在,您已经说过您不想使用MKMapView,但我认为在谈论你的目标时这是一种有用的语言。最重要的是,您不想更改屏幕上显示的圆的半径。您想要更改“跨度”(MKCoordinateSpan http://developer.apple.com/library/ios/documentation/MapKit/Reference/MapKitDataTypesReference/Reference/reference.html#//apple_ref/doc/uid/TP40009734-CH1-SW29)的“地区”(MKCoordinateRegion http://developer.apple.com/library/ios/documentation/MapKit/Reference/MapKitDataTypesReference/Reference/reference.html#//apple_ref/doc/uid/TP40009734-CH1-SW30)将在上述圆圈中呈现的地图。

有两种方法可以解决如何绘制代表地图投影的固定大小的圆的问题(但由于某种原因,您不需要地图)。

  1. 手动:

    • 定义一些有用的属性:

      @property (nonatomic) MKCoordinateRegion region;
      @property (nonatomic) CGRect frame;
      

      The region定义将在用户界面中显示的纬度和经度范围。这frame将是我们将在其中呈现这些纬度和经度点的屏幕坐标。请注意,要在用户界面中直观地表示纬度/经度坐标,您需要这两个方面,即定义可以表示的纬度/经度的内容以及说明将其放置在屏幕上的位置的其他内容。

    • 所以,第一个问题是如何定义该区域。在这里,我定义了中心坐标并定义了距中心坐标 500 米的区域:

      CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(...);
      self.region = MKCoordinateRegionMakeWithDistance(coordinate, 500.0, 500.0);
      

      您问“如何更改所显示内容的半径[即跨度]?”您可以通过更改来做到这一点region变量表示纬度/经度的范围将在用户界面中表示。

    • 无论如何,您现在可以将圆圈添加到屏幕上:

      - (void)addCircle
      {
          CGPoint center = CGPointMake(self.view.layer.bounds.size.width / 2.0, self.view.layer.bounds.size.height / 2.0);
          CGFloat radius = self.view.layer.bounds.size.width * 0.40;
      
          UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:center
                                                              radius:radius
                                                          startAngle:0.0
                                                            endAngle:M_PI * 2.0
                                                           clockwise:YES];
      
          self.frame = CGRectMake(center.x - radius, center.y - radius, radius * 2.0, radius * 2.0);
      
          CAShapeLayer *layer = [CAShapeLayer layer];
          layer.path = [path CGPath];
          layer.strokeColor = [[UIColor darkGrayColor] CGColor];
          layer.fillColor = [[UIColor whiteColor] CGColor];
          layer.lineWidth = 3.0;
      
          [self.view.layer addSublayer:layer];
      
          self.view.backgroundColor = [UIColor lightGrayColor];
      }
      
    • 编写一个例程来转换CLLocationCoordinate2D到屏幕上的某个位置:

      - (CGPoint)determineCGPointFromCoordinate:(CLLocationCoordinate2D)coordinate
      {
          CGFloat percentX = (coordinate.longitude - self.region.center.longitude + self.region.span.longitudeDelta / 2.0) / self.region.span.longitudeDelta;
          CGFloat percentY = 1.0 - (coordinate.latitude  - self.region.center.latitude  + self.region.span.latitudeDelta  / 2.0) / self.region.span.latitudeDelta;
      
          return CGPointMake(self.frame.origin.x + percentX * self.frame.size.width,
                             self.frame.origin.y + percentY * self.frame.size.height);
      }
      
    • 然后您可以在屏幕上添加您的积分:

      CGPoint center = [self determineCGPointFromCoordinate:coordinate];
      UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"spot.png"]];
      imageView.center = center;
      [self.view addSubview:imageView];
      

    这给我们带来了一个看起来像这样的视图:

  2. 在我看来,更容易的是重新评估您不使用地图视图的决定。

    • 您可以添加地图视图(请参阅位置感知编程指南 http://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/LocationAwarenessPG/MapKit/MapKit.html#//apple_ref/doc/uid/TP40009497-CH3-SW1)

    • 带上你的CAShapeLayer您创建的,而不是添加为子图层,您可以将地图剪辑到该圆形CAShapeLayer:

      [self.mapView.layer setMask:circleShapeLayer];
      

    并且,一旦您完成了向视图添加所有注释,您将得到如下所示的内容:

就我个人而言,我喜欢地图套件方法,因为它使您摆脱了手动计算屏幕坐标的麻烦。但如果你真的不想要地图背景,你可以手动完成。

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

当半径增加时如何在 CLLocationManager 中为区域绘制固定圆 的相关文章

  • 核心数据和 BOOL 设置

    我正在开发一个使用 Core Data 作为后端来管理 SQLite 记录的应用程序 我可以使用字符串和数字进行所有操作 但刚刚尝试添加 BOOL 字段 但似乎无法正常工作 在 xcdatamodel 中 我向我的对象添加了一个名为isCu
  • UISearchBar“提示”未正确显示

    我已经设置了一个 UISearchBarController 如下所示 self searchController UISearchController alloc initWithSearchResultsController nil s
  • iPhone RESTful Web 服务

    然而 甚至不确定标题是否正确 我想做的是使用标准 NSURLConnection 类来处理调用我的 web 服务的响应 我使用 POST 方法更新数据库 使用 GET 方法从数据库检索行 我遇到的问题是这两个操作可能同时发生 因此处理请求的
  • iOS 企业应用程序:无线分发:不受信任的企业开发人员

    我已将 ipa 和 manifest plist 上传到我的服务器 例如 https www xxxxxxx x om app 我在该服务器中创建了一个安装页面 在该安装 html 页面中 我有下载我的应用程序的超链接 a href Dow
  • 向 Stripe 提交付款请求时出现“无此类令牌”错误

    我正在使用 Stripe API 设置付款 以允许用户在 iPad 上登录其 Stripe 帐户并接受任何人的付款 为此 我使用 Stripe Connect 登录并保存他们的帐户 ID 然后使用STPPaymentCardTextFiel
  • 将 IOS 中的应用程序功能限制为仅适用于 Cell/WiFi 数据。

    我已经在 StackOverFlow 上进行了搜索 但没有找到任何关于如何使用所需设备功能或UIRequiresPersistentWiFi 如何在我的应用程序中设置值 以便该应用程序仅适用于 iPhone 中的蜂窝数据 WiFi 目前 我
  • 在 iOS 视图中获取触摸位置时,PAN 手势崩溃

    我只是做了一个示例来检查平移手势 平移手势正在检测并且工作正常 但每当我在平移手势中给出第二个点时 例如CGPoint secondPoint sender locationOfTouch 1 inView self imageView 它
  • AVPlayer 无法从音乐库中播放

    我正在尝试使用 AVPlayer 播放 iPhone 音乐库中的歌曲 一切似乎都准备好了 但播放器根本不会发出任何声音 我已经为此苦苦挣扎了一段时间 任何帮助将不胜感激 注意 我意识到我可以使用 AVAudioPlayer 但我想直接从我的
  • 如何用动画隐藏/显示 UISearchBar 范围栏?

    我想在表格为空时 在搜索栏第一次编辑之前 不显示范围栏 在编辑时不显示范围栏 最后在编辑完成时显示它 我了解 UISearchBarDelegate 协议 但我不知道如何用动画显示 隐藏范围栏 我知道 UISearchBar 有setSho
  • jquery mobile 和 iphone - 页面底部的空白区域

    我有一个 jquery 移动网页 它在桌面浏览器和 Android 上看起来都不错 但在 iPhone 的 safari 中 我在页面底部有一个奇怪的空白 它看起来像是 ui 页面的最小高度的问题 因为空白区域与 safari 的标题栏 u
  • 使用 NSURLSession 进行单元测试

    我想为使用共享的方法编写单元测试NSURLSession 特别是 NSURLSessionDataTask下载数据 基本上 我希望目标方法能够接收模拟响应 数据 而不需要互联网连接 模拟这些组件的不太不显眼的方式是什么 我正在考虑填充NSU
  • 是否可以在不使用 LibGDX 的情况下从 RoboVM 访问 OpenGL ES?

    是否可以从 RoboVM 访问 iOS 上的 OpenGL ES不使用 LibGDX 如果是的话 有什么有用的参考吗 我唯一能找到的是两年多前的这个超级简单的演示 http robovm com ios opengles in java o
  • 如何在 Objective-C 中运行时查找字符串常量?

    我的公司开发了一个广告 SDK 可以协调其他广告网络 在运行时 它通过使用检查其他广告网络是否存在NSClassFromString 并发送这些类消息 如果存在 这对于 Objective C 对象来说效果很好 但是如何在运行时加载字符串常
  • 如何禁用 iOS 8 表情符号键盘?

    iOS 8 中是否有任何选项可以停止显示表情符号键盘 它在数字键盘和安全文本中不可用 但对于电子邮件来说它是存在的 如果无法禁用它如何从表情符号中获取字符串值 尝试这个 BOOL textField UITextField textFiel
  • 运行工具链时出现“xcrun:错误:无法找到 SDK“iphonesimulator””

    我正在尝试将 Kivy 程序编译到 iOS 上 但是当我运行构建 Kivy 发行版的命令时 我不断收到此错误 xcrun 错误 无法找到 SDK iphonesimulator 我的电脑上有 xcode 到底是怎么回事 有点晚了 但我在尝试
  • iOS 7,搜索模式下范围栏变黑

    我使用嵌入到 UiTableViewController 的 UISearchDisplayController 在我的表格视图中创建一个搜索栏 但是 如果我设置搜索栏的背景图像 则范围栏不会在搜索模式下显示 而是显示黑条 这很奇怪 因为它
  • 当应用程序置于后台时,GCD 分派操作未运行

    我启动了一种方法 本质上是一个无限循环 使用dispatch queue create进而dispatch async 然后代码循环位于分派块内 循环完美运行 但是 当应用程序进入后台时 它会暂停 然后当应用程序进入前台时它会重新启动 我怎
  • 如何使我的响应式网站在手机上支持“请求桌面网站”?

    我有一个响应灵敏的动态网站 Java Servlet 驱动且完全手工编码 由于它是一个返回数据表的科学站点 因此某些选项在较小的视口宽度下不可用 然而 可能有些用户更喜欢在桌面网站上挣扎才能访问这些选项 我希望适应他们 我的问题是 对于 i
  • 如何在地图注释视图中找到 pin id?

    如何找到被点击的 pin 的 pin id 即 pin 标题和副标题的详细信息 我用它来显示引脚注释 这段代码在视图中确实加载了 resultCoordinate addObjectsFromArray sqlClass return Co
  • 将 NSData 转换为 JSON

    我有一个NSData对象 我需要将其转换为NSDictionary object NSData data 现在我需要将其转换为NSDictionary 我如何以编程方式执行此操作 注意 我保存后NSData to the NSDiction

随机推荐

  • BeautifulSoup HTML 获取 src 链接

    我正在使用 python 3 5 1 和 requests 模块制作一个小型网络爬虫 该模块从特定网站下载所有漫画 我正在尝试一个页面 我使用 BeautifulSoup4 解析页面 如下所示 import webbrowser impor
  • 如何从闪亮的callModule函数返回输入值

    我目前正在尝试根据以下内容模块化我的闪亮应用程序本教程 http shiny rstudio com articles modules html 在我的实际应用程序中 我有两个selectInput允许用户选择第一个和最后一个季度结束日期
  • WCF 服务参考 - 在客户端获取“XmlException:名称不能以 '<' 字符开头,十六进制值 0x3C”

    我有一个智能客户端应用程序通过 WCF 与其服务器进行通信 数据在客户端上创建 然后通过服务发送以进行持久化 服务器和客户端通过共享 dll 使用相同的域类 并且我在 Visual Studio 中使用方便的 添加服务引用 功能 该功能包装
  • 如何将双精度数组传递给 C 中的函数?

    我一整天都在尝试解决这个问题 如何将双精度数组传递给函数 这是一个例子 int matrix 5 2 1 2 3 4 5 6 7 8 9 10 我希望将此矩阵传递给名为的函数eval matrix void eval matrix int
  • heroku - system.properties 和 java 版本

    我想将我的 java 7 应用程序部署到Heroku但我遇到了java版本的一些问题 I added system properties我的项目根目录中的文件 其中src and pom xml是 有内容java runtime versi
  • 如何在其他活动的 onResume 之后更新 ListView?

    我正在尝试创建一个应用程序 使用户能够创建事件 然后邀请参与者 因此 当用户进入 添加参与者 页面时 输入所有信息后 我尝试使用 onResume 直接返回 参与者列表 页面 但如何更新列表视图 我尝试使用notifyDataSetChan
  • 在某些计算机上应用程序无法加载 sqlite dll 文件

    我编写了一个使用 sqlite 的应用程序 它在most的系统 它是用 C 编写的 唯一的非框架程序集是 sqlite 它包含在 System Data SQLite dll 中 我以相同的方式在所有计算机上部署它 复制粘贴 exe 文件
  • OpenGL 纹理反转

    我正在尝试将网络摄像头的输入映射到 OpenGL 中的平面 我正在使用 OpenCV 从网络摄像头获取图像 我遇到的问题是纹理是垂直反转的 如果我的纹理是 v 则当前结果是 我想将从网络摄像头拍摄的图像调整到我的飞机上 2x2 它的左下角是
  • 在本地主机的 Android 应用程序中使用 Web 服务

    我正在尝试使用我从 Android 应用程序本地创建的 Web 服务 我的问题是 在我的 Android 应用程序中 在某个时刻 我必须提供一个带有如下参数的 URL where CalculatorWS是我使用的网络服务 add是其中的操
  • 如何使用 setuptools 在 Python 3.6 中的库发行版上包含父文件夹结构?

    我正在使用 setuptools 来分发 Python 库 我有以下目录结构 src production setup py prod library package1 package2 文件夹结构必须保持这样 因为将来会有多个库位于 sr
  • 如何选择目录中的第一个文件?

    我试图在不知道文件名的情况下逐个处理目录中的一些文件 所以我用过os listdir path 列出文件 所以我必须在每次调用函数时列出文件 问题是当有很多文件 比如 2000 个 时 列出每个文件需要很长时间 而我只想要第一个文件 有没有
  • Cassandra 3.0 不接受 Java 11 安装

    我正在尝试启动 Cassandra 3 但它给出了消息 Cassandra 3 0 及更高版本需要 Java 8u40 或更高版本 我安装了 Java 11 gt java version java version 11 0 11 2021
  • 收到推送后出现意外的系统错误

    今天 github com 出现了一些停机时间 直到我去推送大约十几个本地提交时我才意识到 https status github com messages https status github com messages https tw
  • 使用 xcopy 批量复制文件

    我已经在互联网上检查了一些示例 但我无法让我的 第一个 批处理文件工作 我想自动将文件从一个文件夹复制到另一个文件夹 但没有任何反应 echo off xcopy C source C target c d i y exit 你能看出有什么
  • AttributeError:模块“numpy”没有属性“__version__”

    我今天更新了计算机 当我尝试导入 pandas 时收到以下错误消息 import pandas as pd AttributeError module numpy has no attribute version 我已尝试以下链接中的建议
  • 如何从 OneDrive 下载文件

    我想从 One Drive 下载公共文件夹中的文件 但它不下载这些文件 这是场景 在公共文件夹中 我有另一个文件夹 其中包含多个文件 并且可以广泛访问 出于测试目的 我共享了公共文件夹中的所有文件 如果这是正确的共享方式 我不会共享 以下链
  • laravel 5.2 将数据传递到注册视图

    我正在使用 laravel 5 2 我编写了以下命令来自动添加身份验证的路由和视图 php artisan make auth 现在我想将数据传递到注册视图 但我找不到在哪里执行此操作 我认为应该使用如下代码 Route get regis
  • 停止重复 UIView 动画块?

    我有一个 UIView 动画块 它使用UIViewAnimationOptionRepeat UIViewAnimationOptionAutoReverse选项 因此它会继续进行 但在某些时候我需要停止动画 但更重要的是停止它并使视图返回
  • Angular 中使用 rxjs 的用户通知服务?

    我对反应式编程比较陌生 我正在尝试创建一个可以向用户显示通知的 Angular 服务 到目前为止 这就是我所拥有的 https stackblitz com edit angular rxjs notifications file app
  • 当半径增加时如何在 CLLocationManager 中为区域绘制固定圆

    我有一个要求 我必须在 CLLocationManager 中为区域绘制一个圆圈 我已经完成了本准则的要求 CLLocationDegrees latitude 37 33492222 CLLocationDegrees longitude