Swift:MKAnnotation 长标题文本

2024-04-16

我有很长的 MKannotationView 标题文本。有没有一种简单的方法可以使标题中的文本大小合适?

reuseId = "Pin"
        var pinView = mapView.dequeueReusableAnnotationViewWithIdentifier(reuseId)
        pinView = MKAnnotationView(annotation: annotation, reuseIdentifier: reuseId)
        pinView!.image = UIImage(named:"pin")
        pinView?.canShowCallout = true
        pinView?.annotation
        let button : UIButton = UIButton(type: UIButtonType.DetailDisclosure)
        button.setImage(UIImage(named: "pin_arrow")?.imageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal), forState:UIControlState.Normal)
        pinView!.rightCalloutAccessoryView = button

        let vw: UIView = UIView(frame: CGRectMake(0, 0, 40, 50))
        let label: UILabel = UILabel(frame: CGRectMake(10, 0, 40, 50))
        label.font = UIFont.init(name: "Roboto-Bold", size: 20)
        label.textColor = UIColor(red:17/255.0, green:97/255.0, blue:172/255.0, alpha: 1.0)
        label.numberOfLines = 1
        for myObj in arrOfPinsOnMap where myObj.coordinate.latitude == pinView!.annotation!.coordinate.latitude && myObj.coordinate.longitude == pinView!.annotation!.coordinate.longitude && myObj.title == (pinView?.annotation?.title)!{
            label.text = myObj.sale
            if(myObj.sale != ""){
                vw.addSubview(label)
                if(label.text!.characters.count == 2){
                    vw.frame.size.width = 35
                    label.frame.size.width = 35
                } else if(label.text!.characters.count == 3){
                    vw.frame.size.width = 47
                    label.frame.size.width = 47
                } else if(label.text!.characters.count == 4){
                    label.frame.size.width = 67
                    vw.frame.size.width = 67
                } else if(label.text!.characters.count > 4){
                    label.frame.size.width = 80
                    vw.frame.size.width = 80
                }

                pinView!.leftCalloutAccessoryView = vw
            }
        }

我有这种方法可以在点击引脚后显示视图。我可以调整左侧的标签大小,但标题保持固定大小。标题必须始终可见。


如您所知,标准 MapKit 标注有一个标题以及左右附件视图,您似乎已经发现标注的标题在截断之前可以显示的文本量有限,而我们没有似乎可以访问标签视图来更改它。

如果您能够以 iOS 9 及更高版本为目标,则还有一个额外的detailCalloutAccessoryView显示在标题下方。不幸的是,您不能只将标题留空并将所有文本放入详细视图中,因为这样点击时标注根本不会打开,因此您需要将某种文本放入标题中。

如果您无法让它工作或者您需要支持 iOS 8,那么您需要进行自定义标注。这并没有那么困难。创建一个MKAnnotationView具有您想要的标注外观的子类,然后当您检测到正在点击的标记时mapView(_:didSelectAnnotationView:)在与标记相同的位置添加特殊标注注释。

这是一种方法:

class MyAnnotation: NSObject, MKAnnotation
{
    var coordinate: CLLocationCoordinate2D = CLLocationCoordinate2D(latitude: 49.5, longitude: -123.0)
    var title: String? = " "
}

class CalloutAnnotation: MyAnnotation { } // Special annotation class for the callout

let calloutRect = CGRect(origin: CGPointZero, size: CGSize(width: 200, height: 100))

class CalloutAnnotationView: MKAnnotationView
{
    var label: UILabel

    init()
    {
        label = UILabel(frame: CGRectInset(calloutRect, 8.0, 8.0))
        label.textAlignment = .Center
        label.numberOfLines = 0

        super.init(frame: calloutRect)

        self.addSubview(label)
        self.backgroundColor = UIColor.whiteColor()
        self.centerOffset = CGPoint(x: 0.0, y: -(calloutRect.size.height / 2))
        self.layer.cornerRadius = 6.0
    }

    required init?(coder aDecoder: NSCoder)
    {
        label = UILabel(frame: CGRectInset(calloutRect, 8.0, 8.0))
        super.init(coder: aDecoder)
    }
}

