ios 平滑移动view_IOS开发入门之iOS 平滑移动大头针视图 (类似滴滴和 UBER)

本文将带你了解IOS开发入门iOS 平滑移动大头针视图 (类似滴滴和 UBER),希望本文对大家学IOS有所帮助。

大家都知道,地图上的大头针视图如果想平滑的从一个坐标点移动到另一个坐标点,重新添加一个大头针是无法实现这种效果的,那样不会有一个移动效果,如果想达到类似滴滴车辆平滑移动效果,就必须在同一个大头针对象中改变它的坐标,大头针的视图方向也要根据新的角度改变他的视图角度.

我们这里新建一个LocationManager类用来获取用户的坐标,当然如果业务需求是服务器获取,实现思路类似,只是改变一下坐标点的获取方式.具体LocationManager单例的创建细节就不多说了,我们在获取到用户位置的回调里面添加一个通知

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations

{

CLLocation *location = locations.firstObject;

[[NSNotificationCenter defaultCenter] postNotificationName:kdidUpdateLocation object:location];

}

主要说说自定义大头针,大头针分MKAnnotationView用来显示大头针视图, 和MKAnnotation用来设置大头针的一些属性,可以简单的把它看成一个view - model的关系

如果需要自定义大头针, 需要遵守BKAnnotation协议,其中coordinate属性是必须实现的属性

@protocol MKAnnotation 

// Center latitude and longitude of the annotation view.

// The implementation of this property must be KVO compliant.

@property (nonatomic, readonly) CLLocationCoordinate2D coordinate;

@optional

// Title and subtitle for use by selection UI.

@property (nonatomic, readonly, copy, nullable) NSString *title;

@property (nonatomic, readonly, copy, nullable) NSString *subtitle;

// Called as a result of dragging an annotation view.

- (void)setCoordinate:(CLLocationCoordinate2D)newCoordinate NS_AVAILABLE(10_9, 4_0);

@end

在自定义的大头针里面我们添加几个自定义属性

@property (nonatomic, assign) MyAnnotationType type;

@property (nonatomic, assign) double angle;

@property (nonatomic, strong) MKAnnotationView *annotationView;

其中type是一个枚举类型,用来自定义大头针的类型,angle表示方向,用来显示大头针的方向

在 .m 文件中自定义几个内部属性

NSMutableArray *locations;

NSArray *moveArray;

BOOL movingOver;

NSInteger currentIndex;

UIImage *annnationImage;

在大头针的初始化方法中,监听定位通知,初始化保存定位的数组

- (instancetype)initWithType:(MyAnnotationType)type

coordinate:(CLLocationCoordinate2D)coordinate

angle:(double)angle {

if (self == [super init]) {

_type = type;

_coordinate = coordinate;

_angle = angle;

if (type == MyAnnotationTypeCar) {

[[NSNotificationCenter defaultCenter] addObserver:self                      selector:@selector(onNotifiedCurrentLocationUpdated:)                                name:kdidUpdateLocation

object:nil];

locations = [[NSMutableArray alloc] initWithCapacity:20];

movingOver = YES;

}

}

return self;

}

在监听的通知中, 我们保存获取到的定位对象,为了保证大头针的移动效果,我们需要在建一个移动的数组,这个移动数组保证有一定量的定位数据才开始移动动画效果,而定位数组只负责把所有获取到的定位对象保存下来

- (void)onNotifiedCurrentLocationUpdated:(NSNotification *)notification

{

if (notification.object) {

CLLocation *location = notification.object;

[locations addObject:location];

if (locations.count >= 5 && movingOver == YES) {

moveArray = [NSArray arrayWithArray:locations];

[locations removeAllObjects];

NSLog(@"----- moveArrayCount: %ld",moveArray.count);

NSLog(@"------beging moving -----");

currentIndex = 0;

movingOver = NO;

[self startMoving];

}

}

}

核心的移动大头针方法,使用递归的方式一次次的移动大头针,在移动数组全部使用后结束递归,等待新获取到的数组

- (void)startMoving

{

NSInteger index = currentIndex % moveArray.count;

CLLocation *newLocation = moveArray[index];

self.annotationView.image = [annnationImage zj_imageRotatedByAngle:newLocation.course];

CLLocation *currentLocation = [[CLLocation alloc] initWithLatitude:self.coordinate.latitude longitude:self.coordinate.longitude];

double distance = [newLocation distanceFromLocation:currentLocation];

double speed = newLocation.speed;

CLLocationCoordinate2D newCoordinate = newLocation.coordinate;

[UIView animateWithDuration:distance/speed animations:^{

self.coordinate = newCoordinate;

currentIndex ++;

} completion:^(BOOL finished) {

if (currentIndex == moveArray.count) {

movingOver = YES;

moveArray = nil;

} else {

[self startMoving];

}

}];

}

