我有一个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我导致覆盖层闪烁。
我该怎么做才能避免这种闪烁?
我需要知道,是否有任何苹果方向 api,我们可以通过它来获取两点(坐标)之间的方向详细信息,就像我们可以通过谷歌 api 一样。
我需要在应用程序内绘制两点之间的路线。我不想使用新的 IOS SDK 6 MKMapItem 类打开苹果地图。
谢谢
我正在制作一个应用程序来显示用户当前位置附近的一些地方。当用户移动地图时,地图会一遍又一遍地将用户移动到他的当前位置。因此,用户无法看到地图上的注释,因为如果他移动地图,地图就会返回到他当前的位置。
这就是我现在正在做的事情:
- (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)
我在这里尝试了一些其他答案,但没有任何反应。这不是所需的行为,那么我怎样才能停止更新用户的当前位置呢?
目前我正在 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) 对于我正在构建的应用程序,我想实现一个功能,允许用户指定葡萄酒的地理原产地(国家(例如法国)、地区(例如波尔多)、次地区(例如保拉克))。
我想确保我不必自己添加所有可用的国家/地区,并且进入数据库的所有信息都是有效的。因此,我决定这样做:
Country包含所有相关信息的对象。只有当存在这样的物体时,酒车才能被拯救这工作得很好,除了一件事:苹果地图可以从任何地方返回任何东西,比如餐馆、商店等。
我的问题:我如何指定我要寻找的内容?我只能指定我正在搜索的区域,这与我的情况无关。我希望能够告诉苹果地图仅查找国家、地区、城市等。这在某种程度上可能吗?我已经用尽谷歌来解决这个问题,到目前为止还没有找到办法。
我使用自定义 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) 我有MKMapView几个注释,其中 3 个注释彼此非常接近。
我曾经mapView.showAnnotations(mapView.annotations, animated: false)在启动时显示同一区域上的所有注释,但 3 个注释之一被隐藏,因为它太接近了。
我查看了Apple的文档,但找不到防止这种情况发生的方法,知道如何防止注释分组吗?
(我以前从未见过这个,也许这是iOS 11的功能)
这是与我的故事板匹配的更新代码。有两个不同的子视图控制器,地图视图和集合视图。当用户单击允许卡片折叠和展开的按钮时,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) 首先我遇到了一个只有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)
这是一种情况在几秒钟内过去,但我该如何解决这个问题?
我有一个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) mapkit ×10
ios ×8
swift ×5
mkmapview ×3
annotations ×1
image ×1
ios14 ×1
iphone ×1
maps ×1
objective-c ×1
polyline ×1
uibezierpath ×1
voiceover ×1
xcode ×1