HCMapInfoView 1.0.0

HCMapInfoView 1.0.0

测试已测试
语言语言 SwiftSwift
许可证 MIT
发布上次发布2017年10月
SwiftSwift 版本4.0
SPM支持 SPM

Hypercubesoft 维护。



  • Hypercubesoft

GitHub Logo

HCMapInfoView 是一个辅助库,它便于创建苹果地图的自定义信息视图。它还简化了创建大头针(标记视图)的过程。

GitHub Logo

安装

Podfile

CocoaPods 是 Objective-C 和 Swift 的依赖项管理器,它可以自动化并简化使用像 HCMapInfoView 这样的第三方库的过程。


要使用 CocoaPods 将 HCMapInfoView 集成到您的 Xcode 项目中,请在 Podfile 中指定它

target '<TargetName>' do
    use_frameworks!
    pod 'HCMapInfoView'
end

然后,运行以下命令

$ pod install

带源代码

如果您不希望使用 CocoaPods 作为依赖项管理器,可以手动将 HCMapInfoView 集成到您的项目中。只需下载存储库并将 Source/HCMapInfoView 文件夹包含在您的项目中。

使用方法

使用此库包括几个基本步骤

  1. 通过 CocoaPods 或手动将 HCMapInfoView 库添加到您的项目中。

    如果您已经使用 Podfile 安装了此库,请使用指令将 HCMapInfoView 库包含在您的项目中

    import HCMapInfoView
  2. 将 MKMapKit 添加到所需位置。

    将 MKMapKit 放入您的 .storyboard 或 .xib 文件中,并在适当的文件中为该 MKMapKit 实例创建输出。

    @IBOutlet weak var mapView: MKMapView!

    您也可以以编程方式添加 MKMapKit 实例。

  3. 准备自定义信息视图

    执行此步骤意味着创建自定义信息视图,当用户在地图上选择一个标记时应该显示这些视图。在这方面,您必须

    • 从 HCAnnotation 派生出来,并为显示自定义信息视图创建这些子类。实际上,您可以使用原始形式的 HCAnnotation,但在这种情况下,您只能将注释视图标题和副标题作为属性使用。
    • 为了创建自定义信息视图,并创建当用户选择标记时将显示的 UIView,您需要从 HCMapInfoView 派生新的类。否则,您还需要在 nib (xib) 文件中创建自定义 UIView。将您的 HCMapInfoView 子类定义为在 nib (xib) 文件中创建的此自定义 UIView 的类。使用此类的其中一个主要原因是此自定义视图将识别透明区域为空白区域,因此在此视图上的透明区域上的点击与在信息视图外部点击的效果相同,因此它将导致关闭信息视图。
  4. 在地图上添加标记。

    如果您只想在地图上添加一个简单的标记,它可以显示简单的叫出,则没有任何问题。但如果您想显示带有自定义信息视图的简单或自定义注释标记,您需要使用 HCAnnotation 而不是基本的 MKPointAnnotation。您还可以从 HCAnnotation 派生出自定义功能。以下是如何创建简单的 HCAnnotation 并将其添加到地图的示例

    mapView.addAnnotation(MKPointAnnotation(title: "School", subtitle: "Business school", coordinate: CLLocationCoordinate2D(latitude: 20.0, longitude: 100.0)))
  5. 实现 MKMapViewDelegate 方法并为每个标记(MKAnnotationView)创建视图

    为了在地图上显示引脚并显示针对这些引脚的定制信息视图,您需要实现基本的MKMapViewDelegate方法。对于创建可显示自定义信息视图的引脚,您只需实现创建标注视图的MKMapViewDelegate方法。


    如果您想要创建一个仅显示简单呼出信息的简单引脚,您可以使用HCPinAnnotationView类及其hcCreateDefaultPin静态方法作为创建的快捷方式,如下所示示例代码

     func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? 
     {
         ///...
         return HCPinAnnotationView.hcCreateDefaultPin(forMap: mapView, forAnnotation: annotation, withReuseIdentifier: "BasicMapPin")
         ///...
     }

    如果您需要创建一个可以显示自定义信息视图的简单引脚,您可以使用相同的方法,但需要额外的参数来定义自定义地图信息视图的类和nib名称,如下所示示例代码

    func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? 
    {
        //...
        return HCPinAnnotationView.hcCreateDefaultPin(forMap: mapView, forAnnotation: annotation, withPinColor: UIColor.hcColorWithHex("389E13"), withReuseIdentifier: "GreenMapPin", withClass: MapInfoGreenView.self, mapInfoViewName: "MapInfoGreenView", showInfoViewHandler: {infoView in
            if let greenView = infoView as? MapInfoGreenView
            {
                greenView.update(withAnnotation: singleAnnotation)
            }
        })
        //...
    }

    此外,如果您想显示具有自定义图片的引脚,该引脚可以显示呼出信息但不能显示自定义信息视图,您可以使用HCAnnotationView类及其静态hcCreatePin方法,如下所示示例代码

    func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? 
    {
        //...
        return HCAnnotationView.hcCreatePin(forMap: mapView, forAnnotation: annotation, withPinImage:#imageLiteral(resourceName: "blueMapPin"), withReuseIdentifier:"AnimalMapPin")
        //...
    }

    最后,如果您想要显示具有自定义图片的引脚,该引脚可以显示自定义信息视图,您可以使用相同的方法,但需要额外的参数来定义自定义地图信息视图的类和nib名称,如下所示示例代码

    func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? 
    {
        //...
        return HCAnnotationView.hcCreatePin(forMap: mapView, forAnnotation: annotation, withPinImage:#imageLiteral(resourceName: "blueMapPin"), withReuseIdentifier:"AnimalMapPin", withClass: MapInfoAnimalView.self, mapInfoViewName: "MapInfoAnimalView", showInfoViewHandler: {infoView in
                if let blueView = infoView as? MapInfoAnimalView
                {
                    blueView.update(withAnimal: animal)
                }
                        
            })
        //...
    }

在任何情况下,您都可以从该存储库下载并运行HCMapInfoView Sample项目。在这个项目中,有一个示例用法,您可以从中了解如何使用此库。此外,此库中的每个属性和方法都有很好的文档,因此您将理解每个类、扩展、属性、方法或方法参数的含义和目的。

HCMapInfoView基本方法的简要预览

为了更好地理解如何使用此库,以下是基本HCMapInfoView方法的简要概述。在众多方法中,此库最重要的方法是

  • 创建默认引脚的方法
  • 创建带有自定义图片的引脚的方法

创建默认引脚的方法

/// Create default map pin, i.e. MKPinAnnotationView instance
///
/// - Parameters:
///   - map: Reference to MKMapView instance where the pin has to be placed.
///   - annotation: Annotation for which we need to create pin.
///   - pinColor: Pin color. The default value is red color (default system color).
///   - reuseIdentifier: Reuse identifier for annotation view.
///   - showCallout: Defines if callout or custom info view should be shown when annotation view is selected.
///   - mapInfoViewClass: Class which defines HCMapInfoView subclass for custom map info view.
///   - mapInfoViewNibName: Nib name for custom map info view.
///   - infoViewSize: Desired size for info view. If not defined, the view will use its size from the nib file.
///   - showInfoViewHandler: Handler for showing info view. The intention is to use this handler to update the generated view with desired data.
/// - Returns: Default pin, i.e. HCPinAnnotationView instance.
static func hcCreateDefaultPin<T:HCMapInfoView>(forMap map:MKMapView, forAnnotation annotation:MKAnnotation, withPinColor pinColor:UIColor? = nil, withReuseIdentifier reuseIdentifier:String, showCallout:Bool = true, withClass mapInfoViewClass:T.Type? = nil, mapInfoViewName mapInfoViewNibName:String? = nil, infoViewSize:CGSize? = nil, showInfoViewHandler:ShowInfoViewCompletionHandler? = nil) -> HCPinAnnotationView?

创建带有自定义图片的引脚的方法

/// Create custom map pin (annotation view)
///
/// - Parameters:
///   - map: Reference to MKMapView instance where the pin has to be placed.
///   - annotation: Annotation for which we need to create pin.
///   - pinImage: Pin image. If this parameter is not provided, default system pin will be used.
///   - pinCenterOffset: Position offset for custom pin (annotation view).
///   - reuseIdentifier: Reuse identifier for annotation view.
///   - showCallout: Defines if callout or custom info view should be shown when annotation view is selected.
///   - mapInfoViewClass: Class which defines HCMapInfoView subclass for custom map info view
///   - mapInfoViewNibName: Nib name for custom map info view.
///   - infoViewSize: Desired size for info view. If not defined, the view will use its size from the nib file.
///   - showInfoViewHandler: Handler for showing info view. The intention is to use this handler to update the generated view with desired data.
/// - Returns: Custom pin, i.e. custom map annotation (HCAnnotationView instance).
static func hcCreatePin<T:HCMapInfoView>(forMap map:MKMapView, forAnnotation annotation:MKAnnotation, withPinImage pinImage:UIImage? = nil, pinCenterOffset:CGPoint? = nil, withReuseIdentifier reuseIdentifier:String, showCallout:Bool = true, withClass mapInfoViewClass:T.Type? = nil, mapInfoViewName mapInfoViewNibName:String? = nil, infoViewSize:CGSize? = nil, showInfoViewHandler:ShowInfoViewCompletionHandler? = nil) -> HCAnnotationView?

注意事项

如果未按照实现步骤操作,即如果您尝试基于此库自行实现,可能无法使用大部分功能,因为此库中的自定义类互相依赖。

如果发现任何bug,请报告,我们将尽快修复。也欢迎提出建议。

致谢

HCMapInfoViewHypercube拥有和维护。