Swift - 带图像的自定义 MKPointAnnotation

2023-11-20

我正在尝试创建一个自定义MKPointAnnotation在地图视图上使用。它看起来非常像苹果照片中使用的那个:

enter image description here

我将从服务器检索一些照片及其位置。然后我想显示一个像上面这样的注释,并在注释中包含图像。

我目前有一个程序可以添加正常的MKPointAnnotation在正确的坐标处,还可以从服务器检索相关照片。

我想要的只是设计我的风格MKPointAnnotation看起来就像那样。

我尝试过遵循其他答案,但我认为这略有不同,因为我每次都想在模板上显示图像。


func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? from MKMapViewDelegate是您需要重写的函数。

它允许您为每个注释提供“自定义”视图。在此函数中,您可以使自定义视图(的子类)出列MKAnnotationView)并设置自定义属性,或者您可以将常规的队列出列MKAnnotationView它有一个财产image.

您可以设置该属性以显示自定义图像。无论如何,我宁愿使用我自己的annotationView,因为您可以添加自定义布局(标签、imageViews 等)和主题(颜色、图层等)。

Example:

//
//  ViewController.swift
//  Maps
//
//  Created by Brandon T on 2017-02-20.
//  Copyright © 2017 XIO. All rights reserved.
//

import UIKit
import MapKit


class ImageAnnotation : NSObject, MKAnnotation {
    var coordinate: CLLocationCoordinate2D
    var title: String?
    var subtitle: String?
    var image: UIImage?
    var colour: UIColor?

    override init() {
        self.coordinate = CLLocationCoordinate2D()
        self.title = nil
        self.subtitle = nil
        self.image = nil
        self.colour = UIColor.white
    }
}

class ImageAnnotationView: MKAnnotationView {
    private var imageView: UIImageView!