class ViewController: UIViewController, MKMapViewDelegate
{
    let calloutAnnotation = CalloutAnnotation()

    @IBOutlet weak var mapView: MKMapView!

    override func viewWillAppear(animated: Bool)
    {
        super.viewWillAppear(animated)
        mapView.addAnnotation(MyAnnotation())
    }

    func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView?
    {
        if annotation is CalloutAnnotation
        {
            let calloutView = CalloutAnnotationView()
            calloutView.label.text = "This is a custom callout that can look however you want."
            return calloutView
        }
        else
        {
            let reuseIdentifier = "pinView"
            let pinView = mapView.dequeueReusableAnnotationViewWithIdentifier(reuseIdentifier) ??
                          MKAnnotationView(annotation: annotation, reuseIdentifier: reuseIdentifier)

            pinView.image = UIImage(named: "Pin")
            pinView.canShowCallout = false

            return pinView
        }
    }

    func mapView(mapView: MKMapView, didSelectAnnotationView view: MKAnnotationView)
    {
        if let coordinate = view.annotation?.coordinate
        {
            calloutAnnotation.coordinate = coordinate
            mapView.addAnnotation(calloutAnnotation)
        }
    }

    func mapView(mapView: MKMapView, didDeselectAnnotationView view: MKAnnotationView)
    {
        mapView.removeAnnotation(calloutAnnotation)
    }
}

该视图只是一个常规视图,可以响应触摸等。这仍然不完美,因为当标注出现时您会丢失“弹出”动画,但如果需要,您可以通过更多工作将其添加回来。我还没有尝试过,但我确实在某一时刻出现了动画淡入淡出的情况,所以我相当确定这是可能的。

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

