前言
朋友们 ,
您好 ,一开始,我将立即概述本文的目的:如果您需要在iOS移动客户端中
更新或嵌入Yandex地图 ,可以
节省您的时间 ,并希望分享您的经验。
我们曾经内置了YandexMapkit应用程序(大约在2017年10月),而不是电子邮件卡(不是私人的,只是生意)。 大约3个月后,在一个美丽的冬季,由于钥匙的原因,Androyd版本的卡片在第2天就失灵了,卡片变成了南瓜。手册上的小贴士是:“在android上,卡片坏了,他们不知道如何解决”作为iOS客户端,这没有影响。 android上的可怜的家伙们……这次,这些家伙们与他们无关。 在那个
年代,许多旅馆倒塌了 :俄罗斯的鸭嘴兽的职位,也许你们还记得吗?

这就是说,当您的应用程序与第三方服务绑定时,最好为这种情况制定一个计划“ B”,例如,从Apple切换到卡的先前版本,而不要用另一卡代替...
又过了三个月,三月的某个地方,Yandex发出了一封信,他们终于更新了sdk,(过去的更新已经过去了4-5年,时间很少):
简而言之,“-Update,一年关闭一次旧的。” 在此之前,只有一个旧版本1.0

好吧,当然,在发出这样的警告之后,我们没有撤退,而是在8月份)立即开始了过渡……)。
“评论”阶段(禁用功能)
你说,哈...那里有什么更新,窗格已更新,更正了几个地方,仅此而已。 所以不,伙计们,新的地图API绝对与旧的API不兼容,而且,正如后来所证明的那样,旧版本和其他卡库中甚至还有很多重要的必需品!
因此,mapkit 3.0(在撰写文章版本3.1时发布)是
该文档的
链接 。
以及为什么除了Yandex的警告? 同时,在Xcode 10的beta版上,一个笨拙的老项目根本不会出现,因为C ++被用在内部某个地方,而新版本中没用。 有必要在子列表中重命名它,甚至在那里更新它,等等,总之,我没有这样做,因为最后我仍然需要更新
1)我们会立即更新sdk,而不是立即更新版本1.0,当然,API也发生了变化,但是....
因此,旧的YMKAnnotation协议完全丢失了

很快,它看起来像是伪造的strig(:并没有嗡嗡作响,然后您到自己身边拿一个“!”符号。协议实现示例:

好吧,让我们再写一次)我们自己的,我们将代替属性()来创建属性,一切都很简单,该方法是多余的; title!()替换为未格式化的title(),另一方面,您可以创建一个属性,那么,在很多地方都需要更改项目,因此我删除了感叹号。
在我们的项目中,有必要几次替换3个控制器,将CoreLocation导入另一个控制器,因为现在没有将其导入任何Yandex MapPocket标头中。
为了不重命名整个项目中熟悉的YMKMapCoordinate(旧鲸),请为YMKPoint(新鲸)制作类型别名。

2)另外,让我们声明一些将来使用地图所需的属性,主要是吸气剂:

3)首先要创建的是YMKMapView(一切正常,这样的对象仍然可用)。 以前,我立即对其进行了初始化,现在您无法执行此操作,它将崩溃,因为首先需要输入密钥! 当前密钥将不起作用,您需要请求一个新密钥。 根据文档添加到AppDelegate。 只有设置了密钥之后,我们才能创建YMKMapView并以setupMap()方法中所需的方式对其进行配置

这里发生了什么,我们将在以后进行适当设置的过程中详细分析
4)接下来是什么,然后我们有了CLLocation的初始位置,但是现在要使用它,您需要手动添加CoreLocation框架,或者...或从Yandex mapkit中将其替换为YMKPoint

5)此外,地图通过一种非常简单的方法以该坐标为中心,但是现在没有简单的方法了

但是地图对象稍微复杂一点,也更深入一些。mapView.mapWindow.map!.Move。 在这里,我们了解诸如YMKCameraPosition这样的对象的存在。

