• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - map 注释有很多问题

[复制链接]
菜鸟教程小白 发表于 2022-12-11 19:56:24 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

对于一段非常简单的代码,我有几个问题。目标是从数据库中读取项目并将它们固定在 map 中。如果项目已被标记为收藏,则图钉应该是不同的颜色。

第一个问题是并不是所有的项目都被渲染了。在示例中,我将使用从查询返回的 12 个结果,并且我已验证每个项目都会创建一个 MKAnnotation,并且每个注释都会调用 ViewFor。

除了不显示所有图钉之外,还有另外两个问题。

滚动 map 时,第一个 Pin 图会随机丢失其标题。

其次,最喜欢的(绿色色调)很少呈现绿色。 80% 的时间它以标准蓝色出现。我再次验证了 MKMarkerAnnotationView 颜色设置正确。

面对所有这些问题,我不得不得出结论,我做的事情从根本上来说是非常错误的。这很奇怪,因为这看起来很简单。

class FacilityMarker: NSObject, MKAnnotation {

// title and subtitle are from the MKAnnotation protocol
var coordinate:     CLLocationCoordinate2D
var title:          String?
var address:        String
var phone:          String
var providerNumber: String
var favorite:       Bool
var subtitle:       String? {
    get {
        return phone
    }
}

View Controller

    class MapViewController: UIViewController, CLLocationManagerDelegate, MKMapViewDelegate {

@IBOutlet weak var mapView: MKMapView!

override func viewDidLoad() {
    super.viewDidLoad()
    mapView.delegate = self
    mapView.showAnnotations(mapView.annotations, animated: true)


// Create Annotations for all the facilities that are now visible on map
func mapView(_ mapView: MKMapView, regionDidChangeAnimated animated: Bool) {
    let edgePoints = mapView.edgePoints()

    let minLat = edgePoints.ne.latitude < edgePoints.sw.latitude ? edgePoints.ne.latitude : edgePoints.sw.latitude
    let maxLat = edgePoints.ne.latitude > edgePoints.sw.latitude ? edgePoints.ne.latitude : edgePoints.sw.latitude
    let minLong = edgePoints.ne.longitude < edgePoints.sw.longitude ? edgePoints.ne.longitude : edgePoints.sw.longitude
    let maxLong = edgePoints.ne.longitude > edgePoints.sw.longitude ? edgePoints.ne.longitude : edgePoints.sw.longitude
    let visibleCitiesReqeuest =
        managedObjectModel.fetchRequestFromTemplate(withName: "FetchByCoordinates", substitutionVariables: ["minLat" : minLat, "minLong" : minLong, "maxLat" : maxLat, "maxLong" : maxLong])
    do {
        let facilities = try CoreDataHelper.shared.persistentContainer.viewContext.fetch(visibleCitiesReqeuest!) as! [FacilityMO]
       for facility in facilities {
            let facilityMarker = FacilityMarker(name: facility.facilityName!, address: facility.addressLine1!, location: facility.location!, phone: facility.phoneNumber!, providerNumber: facility.providerNumber!, favorite: facility.favorite)   
            mapView.addAnnotation(facilityMarker)
        }
    } catch {
        let alertController = UIAlertController(title: "No Facilities", message: "There are no Facilities within the visible map area", preferredStyle: .alert)
        alertController.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.cancel, handler: nil))
        self.present(alertController, animated: true, completion: nil)
    }
}

// Put the pins in the map
func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
    guard let annotation = annotation as? FacilityMarker else { return nil}

    let identifier = "facility"
    var view: MKMarkerAnnotationView
    if let dequeuedView = mapView.dequeueReusableAnnotationView(withIdentifier: identifier) as?
        MKMarkerAnnotationView {
        dequeuedView.annotation = annotation
        view = dequeuedView
    } else {
        print("CREATING NEW View for: \(annotation.title!)")
        view = MKMarkerAnnotationView(annotation: annotation, reuseIdentifier: identifier)
    }

    // Set the Colors
    if (annotation.favorite) {
        view.markerTintColor = .green
        view.tintColor = .green
    } else {
        view.markerTintColor = .blue
        view.tintColor = .blue
    }
    return view
}

这是查询返回的实际数据。只有突出显示的项目才会被渲染。 这在所有测试中都是 100% 一致的。

  • CREATING NEW View for: SEMINOLE DIALYSIS CENTER

  • 为 LAKE SEMINOLE DIALYSIS 创建新 View
  • CREATING NEW View for: RAI CARE CENTERS - LARGO

  • CREATING NEW View for: BAY BREEZE DIALYSIS CLINIC INC

  • 创建新 View :RENVIVA DIALYSIS CENTER OF CLEARWATER, LLC
  • CREATING NEW View for: FKC - BELLEAIR DIALYSIS CENTER

  • CREATING NEW View for: RAI CARE CENTERS - CLEARWATER

  • 为 FMC - BELLEAIR 家庭疗法创建新 View
  • CREATING NEW View for: CORVA GULF COAST DIALYSIS CENTER

  • 为:海湾微风透析中心创建新 View
  • CREATING NEW View for: BMA - CLEARWATER

  • 为:RAI-US 19 NORTH-CLEARWATER 创建新 View

以下是显示上述结果的捕获

这是一个初始渲染。这次 BMA 引脚是蓝色的,它被设置为绿色。 Initial Render View Tint Wrong

这次滚动后,BMA 色调是正确的。什么时候是正确的,没有规律可循。 Sometimes Tint Works. Might be on initial render or maybe after scrolling.  No pattern detected

更多的滚动,只是为了增加更多的陌生感,有时一个或多个注释不会呈现它们的标题属性 Sometimes Annotation Title disappears after scrolling

请求调试的输出:

  • RAI 护理中心 - LARGO 是蓝色的
  • BMA - CLEARWATER 是绿色的
  • CLEARWATER, LLC 的 RENVIVA 透析中心是蓝色的
  • RAI 护理中心 - CLEARWATER 是蓝色的
  • FKC - 贝莱尔透析中心是蓝色的
  • FMC - BELLEAIR HOME THERAPIES 是蓝色的
  • GULF BREEZE DIALYSIS CENTER 是蓝色的
  • BAY BREEZE DIALYSIS CLINIC INC 是蓝色的
  • RAI-US 19 NORTH-CLEARWATER 是蓝色的
  • CORVA GULF COAST DIALYSIS CENTER 是蓝色的



Best Answer-推荐答案


试试下面的调试代码。你能显示输出吗?

    ...
    // Set the Colors
    if (annotation.favorite) {
        print(annotation.title, "is green")
        view.markerTintColor = .green
        view.tintColor = .green
    } else {
        print(annotation.title, "is blue")
        view.markerTintColor = .blue
        view.tintColor = .blue
    }
    ...

关于ios - map 注释有很多问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49532389/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap