DBMapSelectorViewController 1.2.2

DBMapSelectorViewController 1.2.2

测试已测试
语言语言 Obj-CObjective C
许可证 MIT
发布最后发布2016年7月

Denis Bogatyrev 维护。



  • Denis Bogatyrev

此组件允许您从 MKMapView 中选择圆形地图区域。

Screenshot of Example

添加到您的项目

源文件

要将 DBMapSelectorViewController 手动添加到您的项目中

  1. 使用 git clone 下载最新代码
  2. 在 Xcode 中打开您的项目,然后将 Source 文件夹的整个内容拖到您的项目中(确保在从项目外部提取代码存档时选择复制项目)

使用方法

要在您的项目中使用 DBMapSelectorViewController,您应执行以下步骤

  1. 在您的 UIViewController 子类中导入 DBMapSelectorManager.h。您的类必须包含 MKMapView 实例,并作为其代理。
  2. 在类实现中创建 DBMapSelectorManager 类的实例。在初始化方法中指定 mapView 实例。如有必要,将您的类分配为 mapSelectorManager 的代理。
  3. 初始化后,设置初始地图选择器设置(中心点半径)并应用设置。
  4. 由 MapSelectorManager 实例通过 mapView 代理发送以下消息。
...
// (1)
#import "DBMapSelectorManager.h"

@interface ViewController () <DBMapSelectorManagerDelegate>
@property (nonatomic, strong) DBMapSelectorManager *mapSelectorManager;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    // (2)
    self.mapSelectorManager = [[DBMapSelectorManager alloc] initWithMapView:self.mapView];
    self.mapSelectorManager.delegate = self;

    // (3)
    self.mapSelectorManager.circleCoordinate = CLLocationCoordinate2DMake(55.75399400, 37.62209300);
    self.mapSelectorManager.circleRadius = 3000;
    [self.mapSelectorManager applySelectorSettings];
}

...

// (4)
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation {
    return [self.mapSelectorManager mapView:mapView viewForAnnotation:annotation];
}

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)annotationView didChangeDragState:(MKAnnotationViewDragState)newState fromOldState:(MKAnnotationViewDragState)oldState {
    [self.mapSelectorManager mapView:mapView annotationView:annotationView didChangeDragState:newState fromOldState:oldState];
}

- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id <MKOverlay>)overlay {
    return [self.mapSelectorManager mapView:mapView rendererForOverlay:overlay];
}

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated {
    [self.mapSelectorManager mapView:mapView regionDidChangeAnimated:animated];
}

@end

属性列表选择器

您可以更改额外的 MapSelector 属性。完整的属性列表如下所示

  • DBMapSelectorEditingType editingType - 用于指定选择器编辑类型。属性可以是以下四个值之一
    • DBMapSelectorEditingTypeFull 允许编辑坐标和半径,
    • DBMapSelectorEditingTypeCoordinateOnly 允许仅编辑坐标,
    • DBMapSelectorEditingTypeRadiusOnly 允许仅编辑半径,
    • DBMapSelectorEditingTypeNone 只读模式;
  • CLLocationCoordinate2D circleCoordinate - 用于指定选择器坐标;
  • CLLocationDistance circleRadius - 用于指定选择器半径。默认为 1000 米;
  • CLLocationDistance circleRadiusMin - 用于指定选择器的最小半径。默认为 100 米;
  • CLLocationDistance circleRadiusMax - 用于指定选择器的最大半径。默认为 10000 米;
  • BOOL hidden - 用于隐藏或显示选择器。默认为 NO;
  • BOOL fillInside - 用于在内部或外部填充之间切换;
  • UIColor *fillColor - 用于指定选择器填充颜色。颜色用于填充圆形地图区域;
  • UIColor *strokeColor - 用来指定选择器边框的颜色。颜色用于定义圆形地图区域;
  • CGFloat mapRegionCoef - 用来指定地图区域放大因子。此参数会影响选择器设置改变后地图区域的显示。建议设置一个大于1.f的值;
  • BOOL shouldShowRadiusText - 表示是否显示半径文本;
  • BOOL shouldLongPressGesture - 允许通过长按手势将选择器移动到新位置。

DBMapSelectorManagerDelegate

要能够在选择器的主要属性(坐标和半径)发生改变时做出反应,您必须成为DBMapSelectorManager的代理。在这里可以看到DBMapSelectorManagerDelegate协议;

@protocol DBMapSelectorManagerDelegate <NSObject>

@optional
- (void)mapSelectorManager:(DBMapSelectorManager *)mapSelectorManager didChangeCoordinate:(CLLocationCoordinate2D)coordinate;
- (void)mapSelectorManager:(DBMapSelectorManager *)mapSelectorManager didChangeRadius:(CLLocationDistance)radius;
- (void)mapSelectorManagerWillBeginHandlingUserInteraction:(DBMapSelectorManager *)mapSelectorManager;
- (void)mapSelectorManagerDidHandleUserInteraction:(DBMapSelectorManager *)mapSelectorManager;

@end

您可以在您的《MyViewController》类中实现这些方法以对这些更改做出反应。例如,以下是如何实现的方法

- (void)mapSelectorManager:(DBMapSelectorManager *)mapSelectorManager didChangeCoordinate:(CLLocationCoordinate2D)coordinate {
    _coordinateLabel.text = [NSString stringWithFormat:@"Coordinate = {%.5f, %.5f}", coordinate.latitude, coordinate.longitude];
}

- (void)mapSelectorManager:(DBMapSelectorManager *)mapSelectorManager didChangeRadius:(CLLocationDistance)radius {
    NSString *radiusStr = (radius >= 1000) ? [NSString stringWithFormat:@"%.1f km", radius * .001f] : [NSString stringWithFormat:@"%.0f m", radius];
    _radiusLabel.text = [@"Radius = " stringByAppendingString:radiusStr];
}

版本历史

1.2.2

  • 通过代码优化提高渲染速度
  • 其他优化

1.2.1

  • 新增属性 BOOL shouldLongPressGesture。允许通过长按手势将选择器移动到新位置。
  • 新增属性 CGFloat mapRegionCoef。在改变选择器设置后,用于地图区域的放大因子。建议设置一个大于1.f的值。
  • 改进了首次显示地图控制器后的绘制选择器。解决了有时在第一次加载后切割圆的问题。

1.2.0

  • DBMapSelectorViewController被DBMapSelectorManager取代。此更改使得此组件提供的功能更容易集成到现有项目中,例如,目标视图控制器已经继承了另一个自定义视图控制器。感谢Marcelo Schroeder提供的解决方案。
  • 改善了移动地图选择器的用户体验。
  • 修复了在某些情况下确定缩放按钮位置不正确的问题。

1.1.0

  • 新增了“圆形外”模式。

联系信息

Denis Bogatyrev(维护者)

许可协议

DBMapSelectorViewController - 版权所有 (c) 2015 Denis Bogatyrev

任何人未经许可,免费获得本软件和相关的文档副本(“软件”),都可以根据以下条件在软件上取得专有使用权,包括但不限于使用、复制、修改、合并、发布、分发、再许可、出售软件副本,并允许软件的提供者进行上述行为,前提是

上述版权声明和本许可声明应包含在软件的任何副本或主要部分。

软件按“现状”提供,不提供任何形式,明示或暗示的保证,包括但不限于适销性、适用于特定目的和非侵权性保证。在任何事件中,包括但不限于合同、侵权或其他行为,作者或版权所有者均不对任何索赔、损害或其他责任负责,无论是否存在软件或软件的使用或与之相关的任何行为。