6)接下来,由于没有这样的api /属性,因此我们对地图配置进行评论。 现在我们只是忽略它,以便至少最少地开始。
我们评论添加注释,(我会注意这是标准功能),我们也评论显示最近的点(这已经是我们的某种功能)。
整个YMKMapViewDelegate也是注释,我在新框架中也没有找到,也有类似的注释。

我省略了实现,只是方法本身:
-是否显示用户的位置,
-用于引脚的视图,
-点击注解的反应,
-标注的标注,
-单击标注(即我们通常使用的所有标注)的反应。 最后,我们使用了某种方法,该方法也使用了特定的API卡。
MapVC可以解决所有问题-这是使用Mapkit的主要类
7)对自定义标注稍加评论,它将不再继承YMKCalloutView,新鲸也不再有。
Hurray,现在该项目已经完成,我能够启动所有内容,并且...看到了包装盒中的笔记本,因为在笔记本启动后,您需要花些时间来“热身”)),但我对此一无所知,并以为不是因此,尽管我建议激活密钥需要花费一些时间。 事实证明,这一假设是正确的。 您需要等待大约一个小时(也许现在已经改变了)。
再次尝试以新方式修改旧的api后,显示了地图。
第二阶段-“搜索”(如何以新方式实现旧功能)
让我们开始恢复丢失的功能。 因此,您需要显示用户锁,但是以旧方式只能更改属性并设置委托。
现在这是通过图层完成的,请参见setupMap()方法的第3点。
由于该示例已经存在,因此
我们将看一下该示例中的示例(
可从Yandex github下载 )。 顺便说一句,您需要注意setAnchorWith。 稍后我会说为什么,它与缩放有关。 确定位置。
2)接下来是什么,当然是注释。 您无法以旧的方式添加内容,我们将再次查看演示。 那里有一个类-MapObjectsViewController。 在新版本中,不需要在地图上添加图钉,就不需要委托,因此您需要访问mapObjects属性,在对象上调用addPlacemark方法,然后在该位置传递坐标(还有其他重载)。示例:

我们遍历注释的集合(例如,从服务器收到注释后),然后将其添加到地图中。 顺便说一句,该方法返回“ placeMark”(位置标签),可用于进行其他设置,例如,通过zIndex属性更改显示顺序。
但是,在这里,我错过了这样的观点:在此之前,我一直在寻找委托人,却没有安全地找到它,根本没有一个委托人(实际上,他们只是被不同地称呼了,现在他们是听众)。 从苹果鲸和旧的Yandex鲸的先前经验中我知道,注释可以重复使用,就像使用单元格一样,但是演示中仅包含addPlacemark。 对于有关Yandex卡的问题(这里有一个小小的熟人帮助),“-如何优化内存使用,重用对象?” 答案:“为什么,所以它可以正常工作”……好吧,是的,它可以工作。
注意:1)请务必注意,Yandex.Maps使用mapkit,而不开发它。 这是由地图套件团队完成的(尼古拉在枢纽上的昵称-likhogrud @)。
2)解释为什么不重用对象:
在旧的鲸鱼中,annotationViews是视图,它们是由用户创建的,当然,这些视图需要重用,因为创建它们并不便宜。 在新鲸中,地标由地图套件直接在开放式GL中创建。 也许它们在那里被重用,但这是不准确的。 无论如何,这比创建视图要有效得多。
3)顺便说一下,从新的版本开始,可以为用户修改注释图标。 实现如下:您需要添加一个侦听器(代理的模拟),实现适当的协议-3个方法中的1个,2个留空。
同时,使用我们的图标重新加载地标。

另外,我提请您注意锚点的属性。 按下用户在地图上的位置按钮后,相机会将焦点移到该位置的中心。 但麻烦的是,再次按下该操作不会产生。 什么啊 我们评论锚方法,一切正常。
4)现在您需要分别显示标注以计算点击次数。 接口中有几种方法,正确的一种是YMKMapObjectTapListener。 有一种重要的有趣方法,以后我不得不折磨自己,该方法返回true,以便在找到订户时不会进一步整合。 我引起您的注意,您需要首先订阅,mapObjects将被订阅(第149行)。


