在ios開發(fā)的sdk:iossdk/guide/tool中有轉(zhuǎn)換工具。 百度地圖SDK采用的是百度自有的地理坐標系(bdll09),因此開發(fā)者在做位置標注的時候,需要將其他類型的坐標轉(zhuǎn)換為百度坐標。 相應的接口和轉(zhuǎn)換方式如下: CLLocationCoordinate2D test = CLLocationCoordinate2DMake(39.90868, 116.3956); //轉(zhuǎn)換 google地圖、soso地圖、aliyun地圖、mapabc地圖和amap地圖所用坐標至百度坐標 NSDictionary* testdic = BMKConvertBaiduCoorFrom(test,BMK_COORDTYPE_COMMON); //轉(zhuǎn)換GPS坐標至百度坐標 testdic = BMKConvertBaiduCoorFrom(test,BMK_COORDTYPE_GPS); NSLog(@"x=%@,y=%@",[testdic objectForKey:@"x"],[testdic objectForKey:@"y"]);
創(chuàng)新互聯(lián)公司2013年至今,先為漢川等服務建站,漢川等地企業(yè),進行企業(yè)商務咨詢服務。為漢川企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務解決您的所有建站問題。
[img]原生native提供的獲取當前所在的經(jīng)緯度坐標,傳到后端進行校驗,后端使用的是百度地圖。發(fā)現(xiàn):安卓獲取經(jīng)緯度精度沒問題,但ios獲取的精度總是不對。
經(jīng)資料收集,發(fā)現(xiàn)不同手機系統(tǒng)采用的是不同地圖公司的數(shù)據(jù),各地圖公司使用的是不同坐標系。而公司native底層,安卓是使用的百度地圖,iOS是使用的高德地圖,因此安卓手機獲取的經(jīng)緯度可直接使用,而IOS則需要進行坐標轉(zhuǎn)換。
筆者這里使用gcoord庫,通過把GCJ-02坐標轉(zhuǎn)為BD-09坐標。按理這時候問題應該解決了。然而,轉(zhuǎn)換后得到的經(jīng)緯度還是和目標經(jīng)緯度有差距。問題出在哪?
原來,原生開發(fā)調(diào)用底層api, 如CLLocationManagger,獲取到的是WGS-84坐標系的經(jīng)緯度。因此轉(zhuǎn)換過程應該是把WGS-84坐標轉(zhuǎn)為BD-09坐標。
WGS-84 - 世界大地測量系統(tǒng)
World Geodetic System, WGS 世界通用的坐標系,GPS設備得到的經(jīng)緯度就是在WGS84坐標系下的經(jīng)緯度。
GCJ-02 - 國測局坐標
火星坐標系,由中國國測局制定,對中國各地經(jīng)緯度進行加密處理。
BD-09 - 百度坐標系
百度地圖使用的地理坐標系,其在GCJ-02上多增加了一次變換,用來保護用戶隱私。
08年的7月11號,當蘋果發(fā)布iPhone3G并推出AppStore和iOS開發(fā)SDK之后,iOS開發(fā)正式出現(xiàn)了。隨著iPhone的熱賣,App作為移動互聯(lián)網(wǎng)的入口凸現(xiàn)了它的巨大價值,無數(shù)創(chuàng)業(yè)團隊開始紛紛開發(fā)自己的App,iOS開發(fā)的身價也是水漲船高。由于蘋果提供了完善的開發(fā)工具和健全的App市場,App的設計與開發(fā)只能按照蘋果的標準來,所以 320X480 的尺寸成了設計師們設計App的標準尺寸。
這個標準到2012年發(fā)布iPhone5之前一直是金科玉律,設計師無須關心什么是px(pixel),什么是pt(point),原因是早期的iPhone中,像素和點是對等的;后來雖然有點小插曲出了retina屏幕,設計師設計時也只需要把原來的尺寸放大一倍即可,開發(fā)人員會默認縮小一倍做開發(fā)??梢哉f蘋果當時是非常照顧開發(fā)和設計人員的,即使升級了retina屏幕,開發(fā)和設計之間的默契馬上會自動達成。但這也給之后埋下了隱患。
iPhone4s是喬布斯的遺作,但它也可以看作是小團隊開發(fā)iOS應用浪潮中泡沫的分水嶺。
之后問題開始慢慢暴露了。首先是iPhone5變長了,當時我們都挺驚訝的,連忙去確認了尺寸,發(fā)現(xiàn)屏幕從{320,480}變成了{320,568}。有經(jīng)驗的iOS開發(fā)通過動態(tài)計算屏幕高度馬上解決了這個問題。然后,開發(fā)同學和設計同學溝通好,把效果圖和標注圖的尺寸改成了{640,1136}。這次蘋果的改動其實并沒有影響原來開發(fā)的方式和設計的原則,所以可是說是虛驚一場。
但是好景不長,iPhone6和iPhone6 Plus出現(xiàn)了,蘋果第一次在一場發(fā)布會上發(fā)布2款不同尺寸的手機。這時候,iOS攻城獅心中是一群草泥馬在萬馬奔騰。從那時起,開發(fā)和設計之間的問題就徹底暴露了。
當然,蘋果也給了一個萬金油的方案,如果我們什么都不改,App會在iPhone6和iPhone6 Plus等大屏手機上自動等比放大展示。作為企業(yè)級的App,怎么能容忍放大版的App在iPhone6 Plus上顯示呢(因為它真的很大)。然后,我們給不同尺寸的機型補上了不一樣的啟動圖(示意圖如下)。
驗證完所有需要支持的iPhone機型,我們得到了4種不同的屏幕尺寸,分別是{320,480},{320,568},{375,667},{414,736}(示意圖如下)。
開發(fā)同學一看到需要給App開發(fā)4種尺寸時,一開始的心態(tài)是悶逼的。設計人員也納悶到底拿哪個尺寸做效果圖呢。因為都沒有經(jīng)驗,一開始我們繼續(xù)讓設計師用{640,1136}做標注圖,這樣我們結(jié)合屏幕的寬度和高度,可以很快的調(diào)整好不同尺寸下的布局。
隨著iPhone6和iPhone6 Plus的大量普及以及高端Android手機市場份額的提升,之前{640,1136}做的效果圖在真機上展示很不理想,于是設計師們把效果圖的設計尺寸改成了{750,1334},而且還考慮用{1080,1920}做效果圖。一般設計師們都是在效果圖上直接做標注,由于效果圖尺寸變成了{750,1334},我們iOS開發(fā)拿到標注圖的尺寸也變成了{750,1334}。然后,開發(fā)拿著px做各種換算,碰到了各種奇怪的問題,做出來的頁面和效果圖的差距總是很大。我列舉下幾個常見的問題:
其實,當設計師用小屏幕的規(guī)范去設計大屏幕時,設計稿已經(jīng)出問題了。比如在小屏幕的時候,定義了最小字號為9號,9號字在PS上{750,1334}的設計圖起來還可以,但在真機retina屏幕上看起來就很小,視覺落差特別大。設計師一看效果不對,就讓開發(fā)加大字號;字號變大后,小屏幕的字體就感覺特別大,然后讓開發(fā)分屏幕對待,小屏幕不變,大屏幕加大字號;開發(fā)拿著{750,1334}尺寸的px標注圖,總感覺之前除以2后的寬高在小屏幕上顯示不對,于是又用(屏幕寬度/320)搞了個比例系數(shù),而且將錯就錯的在所有的寬高上乘以該系數(shù)。
然后在敏捷開發(fā)的團隊里,設計師和工程師都開始懷疑人生了。設計師總感覺設計稿和真機效果差別很大,工程師總感覺實現(xiàn)的跟標注圖不一致。最后只能通過海量的微調(diào)來達到看起來差不多的效果。
說到現(xiàn)在,我們差不多明白問題出在哪里了。
首先是設計師的設計規(guī)范需要修訂了,之前用在小屏幕上的設計規(guī)范不能生搬硬套在大屏幕上,需要重新修訂設計規(guī)范,兼顧小屏和大屏。
然后是工程師需要更加深入的了解iPhone的渲染機制了,否則px和pt會搞得傻傻分不清。有朋友會說,px和pt怎么會搞不清楚呢,1pt在iPhone6(包括iPhone6s)之前都是2px,在iPhone6 Plus和iPhone6s Plus上是3px。但是當你做出來的效果總是跟設計師的標注圖不一樣時,你是不是會懷疑自己實現(xiàn)錯了。當你覺得設計師標注有問題時,你又怎么說明緣由然后告訴設計師一個誤差較少的方案呢?你要明白設計師現(xiàn)在以不再是單獨為iOS開發(fā)做設計了,還要兼顧Android和H5頁面。
所以,我們需要靜下來好好研究下iPhone現(xiàn)在是怎么渲染的,然后找到一個靠譜的方案讓設計師對標注圖做調(diào)整。
在iOS開發(fā)中,point是抽象單位,它只在iOS系統(tǒng)給我們抽象出來的數(shù)字坐標系中有意義,與pixel沒有直接的關系。之前我們常說1pt等于2px,1pt等于3px,這些等式之所以成立是因為我們無意識中都給等式加了一個附加條件,那就是在某種機型下。所以之后的機型說不定就有1pt等于4px,1pt等于5px的情況。
當我們在數(shù)字坐標系中繪制完界面后,iOS系統(tǒng)就開始在內(nèi)存中渲染適合當前手機屏幕的頁面尺寸,這個時候,渲染的單位就是pixel了。用基于點的圖形使用像素進行渲染,這個過程叫做光柵化。像素坐標系是通過點坐標系乘以一個比例因子來獲得的。比例因子越大,屏幕的像素密度越大,現(xiàn)實效果就越好。而我們常說的1倍、2倍、3倍就是比例因子。
但是在iPhone6Plus中,屏幕的物理像素只有{1080,1920},而內(nèi)存渲染的像素卻是3倍的點坐標系{1242,2208}。為了正常顯示,iPhone6Plus在顯示的時候做了一個 縮減像素采樣 (downsampling)的操作?,F(xiàn)在我們明白iPhone6Plus的屏幕分辨率為什么不是3倍了。
為了證明iPhone各種機型上渲染的像素是不同的,我們來比較下1個點寬度的線是怎么渲染的。下面是示意圖:
這個縮放比率是 1920 / 2208 = 1080 / 1242 = 20 / 23。這意味著iPhone原始渲染的過程中,每23個渲染像素必須映射到20個物理像素上。換句話說,圖片被縮放到了大約只有原始大小的87%。
下面,我們從宏觀的角度來看看不同的iPhone機型是怎么適配的。請看下圖:
搞清楚iPhone的渲染機制后,我們也知道了如何讓設計師調(diào)整標注圖了。之前,設計師為了兼顧Android和H5頁面的效果圖,把效果圖大小調(diào)整為{750, 1334};考慮到工作量,設計師會在效果圖上直接出標注,按照之前的約定默認的單位就px。對于開發(fā)人員,拿著{750, 1334}單位是px的標注圖,他的第一反應是這是iPhone6的標注,iPhone6 plus和小屏的標注只能自己算了。下面我們拿左邊距15px做例子:
這么算下來,感覺pt總是算不對。問題出在 不同手機屏幕上相等的視覺長度它們的像素是不同的 ,所以渲染15px的左邊距,不同手機上的視覺邊距都不一樣。如果想在不同手機屏幕上讓左邊距看起來都一樣,我們必須使用pt為單位,原因我們在上面介紹iPhone渲染機制中已作了說明,這里不再贅述。
其實,設計師關注的點也就是標注的內(nèi)容在不同手機屏幕上顯示的效果一樣,比如左邊距。對于特殊的適配情況,設計師自然會給不同分辨率下的標注。而之前的原因出在我們開發(fā)人員沒有向設計師解釋清楚 不同屏幕上渲染相等的視覺長度,像素是不一樣的,但渲染的point是一樣的 。后來,我們換成了pt作單位,絕大多數(shù)實現(xiàn)不準確的問題都被解決了,對于定高定寬的情況,標注時也做了特殊說明,而且也都換成了相對布局的方式進行標注;最后,拿一張我們最近的標注圖做示例。
終于寫完了,感覺自己文筆有限,語句多不通順,但你要明白一點, 不同手機屏幕上渲染相等的視覺長度,pixel是不一樣的,但渲染的point是一樣的 。希望這篇iOS標注解惑能讓你了解pixel和point本質(zhì)的區(qū)別。最后歡迎大家積極回復留言,交流心得。
在ios開發(fā)的sdk:iossdk/guide/tool中有轉(zhuǎn)換工具。
百度地圖SDK采用的是百度自有的地理坐標系(bdll09),因此開發(fā)者在做位置標注的時候,需要將其他類型的坐標轉(zhuǎn)換為百度坐標。
相應的接口和轉(zhuǎn)換方式如下:
CLLocationCoordinate2D test = CLLocationCoordinate2DMake(39.90868, 116.3956);
//轉(zhuǎn)換 google地圖、soso地圖、aliyun地圖、mapabc地圖和amap地圖所用坐標至百度坐標
NSDictionary* testdic = BMKConvertBaiduCoorFrom(test,BMK_COORDTYPE_COMMON);
//轉(zhuǎn)換GPS坐標至百度坐標
testdic = BMKConvertBaiduCoorFrom(test,BMK_COORDTYPE_GPS);
NSLog(@"x=%@,y=%@",[testdic objectForKey:@"x"],[testdic objectForKey:@"y"]);