Swift:MKAnnotation 长标题文本 的相关文章

  • Swift Firebase - 如何在使用 queryOrdered(byChild: ).queryEqual(toValue: ) 时获取所有 k/v

    root reviews postABC postId reviewXYZ I want everything under this reviewUID buyerUID 01010 text fast shipping responseT
  • 解包可选值时意外发现 nil - 使用 ALAMOFIRE

    我正在尝试使用 Alamofire 获取 JSON 格式的数据 当我使用一个 URL 时 它工作正常 当我使用另一个 URL 时 我在解包可选值时收到错误 我似乎无法追踪错误来自哪里 我已采取将代码放入 ViewDidLoad 来跟踪错误
  • 如何快速从解析中加载图像?

    我想知道是否有人可以帮助我 我是应用程序开发的新手 我正在从我的应用程序上传图像以在解析文档的帮助下毫无问题地进行解析 let imageData UIImagePNGRepresentation scaledImage let image
  • 从 AVAudioRecorder 获取分贝

    我正在尝试从 AVAudio 录音机获取分贝值 这是我目前的代码 我有一个启动录音机的方法 然后是一个读取分贝值的方法 var recorder AVAudioRecorder 全局定义的记录器 然后在此处使用 func init reco
  • 如何读取 Xcode 6.1 Instruments .trace 文件?

    我一直在尝试阅读 trace文件 我使用生成的custom仪器模板 仪器 自动机 分配 Leaks using 仪器 https developer apple com library mac documentation Developer
  • 在 SwiftUI 中,如何执行手势但将手势转发到其后面的视图?

    我正在创建一个工具提示系统 如果用户触摸工具提示之外的任何地方 我想关闭工具提示 我希望这样在工具提示之外的触摸既可以消除工具提示 又可以激活用户点击的任何控件 因此 您可以打开一个工具提示 然后仍然单击工具提示外部的按钮 并在第一次点击时
  • 使用 Swift 创建 NSAlert

    我有在 Objective C 中创建和 NSAlert 的代码 但我现在想在 Swift 中创建它 该警报旨在确认用户想要删除文档 我想要 删除 按钮来运行删除功能 而 取消 按钮只是为了消除警报 我怎样才能用 Swift 写这个 NSA
  • swift 中闭包和函数作为参数的区别

    我有将近 4 年的 Objective C 经验 并且是 swift 的新手 我试图从 Objective C 的角度理解 swift 的概念 所以如果我错了 请指导我 在目标 c 中 我们有块 可以稍后异步执行的代码块 这绝对是完全合理的
  • ExpandableLabel iOS 中的“少看”

    我正在使用第三方库可扩展标签 https github com apploft ExpandableLabel实施一个see more特征 我正在寻找仅快速的解决方案 其中包含标签中的文本而不是按钮中的文本 因此这可以完美地工作 添加库并更
  • Audiokit 修剪音频

    我正在制作音频编辑应用程序 我想修剪我的音频 对于音频编辑 我使用 AudioKit 框架 但我在教程和示例中找不到如何使用此框架修剪音频 异步导出允许设置开始和结束样本 https github com AudioKit AudioKit
  • ArraySlice 中的 Swift [重复]

    这个问题在这里已经有答案了 在数组上使用 prefix 方法后 我得到了所谓的 arraySlice 我怎样才能将其转换为数组 我试图从 FacebookGraphApi 获取 Ints 然后请求前 3 个 前缀 3 并尝试将它们添加到新数
  • 如何无限地每1分钟运行一个iOS应用程序?

    我制作了一个应用程序 需要每 1 分钟向服务器发送一次位置和状态更新 我尝试了以下方法 但没有一个能帮助我 有什么解决办法吗 1 NSTimer 很多人建议这样做 但问题出在后台模式上 它只能工作 20 分钟 该应用程序停止发送数据后 2
  • ios Vision VNImageRequestHandler方向问题

    我正在尝试使用相机通过相机检测脸部VNImageRequestHandler iOS 愿景 当我在横向模式下用相机指向照片时 它会检测到面部 但方向模式相反 let detectFaceRequestHandler VNImageReque
  • 快速钥匙串更新只有在第二次尝试时才起作用

    您好 我在更新存储在钥匙串中的登录信息方面遇到了 iOS 钥匙串的一个非常奇怪的问题 因此 如果没有保存的凭据 则正确运行保存函数会保存登录信息 如果登录信息已存在并且用户更新了密码 则更新功能仅正确更新密码 但是 如果登录信息存在并且我尝
  • iOS 13 检查 CLLocationManager 的临时授权状态

    根据 WWDC 视频 https developer apple com videos play wwdc2019 705 https developer apple com videos play wwdc2019 705 当你要求 Al
  • UITesting、XCTest 当前 ViewController 类

    简单的问题 我有一个按钮可以执行到下一个视图控制器的操作 我想写 UI XCTest 来告诉我它是否打开了我想要的视图控制器 UI 测试框架无法访问您的应用程序代码 这使得无法对实例进行类断言 你不能够directly告诉屏幕上的控制器的类
  • 在 UITableViewController 中重新排序行后 UI 更新不正确

    因此 我对表中的行重新排序 用户界面最终结果不正确 场景如下 表内容原文 a b c d e 如果我移动第 0 行 当前a 到第 4 行 当前e 我看到的最终结果是 c d e a a 一些背景 该表正在读取 Realm 对象的列表 我确认
  • 使用 BGTaskScheduler 进行后台获取与调试模拟完美配合,但在实践中却不起作用

    我在 appDelegate 的 didFinishLaunchingWithOptions 中注册后台获取任务 BGTaskScheduler shared register forTaskWithIdentifier Backgroun
  • 循环多个 UIAlertController

    在某些情况下 我的应用程序需要显示多个警报消息 错误消息在启动时收集 并且需要一次向用户显示一条 当第一个被确认后 应该呈现下一个 问题在于 显然 它们都试图同时执行 有没有一种聪明的方法可以同步执行此操作 这是一些简单描述我想要做的事情的
  • 在 Swift 中以编程方式为 iOS 制作带有名字首字母的图像,例如 Gmail

    我需要在 UITableView 中显示与其姓名相对应的每个用户的个人资料图片 在下载图像之前 我需要显示一张带有他名字的第一个字母的图像 就像在 GMail 应用程序中一样 如何在 Swift for iOS 中以编程方式执行此操作 不需

随机推荐