setRegion:(MKCoordinateRegion)region animated:(BOOL)animated; 2.在地图上添加一个大头针 - (void)addAnnotation:(id <MKAnnotation - (nullable MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation > 140 || longitude > 140) { // return; // } } ---- 1、自定义系统类型大头针 (MKPinAnnotationView),使用的MKAnnotation 大头针模型,只能改变大头针颜色,标题、子标题等属性 2、完全自定义大头针模型:创建一个模型类继承于NSObject,遵守协议 <MKAnnotation>,.h 选择设置以下属性,注意去掉readonly ,其它属性如image可自定义 MKAnnotation 大头针模型类 (1)经纬度,必须设置的属性 @property (nonatomic) CLLocationCoordinate2D coordinate
一、先来认识一个协议MKAnnotation 官方文档告诉我们,所有标注的类必须遵守这个协议。所以可以了解,标注这个概念在逻辑属性和视图上是分开的。 先来看下这个协议声明了哪些方法: @protocol MKAnnotation <NSObject> @property (nonatomic, readonly) CLLocationCoordinate2D ,我们可以重写这个方法进行大头针的重绘,来更改其颜色: -(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation animatesDrop; 设置添加时是否显示降落动画 三、自定义标注视图 -(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation
目标:在地图上加上标记 同时复习一下手势的使用 效果图: 具体代码 导入框架:MapKit.framework 创建一个新类 继承NSObject 叫做MyAnnotation 并在后边加上<MKAnnotation > #import <Foundation/Foundation.h> #import <MapKit/MapKit.h> @interface MyAnnotation : NSObject<MKAnnotation pragma mark-mapView的代理方法-显示标识的方法 -(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation
animated:YES]; 5.大头针 钉在某个具体位置,用来标识这个位置上有特定的事物(比如这个位置上有家餐馆) ①大头针的基本操作 // 添加一个大头针 - (void)addAnnotation:(id <MKAnnotation // 添加多个大头针 - (void)addAnnotations:(NSArray *)annotations; // 移除一个大头针 - (void)removeAnnotation:(id <MKAnnotation * * @return 大头针的view */ - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation MKAnnotationView // 每次添加大头针就会调用此方法 - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation initWithAnnotation:nil reuseIdentifier:identifier]; } return annoView; } //- (void)setAnnotation:(id<MKAnnotation
这个类使用(符合)MKAnnotation协议。 MKAnnotation包含了多个属性,如:位置(经纬度,CLLocationCoordinate2D类型)、文字标记信息(NSString类型)等。 的一个特别案例(因为MKAnnotation可以是地图上的任何标记,而MKUserLocation只是标记了地图上手机所在的当前位置)。 addAnnotation:myPoint]; } - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation - (nullable MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
readonly, getter=isUserLocationVisible) BOOL userLocationVisible; 获取用户位置是否可见 - (void)addAnnotation:(id <MKAnnotation 在地图上添加一个标注 - (void)addAnnotations:(NSArray *)annotations; 在地图上添加一组标注 - (void)removeAnnotation:(id <MKAnnotation dequeueReusableAnnotationViewWithIdentifier:(NSString *)identifier; 获取复用的标注 - (void)selectAnnotation:(id <MKAnnotation >)annotation animated:(BOOL)animated; 选中一个标注 - (void)deselectAnnotation:(id <MKAnnotation>)annotation NSError *)error; 地图加载失败时执行的方法 - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation
点击屏幕,可以添加标注 说明:添加标注分三步 创建标注模型 重写地图的代理方法,返回标注的样式 将标注添加到地图 代码 标注模型 @interface MyAnnotation : NSObject <MKAnnotation addAnnotation:annotation]; } -(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation ,自定义标注的样式 代码:只需要更改上面的代理方法即可 -(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation
file #import <Foundation/Foundation.h> #import <MAPkit/Mapkit.h> @interface myAnnotation : NSObject <MKAnnotation
一、线路导航 1、从几个类的关系说起 (1)MKPlacemark 一个地点信息类,如下: @interface MKPlacemark : CLPlacemark <MKAnnotation> //初始化方法 return renderer; } //标注的代理方法 -(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation
当一个类继承NSObject,那么这个类里面的属性需要使用copy,比如: #import <Foundation/Foundation.h> #import <MapKit/MKAnnotation.h > @interface Annotation : NSObject <MKAnnotation> { CLLocationCoordinate2D coordinate;
} } 最后我们梳理一下关于大头针的几个类,我们在项目中使用的是 MKPointAnnotation MKPointAnnotation 继承与 MKShape 遵守了 MKAnnotation 协议 , MKAnnotation 就是底层的协议了,像它里面的title,image这些属性我们就不提了,大家可以点进去看看源码。 它具体的方法可以点进这个协议去看,里面有个方法是 - (nullable MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation >)annotation; 它返回的是一个 MKAnnotationView ,这个方法也为每个 大头针 MKAnnotation 提供了一个自定义的View,也就是我们自定义大头针的位置。
2.编写标注类,标注类必须实现MKAnnotation协议,MyAnnotation.h中的代码如下: ?
创建模型 class MapFlag: NSObject, MKAnnotation { // 标题 let title: String? extension ViewController: MKMapViewDelegate { func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation extension ViewController: MKMapViewDelegate { func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation
]; } #pragma mark - 返回大头针 - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation WWView *_shawView; CGFloat _preWidth; CGFloat scale; } - (instancetype)initWithAnnotation:(id<MKAnnotation
} } 自定义大头针 当前位置使用标注 其他位置使用自定义的大头针视图 //当前位置大头针 - (MKPinAnnotationView*)customLocalAnnotationView:(id<MKAnnotation pinView.animatesDrop = YES; return pinView; } //自定义大头针 - (MKAnnotationView*)customMKAnnotationView:(id<MKAnnotation
import MapKit import Combine class TripMapViewPresenter: ObservableObject { @Published var pins: [MKAnnotation MapView.swift import SwiftUI import MapKit struct MapView: UIViewRepresentable { var pins: [MKAnnotation lineRenderer.lineWidth = 3 return lineRenderer } } } fileprivate class CoordinateWrapper: NSObject, MKAnnotation
然后你有一个模块是地图模块,把经纬度数组全部都转变成MKAnnotation或其派生类对于Controller来说是弱业务,(记住,胖Model就是用来做弱业务的),因此我们用ViewModel直接把它转变成 MKAnnotation的NSArray,交给Controller之后Controller直接就可以用了。 APIManager fetchDataWithReformer:reformer] | | | MKAnnotationList | | | Controller 这么一来,原本复杂的MKAnnotation Reformer此时扮演的ViewModel角色能够很好地给Controller减负,同时,维护成本也大大降低,经过reformer产出的永远都是MKAnnotation,Controller可以直接拿来使用
import MapKit import Combine class TripMapViewPresenter: ObservableObject { @Published var pins: [MKAnnotation
比如地图标点列表API的数据,通过reformer转化之后就可以直接变成MKAnnotation,然后MKMapView就可以直接使用了。