标签: mapkit

MapKit:更新 MKCircle 叠加层的半径属性而不闪烁

我有一个MKMapView (self.mapView),其中添加了具有特定半径 (self.location.radius) 的MKCircle覆盖 (self.radiusOverlay)。

MKMapView正下方有一个UISlider (self.radiusSlider),它可以在Value Changed上更改叠加层的半径:

- (void)viewWillAppear:(BOOL)animated {

    self.radiusOverlay = [MKCircle circleWithCenterCoordinate:CLLocationCoordinate2DMake([self.location.latitude floatValue], [self.location.longitude floatValue]) radius:[self.location.radius floatValue]];

    [self.mapView addOverlay:self.radiusOverlay];

    self.radiusSlider.value = [self.location.radius floatValue];
}
Run Code Online (Sandbox Code Playgroud)

这是进行半径更新的方法:

- (IBAction)updateLocationRadius:(UISlider *)sender {

    [self.mapView removeOverlay:self.radiusOverlay];

    self.location.radius = [NSNumber numberWithFloat:sender.value];

    self.radiusOverlay = [MKCircle circleWithCenterCoordinate:CLLocationCoordinate2DMake([self.location.latitude floatValue], [self.location.longitude floatValue]) radius:[self.location.radius floatValue]];
    [self.mapView addOverlay:self.radiusOverlay];
}
Run Code Online (Sandbox Code Playgroud)

这工作正常,但看起来不太好:通过删除并重新添加self.radiusOverlay我导致覆盖层闪烁。

我该怎么做才能避免这种闪烁?

objective-c mapkit

5
推荐指数
0
解决办法
3180
查看次数

有苹果方向API吗?

我需要知道,是否有任何苹果方向 api,我们可以通过它来获取两点(坐标)之间的方向详细信息,就像我们可以通过谷歌 api 一样。

我需要在应用程序内绘制两点之间的路线。我不想使用新的 IOS SDK 6 MKMapItem 类打开苹果地图。

谢谢

iphone mapkit ios

5
推荐指数
1
解决办法
1512
查看次数

当用户移动地图时,阻止 MKMapView 移动到用户的当前位置

我正在制作一个应用程序来显示用户当前位置附近的一些地方。当用户移动地图时,地图会一遍又一遍地将用户移动到他的当前位置。因此,用户无法看到地图上的注释,因为如果他移动地图,地图就会返回到他当前的位置。

这就是我现在正在做的事情:

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
{
if (userLocation)
{
    MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(userLocation.coordinate, 1000, 1000);
    MKCoordinateRegion regionDelMapa = [self.mapa regionThatFits:region];
    if(isnan(regionDelMapa.center.latitude))
    {
        NSLog(@"Bad region...");
    }else
    {
        [self.mapa setRegion:regionDelMapa animated:YES];
    }
}   
}
Run Code Online (Sandbox Code Playgroud)

我在这里尝试了一些其他答案,但没有任何反应。这不是所需的行为,那么我怎样才能停止更新用户的当前位置呢?

mapkit mkmapview ios

5
推荐指数
1
解决办法
4331
查看次数

如何在 UIView 中绘制与 MKPolyline 相同的 UIBezierPath

目前我正在 MKMapView 上跟踪我的位置。我的目标是绘制一条与从跟踪位置创建的 MKPolyline 相同的贝塞尔路径。

我尝试过的是:将所有位置坐标存储在 CLLocation 数组中。迭代该数组并将纬度/经度坐标存储在 CLLocationCooperative2D 数组中。然后确保折线位于屏幕视图中,然后转换 CGPoints 中的所有位置坐标。

目前的尝试:

@IBOutlet weak var bezierPathView: UIView! 

var locations = [CLLocation]() // values from didUpdateLocation(_:)