因此点击即可实现。
万岁 。 但是,仍然有尝试仅在可见区域中显示图钉,这是多余的,一次显示所有内容,所以让我们保留它(只是因为它不会减慢速度)
5)为了方便起见,我想使按钮放大/缩小。 进行一些复制粘贴,然后类似于“位置”按钮进行编辑,即可完成。
此外,由于我们了解照相机,因此可以根据需要使用move方法以及当前的+/- 1或0.5缩放。 这里一切都很好。

6)我们转到主要功能-标注(这是一个带有附加信息的矩形,底部是三角形)。 事实证明,没有API(“夏天醉人”-Yandex在阅读传单中的注释时识别了我的语音,以免手动键入本文)。

你们好吗? 100 500个应用程序使用标注。
我发现,我们在“技术支持”(科里亚)中写得很好,说明如何手动执行此操作。 您有什么选择?
将视图转换为图片,因为您不能直接添加视图 (在3.1中添加了文件),因此请更改图标...

这些拐杖是在平坦的地方获得的。
实际上,当然不是拐杖,而是我认为基本功能只是缺席
7)好的,我们首先添加一个测试标注,因此我们使用红色正方形。 因此,通过单击我们的图钉,将调用委托/侦听器方法,将点击点和对象转移到该方法。 不出所料,我们将“点”作为要添加标注的点。 (注意,一切是否正确完成:“他们单击,抓住了要点,把它绑起来了?”大约80%的回答正确,20%-否)

并在方法主体中调用showCallout helper方法:

544行
在内部,创建四十到四十的红色测试视图,将其转换为图片,声明值为0.5的常数x,它将用于标注三角形在该点中间的位置。 他拒绝更改位置的想法,后来更喜欢移动摄像头,以便在电话屏幕的中间显示所选的标注
接下来,我们声明tappableArea的“ push”区域,该图钉的图标样式中就有这样的属性。 哦,您可以限制点击区域,我们会做的。 区域范围从0.0到1.1。 我们需要下面的部分,据说这里有一个按钮被转换成图片(记住)。 好的,这是因为该按钮在下面,所以是区域(0,0.5-1.1)。
区域限制有效,但存在细微差别,因此它否定了一切。 如果在非按压区域下还有另一个图钉,则按一下即可。 这个区域的含义? 他们会做出标记或其他内容,以使点击不通过。 好吧...
550线
让我们为图标创建样式,您可以立即在第一个参数中指定锚点位置,例如,我在下面的第557行做的。 位置y为1.05,以使三角形再次垂直升至引脚上方
559线
创建一定尺寸的自定义标注,
我们使用来自所选注记selectedAnnotation的信息(尤其是标题和副标题,此标注的按钮上的题词)来配置所需的字段。 然后,您自己可以做您想做的事。 所选的批注在委托中更早定义。 但现在,添加之前创建的红色正方形
接下来,在mapObjects集合中添加一个图钉,该方法将向我们返回添加的地标,并将其保存在变量中,
通过单击标注本身,将打开一个详细的控制器,因此,如果在弹出窗口下输入了另一个图钉,则细微差别是,委托将再次起作用,因此此处您需要通过zIndex更改层次结构中的顺序。 设置可见性,并将标注移到第564行的中心
注意 :可变地标是指向标注的指针。
首先,我们没有它,在单击图钉之后,它会出现,在单击下一个图钉之后,我们需要删除第一个标注并添加一个新的标注。 因此,如果变量placemark!= Nil,则需要从mapObjects集合中删除旧的标注)

另外,在卡片上使用西班牙小吃时,您需要隐藏标注,因此在委托方法中,我们分配一个地标,观察者起作用,标注被删除,此外,我们清除选定的注释
为此,我们早些时候注册了YMKMapInputListener

反过来,用于转换视图的方法如下。 (在版本3.1中,添加了将视图添加到地图的功能)
我没有描述如何做视图),但是如果这样做会带来很多问题(可能是三角形),那么请写,我将添加这个阶段

