美文网首页业务方案程序员
iOS MKMapView 苹果原生地图实现用户当前位置方向跟随

iOS MKMapView 苹果原生地图实现用户当前位置方向跟随

作者: iii余光 | 来源:发表于2018-05-06 21:46 被阅读0次

因为我们项目中是多地图模式的 之前产品看到别的地图上有用户位置指向角 我们苹果地图咋就没有捏
之后查看MKMapView API 确实没有把MKModernUserLocationView暴露出来给开发者使用 所以只好自己写一个贴在上面啦

先看效果
用户当前位置

实现

.h文件

#import <UIKit/UIKit.h>

@interface LHUserLocationHeadingView : UIView

- (void)startUpdatingHeading;

- (void)stopUpdatingHeading;

@end

.m文件

#import "LHUserLocationHeadingView.h"
#import <CoreLocation/CoreLocation.h>

@interface LHUserLocationHeadingView()<CLLocationManagerDelegate>

@property (nonatomic, strong) UIImageView *arrowImageView;

@property (nonatomic, strong) CLLocationManager *locationManager;

@end

@implementation AAUserLocationHeadingView

- (instancetype)initWithFrame:(CGRect)frame{
    
    if (self = [super initWithFrame:frame]) {
        
        [self commonInit];
        
    }
    return self;
    
}

- (UIImageView *)arrowImageView
{
    if (_arrowImageView == nil) {
        _arrowImageView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"xz_loction_heading_arrow"]];
    }
    return _arrowImageView;
}

- (CLLocationManager *)locationManager
{
    if (_locationManager == nil) {
        _locationManager = [[CLLocationManager alloc]init];
        _locationManager.delegate = self;
    }
    return _locationManager;
}

- (void)commonInit{
    self.backgroundColor = [UIColor clearColor];
    self.arrowImageView.frame = self.frame;
    [self addSubview:self.arrowImageView];
    [self startUpdatingHeading];
}

- (void)startUpdatingHeading{
    [self.locationManager startUpdatingHeading];
}

- (void)stopUpdatingHeading{
    [self.locationManager stopUpdatingHeading];
}

#pragma mark -- CLLocationManagerDelegate
- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading
{
    if (newHeading.headingAccuracy < 0)  return;
    
    CLLocationDirection heading = newHeading.trueHeading > 0 ? newHeading.trueHeading : newHeading.magneticHeading;
    CGFloat rotation =  heading/180 * M_PI;
    self.arrowImageView.transform = CGAffineTransformMakeRotation(rotation);
}

使用

在Map初始化时会掉用这个代理方法 可以判断是否时Map的私有对象UserLocationView 添加自定义的View在其上 切图找设计要 或者你随便加一个看一下效果

- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray<MKAnnotationView *> *)views{
    
    if ([views.lastObject isKindOfClass:NSClassFromString(@"MKModernUserLocationView")]) {
        
        AAUserLocationHeadingView *headingView = [[AAUserLocationHeadingView alloc]initWithFrame:CGRectMake(0, 0, 36, 36)];
        headingView.center = CGPointMake(views.lastObject.width/2, views.lastObject.height / 2);
        headingView.tag = 312;
        if (![views.lastObject viewWithTag:312]) {
            [views.lastObject addSubview:headingView];
            _userHeadingView = headingView;
        }
        
    }  
}
//在Map不在屏幕显示时记得停止获取方向 进入时再开始
   [_userHeadingView startUpdatingHeading];
   [_userHeadingView stopUpdatingHeading];

//在跟随模式下记得隐藏 其他模式下显示
    _userHeadingView.hidden = YES;

相关文章

网友评论

  • iii余光:@2狗子你变了
    哈哈 多谢关注 嗯的遍历层级发现的 系统没有对外爆露api 你这种方式可以完全按照自己自定义的来 之前没选择自定义的原因是系统原有的locationView有一些很好的状态功能 比如GPS丢星时会变灰色 搜星时有波纹动画等等 看需求而定吧:relieved:
    iii余光:@2狗子你变了 good luck:wink:
    SAW_::joy: 对的,因为我们产品对这个标注UI上完全自定义效果,箭头、波纹啥的:mask:
  • SAW_:竟然还有这个隐藏的“ MKModernUserLocationView”。
    不过苹果有提供当前用户对应的标注MKAnnotation就是MKUserLocation这个类,我自定义当前用户定位点的做法是继承MKAnnotationView类自定义。
    - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
    {
    if ([annotation isKindOfClass:[MKUserLocation class]]) {
    static NSString *userLocationStyleReuseIndetifier = @"userLocationStyleReuseIndetifier";
    YTUserLocationAnnotationView *annotationView = (YTUserLocationAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:userLocationStyleReuseIndetifier];
    if (annotationView == nil) {
    annotationView = [[YTUserLocationAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:userLocationStyleReuseIndetifier];
    }
    .............
    return annotationView;
    }
    return nil;
    }

本文标题:iOS MKMapView 苹果原生地图实现用户当前位置方向跟随

本文链接:https://www.haomeiwen.com/subject/jnhprftx.html