func createBezierPath() {
    bezierPathView.isHidden = false

        var coordinates = [CLLocationCoordinate2D]()
        for location in locations {
            coordinates.append(location.coordinate)
        }

        let polyline = MKPolyline(coordinates: coordinates, count: coordinates.count)
        fitPolylineInView(polyline: polyline)

        let mapPoints = polyline.points()

        var points = [CGPoint]()

        for point in 0...polyline.pointCount
        {
            let coordinate = MKCoordinateForMapPoint(mapPoints[point])
            points.append(mapView.convert(coordinate, toPointTo: polylineView))
        }

        print(points)

        let path = UIBezierPath(points: points)
        path.lineWidth …
Run Code Online (Sandbox Code Playgroud)

mapkit polyline ios uibezierpath swift

5
推荐指数
1
解决办法
1985
查看次数

MapKit 定义所需的搜索结果类型(国家、城市、地区等)

对于我正在构建的应用程序,我想实现一个功能,允许用户指定葡萄酒的地理原产地(国家(例如法国)、地区(例如波尔多)、次地区(例如保拉克))。

我想确保我不必自己添加所有可用的国家/地区,并且进入数据库的所有信息都是有效的。因此,我决定这样做:

  1. 用户添加一种新葡萄酒并输入其来源国家/地区的名称
  2. 打字时,应用程序会在苹果地图数据库中进行搜索
  3. 此搜索的结果显示为建议,当用户点击建议时,应用程序会创建一个Country包含所有相关信息的对象。只有当存在这样的物体时,酒车才能被拯救

这工作得很好,除了一件事:苹果地图可以从任何地方返回任何东西,比如餐馆、商店等。

我的问题:我如何指定我要寻找的内容?我只能指定我正在搜索的区域,这与我的情况无关。我希望能够告诉苹果地图仅查找国家、地区、城市等。这在某种程度上可能吗?我已经用尽谷歌来解决这个问题,到目前为止还没有找到办法。

maps mapkit ios mklocalsearch mklocalsearchrequest

5
推荐指数
1
解决办法
6433
查看次数

iOS MKMapView加载自定义瓦片优化

我使用自定义 TileOverlay 开发了 iOS 地图应用程序,它从我们自己的服务器加载图块。我扩展了 TileOverlay 类,它获取图块数据如下:

override func loadTile(at path: MKTileOverlayPath, result: @escaping (Data?, Error?) -> Void)
{
    let url = self.url(forTilePath: path)
    if let cachedData = cache.object(forKey: url as AnyObject) as? NSData
    {
        result(cachedData as Data, nil)
    } else {

        let session = URLSession.shared
        let request = NSURLRequest(url: url)
        let task = session.dataTask(with: request as URLRequest, completionHandler: {data, response, error -> Void in

            if let data = data {
                self.cache.setObject(data as AnyObject, forKey: url as AnyObject)
            }
            result(data, …
Run Code Online (Sandbox Code Playgroud)

mapkit mkmapview ios mktileoverlay swift

5
推荐指数
0
解决办法
1286
查看次数

MKMapView 阻止注释分组

我有MKMapView几个注释,其中 3 个注释彼此非常接近。

我曾经mapView.showAnnotations(mapView.annotations, animated: false)在启动时显示同一区域上的所有注释,但 3 个注释之一被隐藏,因为它太接近了。

我查看了Apple的文档,但找不到防止这种情况发生的方法,知道如何防止注释分组吗?

(我以前从未见过这个,也许这是iOS 11的功能)

mapkit ios mapkitannotation swift

5
推荐指数
1
解决办法
1177
查看次数

调用时未在地图视图上显示注释

这是与我的故事板匹配的更新代码。有两个不同的子视图控制器,地图视图和集合视图。当用户单击允许卡片折叠和展开的按钮时,ContentViewController 也有一个动画。mapView 是一个单独的视图。问题是,当我运行它时,显示动画时会显示一个新的视图控制器,而不是只替换 MapViewController。理想情况下,在运行时,用户会展开卡片视图,然后单击集合视图单元格,然后新的注释将填充屏幕顶部(因为这是地图视图所在的位置)。使用我当前的代码,注释没有显示在屏幕上。我将如何解决这个问题,以便在单击单元格时可以看到受尊重的注释?

这是代码。

import UIKit
import MapKit

struct PlacesOnMap {
var name: String
var latitude: Double
var longitude: Double

init(name: String, latitude: Double, longitude: Double) {
self.name = name
self.latitude = latitude
self.longitude = longitude
}
}

class ContentViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, MKMapViewDelegate {

@IBOutlet weak var mapView: MKMapView!

    var placesVal = [PlacesOnMap(name: "place 1", latitude: 12.9716, longitude: 77.5946),
                     PlacesOnMap(name: "place 2", latitude: 12.2958, longitude: 76.6394),
      PlacesOnMap(name: "place 3", latitude: 11.4102, longitude: 76.6950)
      ]
      var buildings = [PlacesOnMap(name: …
Run Code Online (Sandbox Code Playgroud)

xcode mapkit ios swift

5
推荐指数
1
解决办法
145
查看次数

iOS 14 MapKit 选择注解图片bug

首先我遇到了一个只有iOS 14才有的问题,老版本没有这样的问题。

当我从地图上的图钉中选择并抛出橙色图片时,我更改了图钉的图像。在执行此任务时,我看到了我在 iOS 14 设备上进行此更改期间在应用程序中使用的一些资产。

首次亮相:

前

选择引脚的那一刻:

期间

选择引脚后:

后

当pin被选中时,资产没有正常显示,直接选中了pin。现在,这样的情况出现了。

我在图钉点击情况下使用的代码如下

func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {
    view.image = UIImage(named: "pin_selected")
}

func mapView(_ mapView: MKMapView, didDeselect view: MKAnnotationView) {
    view.image = UIImage(named: "pin")
}
Run Code Online (Sandbox Code Playgroud)

这是一种情况在几秒钟内过去,但我该如何解决这个问题?

annotations image mapkit swift ios14

5
推荐指数
1
解决办法
651
查看次数

MKAnnotationView 自定义标注对辅助功能(VoiceOver)不可见

我有一个MKAnnotationView子类并将其中的几个放在MKMapView. 该MKAnnotationView子类设置一些辅助元素是这样的:

func applyAccessibility() {
    
    self.isAccessibilityElement = true
    self.accessibilityTraits = [.none]
    
    self.accessibilityLabel = "Bus stop map pin"
    self.accessibilityValue = busStop.name
}
Run Code Online (Sandbox Code Playgroud)

VoiceOver 会读出固定在地图上的公交车站的名称。

然后,UIView当点击公交车站时,我使用一个子类作为标注视图。

func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {
    
    if let annotation = view.annotation
    {
        if annotation is MKUserLocation
        {
            // This is our location marker
            return
        }
        
        busStopAnnotationCalloutView.setupForAnnotationView(view, delegate: self)
        
        view.addSubview(busStopAnnotationCalloutView)
        
        mapView.setCenter(annotation.coordinate, animated: true)
    }
}
Run Code Online (Sandbox Code Playgroud)

这很好用,但是这个标注视图对 VoiceOver 完全不可见。

init标注视图中,我设置了:

isAccessibilityElement = true
accessibilityTraits = .none …
Run Code Online (Sandbox Code Playgroud)

accessibility mapkit mkmapview ios voiceover

5
推荐指数
1
解决办法
153
查看次数