    override init(annotation: MKAnnotation?, reuseIdentifier: String?) {
        super.init(annotation: annotation, reuseIdentifier: reuseIdentifier)

        self.frame = CGRect(x: 0, y: 0, width: 50, height: 50)
        self.imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 50, height: 50))
        self.addSubview(self.imageView)

        self.imageView.layer.cornerRadius = 5.0
        self.imageView.layer.masksToBounds = true
    }

    override var image: UIImage? {
        get {
            return self.imageView.image
        }

        set {
            self.imageView.image = newValue
        }
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

class ViewController: UIViewController, MKMapViewDelegate {

    var mapView: MKMapView!
    var locationManager: CLLocationManager!

    override func viewDidLoad() {
        super.viewDidLoad()


        self.initControls()
        self.doLayout()
        self.loadAnnotations()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    func initControls() {
        self.mapView = MKMapView()

        self.mapView.isRotateEnabled = true
        self.mapView.showsUserLocation = true
        self.mapView.delegate = self

        let center = CLLocationCoordinate2DMake(43.761539, -79.411079)
        let region = MKCoordinateRegionMake(center, MKCoordinateSpanMake(0.005, 0.005))
        self.mapView.setRegion(region, animated: true)
    }

    func doLayout() {
        self.view.addSubview(self.mapView)
        self.mapView.leftAnchor.constraint(equalTo: self.view.leftAnchor).isActive = true
        self.mapView.rightAnchor.constraint(equalTo: self.view.rightAnchor).isActive = true
        self.mapView.topAnchor.constraint(equalTo: self.view.topAnchor).isActive = true
        self.mapView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor).isActive = true
        self.mapView.translatesAutoresizingMaskIntoConstraints = false
    }

    func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
        if annotation.isKind(of: MKUserLocation.self) {  //Handle user location annotation..
            return nil  //Default is to let the system handle it.
        }

        if !annotation.isKind(of: ImageAnnotation.self) {  //Handle non-ImageAnnotations..
            var pinAnnotationView = mapView.dequeueReusableAnnotationView(withIdentifier: "DefaultPinView")
            if pinAnnotationView == nil {
                pinAnnotationView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: "DefaultPinView")
            }
            return pinAnnotationView
        }

        //Handle ImageAnnotations..
        var view: ImageAnnotationView? = mapView.dequeueReusableAnnotationView(withIdentifier: "imageAnnotation") as? ImageAnnotationView
        if view == nil {
            view = ImageAnnotationView(annotation: annotation, reuseIdentifier: "imageAnnotation")
        }

        let annotation = annotation as! ImageAnnotation
        view?.image = annotation.image
        view?.annotation = annotation

        return view
    }


    func loadAnnotations() {
        let request = NSMutableURLRequest(url: URL(string: "https://i.imgur.com/zIoAyCx.png")!)
        request.httpMethod = "GET"

        let session = URLSession(configuration: URLSessionConfiguration.default)
        let dataTask = session.dataTask(with: request as URLRequest) { (data, response, error) in
            if error == nil {

                let annotation = ImageAnnotation()
                annotation.coordinate = CLLocationCoordinate2DMake(43.761539, -79.411079)
                annotation.image = UIImage(data: data!, scale: UIScreen.main.scale)
                annotation.title = "Toronto"
                annotation.subtitle = "Yonge & Bloor"


                DispatchQueue.main.async {
                    self.mapView.addAnnotation(annotation)
                }
            }
        }

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

Swift - 带图像的自定义 MKPointAnnotation 的相关文章

  • 如何使用 afnetworking 在后台上传任务

    我正在尝试使用 AFNetworking 上传大文件 并在应用程序处于后台时继续上传 我可以很好地上传文件 但是当我尝试使用后台配置时 应用程序崩溃并显示以下堆栈跟踪 异常 EXC BAD ACCESS 代码 1 地址 0x8000001f
  • UICollectionView 列的垂直偏移

    右图是我试图实现的目标 Does anyone know how I could achieve this on a two column UICollectionView I m able to discern my columns by
  • 我无法捕获 WKWebView 的屏幕截图

    我正在尝试捕获 WKWebView 的屏幕截图 但我的方法无法正常工作 它返回纯色 就好像图层树为空一样 而它似乎适用于其他视图 UIImage screenshot UIImage screenshot UIGraphicsBeginIm
  • IOS Coredata 兼容 IOS 9 和 ios 10

    您好 我正在开发一个适用于 IOS 10 和 9 xcode 8 的应用程序 创建新实体对象的正确方法是什么 新的IOS 10有这个代码 var newEvent Event context context 我们如何让这段代码同时适用于 I
  • 错误 ITMS-9000 iTunes Connect

    我正在尝试上传一个phonegap build iOS应用程序到应用程序商店 我不断收到此错误 ERROR ITMS 9000 Missing Code Signing Entitlements No entitlements found
  • ObjC <-> Swift 桥接和工厂方法

    我想从 Swift 使用一些 Objective C 类 由于超出了这个问题范围的原因 我的班级init方法被标记为不可用 相反 有一个工厂方法 这是我的班级的简化形式 interface MyClass NSObject instance
  • 将第 3 方库添加到 iPhone 应用程序时如何设置“标题搜索路径”的路径

    我想添加第 3 方库语音转文本 https github com todoroo iPhone Speech To Textto my Xcode项目 我只是拖xcodeproj文件在我的 iPhone 项目中 然后我按照目标依赖项 将二进
  • 从 AF.Request 响应获取数据

    我需要使用 Alamofire 的 Post 请求调用的 json 响应中的数据 但由于某种原因我无法访问该数据 我尝试按照 Alamofire github 文档以及这篇文章进行操作从 AF 响应 JSON 获取数据 https stac
  • AVAssetExportSession 输出文件

    AVAssetExportSession 输出文件应该是什么样子 我正在尝试压缩 ALAsset 项目中的视频 但它不起作用 我猜输出文件与它有关 这是我正在使用的代码 NSString destinationPath NSHomeDire
  • 如何相对于包含视图大小定位子视图?

    我希望能够将我的子视图从顶部定位到超级视图大小的 25 NSLayoutConstraint topPositionConstraint NSLayoutConstraint constraintWithItem containerView
  • Swift 中不再有“private init”?

    我看到很多关于使用的参考private init在 Swift 中限制对象构造 例如this http krakendev io blog the right way to write a singleton 但当我尝试时 在 Xcode
  • Flutter - 删除 ListView 中项目之间的空间

    我正在使用 ListView builder 函数来创建项目列表 然而 iOS 中每个项目之间的空间很大 截图 你知道如何删除项目吗 看来是默认的 因为我没有添加它 code 列表显示 return Scaffold body ListVi
  • 如何确定 UINavigationController 中工具栏的高度?

    我有一个带有由 UINavigationController 呈现的工具栏的视图 当我处理 UIKeyboardWillShowNotification 时 我将整个屏幕向上滚动键盘的高度 问题是当显示键盘时 底部工具栏不显示 所以我只需将
  • 在Swift中计算没有透明度的颜色,通过用透明颜色叠加颜色获得

    我有一个具有非透明颜色的原始 UIVieworgColor 这是由一个覆盖 UIView 覆盖的 该 UIView 具有overlayColor具有透明度 alpha 通道 鉴于这两种颜色orgColor and overlayColor我
  • 如何将代码 AVFoundation Objective C 转换为 Swift?

    我正在 swift 中使用 AVFoundation 来拍照 但我无法将任何 func 代码行从 Objective C 转换为 Swift 我的功能代码是 void capImage method to capture image fro
  • 为什么我们需要将 delegate 设置为 self?为什么编译器不默认它?

    I think我完全理解授权的概念 我的问题是 当我们这样做时 class someViewController UIViewController UITableViewDelegate 会吗ever可能我们不想设置tableView de
  • Sprite-kit:沿圆形路径移动元素

    我正在尝试让一个元素沿着圆圈的边缘移动 我在屏幕中间创建并放置了一个圆圈 var base SKShapeNode circleOfRadius 200 Size of Circle base position CGPointMake fr
  • 如何使用注释处理 Hibernate 和 Spring 中的连接查询?

    我正在使用 Spring 和 Hibernate 以及 MySQL 开发应用程序 我是 Hibernate 新手 完成了基本任务 现在我需要在选择查询中应用联接以使用注释从多个表中获取数据 我已经搜索过但仍然没有任何想法 这是我的数据库表和
  • NSUserDefaults、Settings.bundle 和应用程序组

    我有一个有 2 个目标的应用程序 主应用程序和 Today 扩展 为了在这些目标之间共享设置 我打开了应用程序组功能 添加了一个组group myApp com然后使用NSUserDefaults在主应用程序和今日扩展中都是如此 var d
  • 小部件配置在 macOS 上不起作用

    我为我的 iOS 应用程序制作了一个小部件 效果很好 现在我正在将其移植到我的 macOS 应用程序中 但不知何故 小部件配置不起作用 这些项目已显示 但我无法以某种方式选择它们 查看屏幕截图 但请看一下我制作的视频 https youtu

随机推荐

  • Lombok 的 lombok.copyableAnnotations 不适用于 Jackson 注释

    我正在尝试利用 Lombok 的新功能copyableAnnotations功能以便拥有 Jackson 注释 例如 JsonIgnore and JsonValue复制到生成的 getter wither 方法 该博客似乎表明这应该可行
  • Ajax 加载后如何执行 JavaScript?

    我需要在 ajax 加载后添加一个类 我首先给一些元素一个 ready 类 它启动 css 转换 当链接 li menu item 318 a 被点击时 它会删除就绪类 然后反转 css 转换 然后加载新的 html 文档 在 Aja 加载
  • Perl:如何在 X 秒后获取 IO::Socket::INET 超时?

    我正在尝试使用无效端口连接到某个主机 并且我希望在 X 秒后超时 怎么做 My code sock new IO Socket INET PeerAddr gt 0 PeerPort gt 1 Proto gt tcp Timeout gt
  • 按周数获取日期范围c# [重复]

    这个问题在这里已经有答案了 可能的重复 在 net中 知道周数如何获得工作日日期 Hello 我有一个问题要问你 如何获取给定周数的日期范围 例如 如果我进入第 12 周 输出应该是 21 03 2011 22 03 2011 23 03
  • 导入请求适用于 Windows shell,但不适用于 PyCharm

    简单导入请求 import requests 可以在 Windows shell 中执行和使用 但在 pycharm 中也有相同的代码 Traceback most recent call last File C Users XPS13 P
  • 有没有办法以编程方式生成 CouchDB cookie?

    我正在开发一个应用程序 它将使用 CouchDB 为用户存储一些数据 但我不希望用户直接登录CouchDB 我将有一个应用程序客户端 移动 网络 一个应用程序服务器和 CouchDB 服务器 客户端应用程序将向应用程序服务器进行身份验证 然
  • NullPointerException:使用 GSON 在 JAVA 中解析 JSON

    我想使用 Api GSON 通过 java 解析 JSON 文件以获取 JSON 文件的最后一个字段 描述符 json Teleservice 1 Record 1 method name mehdi method params param
  • 从 vim 中运行 PHP 文件

    是否可以在 vim 中运行 PHP 文件 我在这里尝试做的是有一个快捷方式 这样每当我需要运行我正在编辑的文件时 就可以跳过退出 vim 并手动调用 PHP 解释器 是的 做你想做的事是可能的 两者都从 vim 中运行 PHP 并创建快捷方
  • 跨域发布到 ASP.Net MVC 应用程序

    我正在开发一个应用程序 其中 HTML 和 javascript 块被传递到不同的客户端 我可以通过将以下内容添加到 Web 配置文件来获取 html javascript 块
  • JavaFX 使对象可见但不消耗(忽略)点击

    标题说明了一切 我在 JavaFX 中有一个矩形 用于透明 不透明效果 但我希望人们能够 点击 它 因此 当我说单击时 我的意思是当您单击它时 Java 应该假装它不存在 而是 单击 该对象下方的任何内容 当您使用 setVisible f
  • 与免费的 Java 分析器相比,商业 Java 分析器有哪些优势? Netbeans 中的那个?

    有时 我必须对 Java 代码进行一些分析工作 我想知道为什么我应该让我的老板使用商业分析器进行调查 而不是只使用 Netbeans 或 JConsole 中的分析器 值得投资的杀手级功能是什么 根据我使用 JProfiler 的经验 它是
  • 未捕获的类型错误:对象 [object Object] 没有方法“apply”

    我在我正在创建的新网站上收到此未捕获的类型错误 但我无法找出导致该错误的原因 我在下面的链接中重新创建了该问题 如果您查看浏览器的 JS 控制台 您会看到发生错误 但没有其他情况发生 http jsfiddle net EbR6D 2 Co
  • 有状态 lambda 表达式和无状态 lambda 表达式有什么区别?

    根据 OCP 一书 必须避免有状态操作 也称为有状态 lambda 表达式 书中提供的定义是 有状态 lambda 表达式是一种其结果取决于管道执行期间可能更改的任何状态的表达式 他们提供了一个示例 其中使用并行流将固定的数字集合添加到同步
  • Android 视频不适合视频视图纵向的宽度并且横向不占据全屏

    Android 视频在纵向时不适合视频视图的宽度 如何使视频的宽度在纵向时适合视频视图的宽度 当我将屏幕方向更改为横向时 我希望视频填充像 YouTube 应用程序一样全屏 当处于纵向时 视频将从屏幕的顶部到中间开始 而当处于横向时 视频将
  • 如何在OnRender中重绘或刷新?

    我想动态地画一些东西 以下代码显示了我的 OnRender 我正在程序中需要的地方设置 DrawItem 但当我打电话时DrawItem 5 我必须调用什么才能调用 OnRender protected override void OnRe
  • ipywidgets:根据另一个小部件的结果更新一个小部件

    我在 IPython 中使用小部件 它允许用户重复搜索短语并在另一个小部件 选择小部件 中查看结果 不同的标题 然后选择其中一个结果 简而言之 search text widgets Text description Search sear
  • FOSUserBundle:删除 emailCanonical 的唯一索引

    我正在尝试删除 emailCanonical 上的唯一索引 以便多个用户可以共享相同的电子邮件地址 但是 我不想直接编辑 FOS UserBundle Resources config doctrine User orm xml 因为对包本
  • 在路径或正文中发布参数

    我正在创建 Rest API 但我对 URL 结构感到困惑 我只需在 Post 请求中向服务器发送一个参数 我应该通过路径变量还是在请求正文中发送它 最佳做法是什么 当前 URL 示例 api v1 users id name name n
  • Android BroadcastReceiver,设备重启后自动运行服务

    您好 我正在编写一个应用程序 当手机重新启动时 该服务将自动启动 而不是单击该应用程序 这是我的代码 BootCompleteReceiver java package com example newbootservice import a
  • Swift - 带图像的自定义 MKPointAnnotation

    我正在尝试创建一个自定义MKPointAnnotation在地图视图上使用 它看起来非常像苹果照片中使用的那个 我将从服务器检索一些照片及其位置 然后我想显示一个像上面这样的注释 并在注释中包含图像 我目前有一个程序可以添加正常的MKPoi