在下面的三角形下面的某个地方需要添加到高度上的魔法20,您必须绘制该地方
我们还希望弹出窗口在特定位置(左,右,中间)弹出(附加)到图钉,因为这有一个锚点属性。 定义如下:
我们将地图的可见区域划分为3个垂直区域,并根据此区域确定绑定的位置。 在代码示例中,我们检查是否在左侧,以此类推,我们分别在中间(如果不是在左侧)和不在中间(在中间),则右边的点是

辅助函数,用于检查点是否落入区域中:

开始 可以用 但是有一点细微差别,似乎我们正在尝试放大,放大一,二,三,并且标注从图钉上飞了出去。 什么啊 怎么了

7)我们开始调试,坐标是一样的

然后尝试去了解正在发生的事情以及它是如何工作的,再次返回演示,更加专注地寻找差异...

我注意到坐标是直接传输的,而不是直接点击的! 但是,我否认了,很明显,坐标是相同的,即,圆和正方形具有相同的坐标。
这就是为什么在方法中我没有立即访问对象,而是通过了传递点,这是不正确的。

但是,您是否需要铸造对象,获取属性(每个地方的调用方式都不同,然后进行坐标处理,然后指向此处,现在是几何图形)是这种创意吗? 493线

由于我们需要处理两个紧迫的选项:第一个用于固定,第二个用于标注,并且如果我们再次单击同一引脚则不处理点击,因此,我们要做的
第一件事是在引脚集合中找到我们单击的引脚,然后进行比较座标495行,否则返回true,因此表示我们处理了点击,无需在层次结构中走得更远
第二 :我们通过单击图钉或标注来确定它,我们还将比较499线标签的坐标。 平等测试:
此外,如果这是一个标注,并且我们想响应按钮单击(或模拟,因为现在是图片),而不是整个区域,那么我们需要用笔进行一些计算:)
- 将世界坐标转换为屏幕501行
我们考虑一下自己:我们将地图坐标转换为屏幕,我们知道我们的位置,然后通过添加视图的宽度和高度来获得角点,但是由于某些原因它们不匹配,因此我手动乘以3(对于第10部iPhone)))) 后来发现,我忘记了,也没有考虑每个点的像素数。 我们可以得到1x(1点1像素),2x,3x 1点是3像素。 - 让我们计算按钮的高度-标注的高度+三角形的高度乘以比例,关于比例的信息(第498行)。 接下来,我们将所有内容一分为二,因为按钮的高度是标注高度的一半
- 然后,根据锚点(x:0.5,y:1)给出三角形的比例和面积的事实,计算角度的坐标。
- 然后将这些屏幕坐标转换为世界
- 基于它们创建一个可见区域,是一个按钮区域
- 然后检查是否点击了按钮区域。 如果您点击了,请检查批注的类型,具体取决于我们称为某些方法的类型:转到详细屏幕或选择此商店以在有StorePoint的情况下交货
否则,请单击该图钉,然后我们需要添加一个标注,我们实际上已经在上面进行了标注。
就这样,对新鲸的初步了解已经结束。
我还要说的是,在mapkit映射的当前实现中,它包含许多未使用的功能,这也会影响生成的二进制文件的大小。 您准备好进行此类牺牲了吗,将来,这些家伙毕竟应该被拆成模块 。 我还从研讨会的android上的同事那里听说,与Kotlin的兼容性存在问题。
附言 当我决定开始写文章时,发布了更新3.1,从那里解决并实现了上述问题:
已添加
对于Android,出现了arm64和x86版本。
您可以将任何View对象添加到地图。
自行车路线已经出现。
为Android添加了可为空的注释。
已变更
MapKit分为以下几部分:
MapKit-仅一张地图;MapKit Directions-汽车路线;MapKit Transport-行人路线,公共交通路线和自行车路线;MapKit Search-搜索和地理编码;MapKit Places-全景图。对于iOS,可为空的注释变得更加严格。错误修正修正了许多错误。改进的性能。tech.yandex.ru/maps/doc/mapkit/3.x/concepts/versions-docpage写下您的评论和问题。