十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
在ios开发的sdk:iossdk/guide/tool中有转换工具。 百度地图SDK采用的是百度自有的地理坐标系(bdll09),因此开发者在做位置标注的时候,需要将其他类型的坐标转换为百度坐标。 相应的接口和转换方式如下: CLLocationCoordinate2D test = CLLocationCoordinate2DMake(39.90868, 116.3956); //转换 google地图、soso地图、aliyun地图、mapabc地图和amap地图所用坐标至百度坐标 NSDictionary* testdic = BMKConvertBaiduCoorFrom(test,BMK_COORDTYPE_COMMON); //转换GPS坐标至百度坐标 testdic = BMKConvertBaiduCoorFrom(test,BMK_COORDTYPE_GPS); NSLog(@"x=%@,y=%@",[testdic objectForKey:@"x"],[testdic objectForKey:@"y"]);
创新互联公司2013年至今,先为汉川等服务建站,汉川等地企业,进行企业商务咨询服务。为汉川企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。
[img]原生native提供的获取当前所在的经纬度坐标,传到后端进行校验,后端使用的是百度地图。发现:安卓获取经纬度精度没问题,但ios获取的精度总是不对。
经资料收集,发现不同手机系统采用的是不同地图公司的数据,各地图公司使用的是不同坐标系。而公司native底层,安卓是使用的百度地图,iOS是使用的高德地图,因此安卓手机获取的经纬度可直接使用,而IOS则需要进行坐标转换。
笔者这里使用gcoord库,通过把GCJ-02坐标转为BD-09坐标。按理这时候问题应该解决了。然而,转换后得到的经纬度还是和目标经纬度有差距。问题出在哪?
原来,原生开发调用底层api, 如CLLocationManagger,获取到的是WGS-84坐标系的经纬度。因此转换过程应该是把WGS-84坐标转为BD-09坐标。
WGS-84 - 世界大地测量系统
World Geodetic System, WGS 世界通用的坐标系,GPS设备得到的经纬度就是在WGS84坐标系下的经纬度。
GCJ-02 - 国测局坐标
火星坐标系,由中国国测局制定,对中国各地经纬度进行加密处理。
BD-09 - 百度坐标系
百度地图使用的地理坐标系,其在GCJ-02上多增加了一次变换,用来保护用户隐私。
08年的7月11号,当苹果发布iPhone3G并推出AppStore和iOS开发SDK之后,iOS开发正式出现了。随着iPhone的热卖,App作为移动互联网的入口凸现了它的巨大价值,无数创业团队开始纷纷开发自己的App,iOS开发的身价也是水涨船高。由于苹果提供了完善的开发工具和健全的App市场,App的设计与开发只能按照苹果的标准来,所以 320X480 的尺寸成了设计师们设计App的标准尺寸。
这个标准到2012年发布iPhone5之前一直是金科玉律,设计师无须关心什么是px(pixel),什么是pt(point),原因是早期的iPhone中,像素和点是对等的;后来虽然有点小插曲出了retina屏幕,设计师设计时也只需要把原来的尺寸放大一倍即可,开发人员会默认缩小一倍做开发。可以说苹果当时是非常照顾开发和设计人员的,即使升级了retina屏幕,开发和设计之间的默契马上会自动达成。但这也给之后埋下了隐患。
iPhone4s是乔布斯的遗作,但它也可以看作是小团队开发iOS应用浪潮中泡沫的分水岭。
之后问题开始慢慢暴露了。首先是iPhone5变长了,当时我们都挺惊讶的,连忙去确认了尺寸,发现屏幕从{320,480}变成了{320,568}。有经验的iOS开发通过动态计算屏幕高度马上解决了这个问题。然后,开发同学和设计同学沟通好,把效果图和标注图的尺寸改成了{640,1136}。这次苹果的改动其实并没有影响原来开发的方式和设计的原则,所以可是说是虚惊一场。
但是好景不长,iPhone6和iPhone6 Plus出现了,苹果第一次在一场发布会上发布2款不同尺寸的手机。这时候,iOS攻城狮心中是一群草泥马在万马奔腾。从那时起,开发和设计之间的问题就彻底暴露了。
当然,苹果也给了一个万金油的方案,如果我们什么都不改,App会在iPhone6和iPhone6 Plus等大屏手机上自动等比放大展示。作为企业级的App,怎么能容忍放大版的App在iPhone6 Plus上显示呢(因为它真的很大)。然后,我们给不同尺寸的机型补上了不一样的启动图(示意图如下)。
验证完所有需要支持的iPhone机型,我们得到了4种不同的屏幕尺寸,分别是{320,480},{320,568},{375,667},{414,736}(示意图如下)。
开发同学一看到需要给App开发4种尺寸时,一开始的心态是闷逼的。设计人员也纳闷到底拿哪个尺寸做效果图呢。因为都没有经验,一开始我们继续让设计师用{640,1136}做标注图,这样我们结合屏幕的宽度和高度,可以很快的调整好不同尺寸下的布局。
随着iPhone6和iPhone6 Plus的大量普及以及高端Android手机市场份额的提升,之前{640,1136}做的效果图在真机上展示很不理想,于是设计师们把效果图的设计尺寸改成了{750,1334},而且还考虑用{1080,1920}做效果图。一般设计师们都是在效果图上直接做标注,由于效果图尺寸变成了{750,1334},我们iOS开发拿到标注图的尺寸也变成了{750,1334}。然后,开发拿着px做各种换算,碰到了各种奇怪的问题,做出来的页面和效果图的差距总是很大。我列举下几个常见的问题:
其实,当设计师用小屏幕的规范去设计大屏幕时,设计稿已经出问题了。比如在小屏幕的时候,定义了最小字号为9号,9号字在PS上{750,1334}的设计图起来还可以,但在真机retina屏幕上看起来就很小,视觉落差特别大。设计师一看效果不对,就让开发加大字号;字号变大后,小屏幕的字体就感觉特别大,然后让开发分屏幕对待,小屏幕不变,大屏幕加大字号;开发拿着{750,1334}尺寸的px标注图,总感觉之前除以2后的宽高在小屏幕上显示不对,于是又用(屏幕宽度/320)搞了个比例系数,而且将错就错的在所有的宽高上乘以该系数。
然后在敏捷开发的团队里,设计师和工程师都开始怀疑人生了。设计师总感觉设计稿和真机效果差别很大,工程师总感觉实现的跟标注图不一致。最后只能通过海量的微调来达到看起来差不多的效果。
说到现在,我们差不多明白问题出在哪里了。
首先是设计师的设计规范需要修订了,之前用在小屏幕上的设计规范不能生搬硬套在大屏幕上,需要重新修订设计规范,兼顾小屏和大屏。
然后是工程师需要更加深入的了解iPhone的渲染机制了,否则px和pt会搞得傻傻分不清。有朋友会说,px和pt怎么会搞不清楚呢,1pt在iPhone6(包括iPhone6s)之前都是2px,在iPhone6 Plus和iPhone6s Plus上是3px。但是当你做出来的效果总是跟设计师的标注图不一样时,你是不是会怀疑自己实现错了。当你觉得设计师标注有问题时,你又怎么说明缘由然后告诉设计师一个误差较少的方案呢?你要明白设计师现在以不再是单独为iOS开发做设计了,还要兼顾Android和H5页面。
所以,我们需要静下来好好研究下iPhone现在是怎么渲染的,然后找到一个靠谱的方案让设计师对标注图做调整。
在iOS开发中,point是抽象单位,它只在iOS系统给我们抽象出来的数字坐标系中有意义,与pixel没有直接的关系。之前我们常说1pt等于2px,1pt等于3px,这些等式之所以成立是因为我们无意识中都给等式加了一个附加条件,那就是在某种机型下。所以之后的机型说不定就有1pt等于4px,1pt等于5px的情况。
当我们在数字坐标系中绘制完界面后,iOS系统就开始在内存中渲染适合当前手机屏幕的页面尺寸,这个时候,渲染的单位就是pixel了。用基于点的图形使用像素进行渲染,这个过程叫做光栅化。像素坐标系是通过点坐标系乘以一个比例因子来获得的。比例因子越大,屏幕的像素密度越大,现实效果就越好。而我们常说的1倍、2倍、3倍就是比例因子。
但是在iPhone6Plus中,屏幕的物理像素只有{1080,1920},而内存渲染的像素却是3倍的点坐标系{1242,2208}。为了正常显示,iPhone6Plus在显示的时候做了一个 缩减像素采样 (downsampling)的操作。现在我们明白iPhone6Plus的屏幕分辨率为什么不是3倍了。
为了证明iPhone各种机型上渲染的像素是不同的,我们来比较下1个点宽度的线是怎么渲染的。下面是示意图:
这个缩放比率是 1920 / 2208 = 1080 / 1242 = 20 / 23。这意味着iPhone原始渲染的过程中,每23个渲染像素必须映射到20个物理像素上。换句话说,图片被缩放到了大约只有原始大小的87%。
下面,我们从宏观的角度来看看不同的iPhone机型是怎么适配的。请看下图:
搞清楚iPhone的渲染机制后,我们也知道了如何让设计师调整标注图了。之前,设计师为了兼顾Android和H5页面的效果图,把效果图大小调整为{750, 1334};考虑到工作量,设计师会在效果图上直接出标注,按照之前的约定默认的单位就px。对于开发人员,拿着{750, 1334}单位是px的标注图,他的第一反应是这是iPhone6的标注,iPhone6 plus和小屏的标注只能自己算了。下面我们拿左边距15px做例子:
这么算下来,感觉pt总是算不对。问题出在 不同手机屏幕上相等的视觉长度它们的像素是不同的 ,所以渲染15px的左边距,不同手机上的视觉边距都不一样。如果想在不同手机屏幕上让左边距看起来都一样,我们必须使用pt为单位,原因我们在上面介绍iPhone渲染机制中已作了说明,这里不再赘述。
其实,设计师关注的点也就是标注的内容在不同手机屏幕上显示的效果一样,比如左边距。对于特殊的适配情况,设计师自然会给不同分辨率下的标注。而之前的原因出在我们开发人员没有向设计师解释清楚 不同屏幕上渲染相等的视觉长度,像素是不一样的,但渲染的point是一样的 。后来,我们换成了pt作单位,绝大多数实现不准确的问题都被解决了,对于定高定宽的情况,标注时也做了特殊说明,而且也都换成了相对布局的方式进行标注;最后,拿一张我们最近的标注图做示例。
终于写完了,感觉自己文笔有限,语句多不通顺,但你要明白一点, 不同手机屏幕上渲染相等的视觉长度,pixel是不一样的,但渲染的point是一样的 。希望这篇iOS标注解惑能让你了解pixel和point本质的区别。最后欢迎大家积极回复留言,交流心得。
在ios开发的sdk:iossdk/guide/tool中有转换工具。
百度地图SDK采用的是百度自有的地理坐标系(bdll09),因此开发者在做位置标注的时候,需要将其他类型的坐标转换为百度坐标。
相应的接口和转换方式如下:
CLLocationCoordinate2D test = CLLocationCoordinate2DMake(39.90868, 116.3956);
//转换 google地图、soso地图、aliyun地图、mapabc地图和amap地图所用坐标至百度坐标
NSDictionary* testdic = BMKConvertBaiduCoorFrom(test,BMK_COORDTYPE_COMMON);
//转换GPS坐标至百度坐标
testdic = BMKConvertBaiduCoorFrom(test,BMK_COORDTYPE_GPS);
NSLog(@"x=%@,y=%@",[testdic objectForKey:@"x"],[testdic objectForKey:@"y"]);