只能需要注意的几个细节,一个是大头针角度,在CLLocation对象里面是有一个角度属性和速度属性的,当然如果只有两个坐标点也是可以通过算法获取到的.

这里要用到的速度和两个坐标点的距离用来设定车辆移动动画的时间,这样可以保证车辆的移动速度是均匀的平滑的.

我们在每次动画后把创建的index + 1,然后和数组的count通过取余运算获取到下次递归数组使用的index

大头针的平滑移动,只需使用UIView动画简单的把新的坐标赋值给大头针即可实现.

项目 DEMO :https://github.com/ZeroJian/SmoothMovingAnnotation

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之IOS频道!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: DeskPins是一个实用的Windows工具,允许用户在Windows任务栏中将任何窗口顶置在其他窗口之上。以下是使用DeskPins的简单步骤: 1.首先,下载并安装DeskPins。您可以在DeskPins的官方网站或其他可信的软件下载网站上找到它,并按照安装指南进行安装。 2.安装完成后,启动DeskPins。在系统托盘或任务栏中,您会看到一个小图标(可能是大头针的图标)表示DeskPins正在运行。 3.现在,打开您要顶置在其他窗口之上的窗口。您可以打开浏览器、文档、媒体播放器等等。 4.将鼠标移动到您要顶置的窗口的标题栏或其他可拖动的区域。然后,按住“Ctrl”和“鼠标左键”不松开,将鼠标拖动到任务栏或系统托盘上的DeskPins图标上。 5.松开鼠标按钮,该窗口将被“大头针”标记。这意味着该窗口将始终保持在其他窗口之上。 6.如果您想取消顶置某个窗口,只需将鼠标拖动到任务栏或系统托盘中的DeskPins图标上,然后松开鼠标按钮。 7.除了使用鼠标,您还可以使用快捷键来顶置和取消顶置窗口。默认情况下,使用“Ctrl”+ “F12”可以进行快速顶置和取消顶置。 总的来说,DeskPins是一个简单而实用的工具,可以帮助您更好地组织您的桌面和任务,提高使用体验。希望这些简单的说明可以帮助您了解如何使用DeskPins。 ### 回答2: DeskPins是一款免费的窗口置顶工具,它可以帮助用户保持特定窗口始终置顶在其他应用程序之上。下面是使用DeskPins的方法。 首先,你需要下载和安装DeskPins软件,然后启动它。 当DeskPins运行时,你会注意到在系统托盘区域出现了一个小图标。单击这个图标,它会显示所有当前打开的窗口的列表。 接下来,选择你想要置顶的窗口。鼠标指针会变成一个图钉图标。 将鼠标指针移动到你想要置顶的窗口上,然后单击左键。该窗口现在会保持在顶部,无论你是否点击其他应用程序,它都会一直停留在那里。 如果你想要取消窗口的置顶状态,只需将鼠标指针移动到该窗口上,然后再次单击左键。窗口将恢复到正常的层次结构,并可以被其他窗口遮挡。 DeskPins还提供了一些其他选项和功能,如禁用窗口置顶选项和自启动选项。你可以通过右键单击系统托盘图标来访问这些选项。 总的来说,DeskPins是一个简单易用但功能强大的工具,可以帮助用户在需要时快速将窗口置顶,使其保持在屏幕顶部。 ### 回答3: DeskPins 是一种方便的桌面工具,可以让用户将任何应用程序窗口固定在屏幕上而不会被关闭或移动。以下是使用 DeskPins 的方法: 1. 下载和安装:首先,您需要从官方网站或其他可信来源下载 DeskPins 并按照安装程序的说明进行安装。 2. 启动和使用:在安装完成后,您可以在任务栏中找到 DeskPins 的图标。通过点击该图标,您可以启动 DeskPins。 3. 固定窗口:在启动 DeskPins 后,您可以看到鼠标指针变为一个大头针的形状。将其悬停在您想要固定的应用程序窗口上,并单击左键。这样,窗口就会被固定在桌面上,并且不会在其他操作或关闭窗口时移动。 4. 解除窗口固定:如果您想解除窗口的固定,只需将鼠标指针悬停在窗口上,并再次单击左键。窗口将不再固定在屏幕上,可以像平常一样进行操作。 5. 设置窗口规则:DeskPins 还允许用户设置窗口规则,来自动固定或解除固定窗口。通过右键单击 DeskPins 图标,并选择“Options”选项,您可以打开设置窗口。在这里,您可以定义特定应用程序的行为,例如窗口打开时是否自动固定、禁用固定等等。 总而言之,DeskPins 是一个简单而实用的工具,它允许用户轻松地将任何应用程序窗口固定在屏幕上,提高工作效率并优化桌面布局。不同于其他许多应用程序管理工具,DeskPins 不会改变窗口的大小或风格,只是简单地将它们固定在屏幕上。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值