日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

html5开发之ios屏幕适配,iOS开发屏幕尺寸以及屏幕适配等问题(转载内容)

發布時間:2025/3/12 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 html5开发之ios屏幕适配,iOS开发屏幕尺寸以及屏幕适配等问题(转载内容) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原帖地址:http://blog.csdn.net/phunxm/article/details/42174937/

僅供我個人收藏學習,原博主如不同意請聯系qq651263878進行刪除,在此表示感謝以及歉意。

1.iPhone尺寸規格

后續上市的iPhone7以及iPhone7plus ?與六代相同

1 inch = 2.54cm = 25.4mm

上表中的寬高(width/height)為手機的物理尺寸,包括顯示屏和邊框。

以下為iPhone4s的寬高示意圖:

我們通常所說的iPhone5屏幕尺寸為4英寸、iPhone6屏幕尺寸為4.7英寸,指的是顯示屏對角線的長度(diagonal)。

以下為iPhone5~6+的屏幕尺寸規格示意圖:

PPI(Pixel Per Inch by diagonal):表示沿著對角線,每英寸所擁有的像素(Pixel)數目。

PPI數值越高,代表顯示屏能夠以越高的密度顯示圖像,即通常所說的分辨率越高、顆粒感越弱。

根據勾股定理,可以得知iPhone4(s)的PPI計算公式為:

計算結果稍有出入,這是因為像素的離散采樣有鋸齒效應。

早期的iPhone3GS的屏幕分辨率是320*480(PPI=163),iOS繪制圖形(CGPoint/CGSize/CGRect)均以point為單位(measured in points):

1 point = 1 pixel(Point Per Inch=Pixel Per Inch=PPI)

后來在iPhone4中,同樣大小(3.5 inch)的屏幕采用了Retina顯示技術,橫、縱向方向像素密度都被放大到2倍,像素分辨率提高到(320x2)x(480x2)= 960x640(PPI=326),?顯像分辨率提升至iPhone3GS的4倍(1個Point被渲染成1個2x2的像素矩陣)。

但是對于開發者來說,ios繪制圖形的API依然沿襲point(pt,注意區分印刷行業的“磅”)為單位。在同樣的邏輯坐標系下(320x480):

1 point = scale*pixel(在iPhone4~6中,縮放因子scale=2;在iPhone6+中,縮放因子scale=3)。

可以理解為:

scale=絕對長度比(point/pixel)=單位長度內的數量比(pixel/point)

UIScreen.h中定義了該屬性:

// The natural scale factor associated with the screen.(read-only)

@property(nonatomic,readonly)CGFloatscaleNS_AVAILABLE_IOS(4_0);

--------------------------------------------------------------------------------

This value reflects the scale factor needed to convert from the defaultlogical coordinate spaceinto thedevice coordinate spaceof this screen.

The default logical coordinate space is measured usingpoints. Forstandard-resolutiondisplays, the scale factor is 1.0 andone point equals one pixel. ForRetinadisplays, the scale factor is 2.0 andone point is represented by four pixels.

--------------------------------------------------------------------------------

為了自動適應分辨率,系統會根據設備實際分辨率,自動給UIScreen.scale賦值,該屬性對開發者只讀。

iOS8新增了nativeScale屬性:

// Native scale factor of the physical screen

@property(nonatomic,readonly)CGFloatnativeScaleNS_AVAILABLE_IOS(8_0);

--------------------------------------------------------------------------------

(lldb)p (CGFloat)[[UIScreen mainScreen] scale]

(CGFloat) $1 = 3

(lldb) p(CGFloat)[[UIScreen mainScreen] nativeScale]

(CGFloat) $2 = 3

--------------------------------------------------------------------------------

在同樣的邏輯分辨率下,可以通過scale參數識別是iPhone3GS還是iPhone4(s)。以下基于nativeScale參數,定義了探測機型是否為iPhone6+的宏:

--------------------------------------------------------------------------------

// not UIUserInterfaceIdiomPad

#defineIS_IPHONE(UI_USER_INTERFACE_IDIOM() ==UIUserInterfaceIdiomPhone)

// detect iPhone6 Plus based on its native scale

#defineIS_IPHONE_6PLUS(IS_IPHONE && [[UIScreenmainScreen] nativeScale] == 3.0f)

--------------------------------------------------------------------------------

那么,同樣的分辨率和scale,如何區分機型iPhone4與4s、iPhone5與5s呢?通過[[UIDevice currentDevice] model]只能判別iPhone、iPad、iPod大類,要判斷iPhone具體機型型號,則需要通過sysctlbyname("hw.machine")獲取詳細的設備參數信息予以甄別。

8.@2x/@3x以及高倍圖適配

@2xmeans the same “double”retina resolution that we’veseen on all iOS devices with retina displays to date, where each virtual pointin the user interface is represented bytwophysical pixels on thedisplayin each dimension, horizontal and vertical.

iPhone3GS時代,我們為一個應用提供圖標(或按鈕提供貼圖),只需要icon.png。針對現在的iPhone4~6 Retina顯示屏,需要制作額外的@2x高分辨率版本。

例如在iPhone3GS中,scale=1,用的圖標是50x50pixel(logicalimage.size=50x50point);在iPhone4~6中,scale=2,則需要100×100pixel(logical image.size=50x50point,乘以image.scale=dimensions in pixels),并且命名為icon@2x.png。

如果APP要同時兼容iPhone3GS~iPhone6,則需要提供icon.png/icon@2x.png兩種分辨率的圖片。

@3xmeans a new “triple” retina resolution, where eachuser interface point is represented bythreedisplay pixels. A single @2x pointis a 2?×?2 square of 4 pixels; an @3x point is a 3?×?3 square of 9 pixels.”

iPhone6+在實際渲染時,downsampling/1.15(1242x2208->1080x1920),準確的講,應該是@2.46x。蘋果為方便開發者用的是@3x的素材,然后再縮放到@2.46x上。

如果APP要同時兼容iPhone3GS~iPhone6+,則需要提供icon.png/icon@2x.png/icon@3x.png三種分辨率的圖片。

需要注意的是,iOS APP圖標的尺寸和命名都需要遵守相關規范。

對于iPhone3、4/5/6、6+三類機型,需要按分辨率提供相應的高倍圖并且文件名添加相應后綴,否則會拉伸(stretchable/resizable)失真(模糊或邊角出現鋸齒)。

以下基于UIImage的兩類初始化API簡介高倍圖的適配:

<1>+imageNamed:該方法使用系統緩存,適合表視圖重復加載圖像的情形。同時該API根據UIScreen的scale,自動查找包含對應高倍圖后綴名(@2x)的文件,如果找到二倍圖,則image.scale=2.0,對應邏輯size大小以point度量(pixel度量的一半);如果沒找到設置默認image.scale=1.0,對應邏輯size大小同像素尺寸。因此,使用該方法,無需特意指定高倍圖后綴。在實際運行時,系統如果發現當前設備是Retina屏(scale=2),會自動尋找"*@2x.png"命名格式的圖片,加載針對Retina屏的圖片素材,否則會失真。

<2>+imageWithContentsOfFile/+imageWithData:(scale:)/-initWithContentsOfFile:/-initWithData:(scale:)

這組方法創建的UIImage對象沒有使用系統緩存,并且指定文件名必須包含明確的高倍圖后綴。如果文件名包含@2x后綴,則image.scale=2.0;否則默認image.scale=1.0,同樣對于Retina屏將會失真。

<3>目前,適配iPhone6+時,除了一些鋪滿全屏的大圖(LogoIcon、LaunchImage)需提供三倍圖,其他的小圖仍可沿用原有的二倍圖自適應拉伸。

// Bounds of entire screen in points(本地坐標系,起點為[0,0])

@property(nonatomic,readonly)CGRectbounds;

--------------------------------------------------------------------------------

//考慮轉屏的影響,按照實際屏幕方向(UIDeviceOrientation)的寬高

#defineSCREEN_WIDTH([UIScreenmainScreen].bounds.size.width)

#defineSCREEN_HEIGHT([UIScreenmainScreen].bounds.size.height)

#defineSTATUSBAR_HEIGHT([UIApplicationsharedApplication].statusBarFrame.size.height)

//不考慮轉屏的影響,只取豎屏(UIDeviceOrientationPortrait)的寬高

#defineSCREEN_WIDTHMIN([UIScreenmainScreen].bounds.size.width, [UIScreenmainScreen].bounds.size.height)

#defineSCREEN_HEIGHTMAX([UIScreenmainScreen].bounds.size.height, [UIScreenmainScreen].bounds.size.width)

#defineSTATUSBAR_HEIGHTMIN([UIApplicationsharedApplication].statusBarFrame.size.width, [UIApplicationsharedApplication].statusBarFrame.size.height)

--------------------------------------------------------------------------------

iOS8新增了nativeBounds屬性,輸出豎屏像素級分辨率:

// The bounding rectangle of the physical screen,measured inpixels. (read-only)

// This rectangle is based on the device in a portrait-up orientation.?This value does not change as the device rotates.

@property(nonatomic,readonly)CGRectnativeBoundsNS_AVAILABLE_IOS(8_0);

以下是iPhone6+下的輸出:

--------------------------------------------------------------------------------

(lldb) poNSStringFromCGRect([(UIScreen*)[UIScreen mainScreen] bounds])

{{0, 0}, {414, 736}}

(lldb) poNSStringFromCGRect([(UIScreen*)[UIScreen mainScreen] nativeBounds])

{{0, 0}, {1242, 2208}}

--------------------------------------------------------------------------------

// Frame of application screen area in points (i.e.entire screenminusstatus bar if visible)

// bounds除去系統狀態欄

@property(nonatomic,readonly)CGRectapplicationFrame;

--------------------------------------------------------------------------------

// APPFRAME_WIDTH=SCREEN_WIDTH

#defineAPPFRAME_WIDTH([UIScreen mainScreen].applicationFrame.size.width)

// APPFRAME_HEIGHT=SCREEN_HEIGHT-STATUSBAR_HEIGHT

//注意:橫屏(UIDeviceOrientationLandscape)時,iOS8默認隱藏狀態欄,此時APPFRAME_HEIGHT=SCREEN_HEIGHT

#defineAPPFRAME_HEIGHT([UIScreen mainScreen].applicationFrame.size.height)

--------------------------------------------------------------------------------

10.機型尺寸Screen Scale Adaption)

從iPhone3GS/iPhone4(s)過渡到iPhone5(s)時,在邏輯上寬度不變高度稍高,之前舊的素材和布局通過AutoresizingFlexible簡單適配即可運行得很好,但由于高寬比增大,上下兩端出現黑粗邊(典型如LaunchImage)。從分辨率的角度來看,除了需要提供LaunchImage這種滿屏圖,其他基本沿用二倍圖(@2x);從屏幕尺寸角度來看,需要對縱向排版略加調整。

從iPhone5(s)發展到iPhone6(+),由于高寬比保持不變,iOS對圖標、圖片、字體進行等比放大自適應,清晰度會有所降低。同時,絕對坐標布局會導致在大屏下出現偏左偏上的問題。從分辨率的角度來看,iPhone6沿用二倍圖(@2x),但需為iPhone6+提供更高的三倍圖(@3x);從屏幕尺寸角度來看,需要重新對UI元素尺寸和布局進行適配,以期視覺協調。

我們先來看一下iPhone4~6(+)的屏幕高寬比:

iPhone4(s):分辨率960*640,高寬比1.5

iPhone5(s):分辨率1136*640,高寬比1.775

iPhone6:分辨率1334*750,高寬比1.779

iPhone6+:分辨率1920*1080,高寬比1.778

可粗略認為iPhone5(s)、6(+)的高寬比是一致的(16:9),即可以等比例縮放。因此可以按寬度適配:

fitScreenWidth= width*(SCREEN_WIDTH/320)

這樣,共有iPhone3/4/5、6、6+三組寬度,在iPhone6、6+下將按比例橫向放大。

在同樣的寬度下,iPhone4(s)的屏高比iPhone5(s)低,若縱向排版緊張,可以iPhone5(s)為基準,按高度適配:

fitScreenHeight= height*(SCREEN_HEIGHT/568)

共有iPhone3/4、5、6、6+四組高度,在iPhone3/4下將按比例縱向縮小,在iPhone6、6+下將按比例縱向放大。

這里需要注意iPhone/iOS雙環上網的熱點欄對縱向布局的影響:iPhone作為個人熱點且有連接時,系統狀態欄下面會多一行熱點連接提示欄"Personal Hotspot: * Connection",縱向會下壓20pt,[UIApplication sharedApplication].statusBarFrame高度變為40pt;當所有連接都斷開時,熱點欄消失,縱向高度恢復正常為20pt。詳情可參考《iPhone/iOS開啟個人熱點的縱向適配小結》。

另外,iPhone的【設置】【通用】【輔助功能】中可以設置調節【更大字體】,APP也可以按字號適配:

例如適配表視圖(UITableView:UIScrollView),無法左右滑動,因此無論字號縮放比例多大,橫向都不應超過SCREEN_WIDTH。注意限定控件元素內容區域寬度以及間距,并設置適當的LineBreakMode。表視圖支持上下滑動,因此縱向上的表格行高和內容區域高度可按字號縮放。

對于縱向也不支持滑動的視圖,在屏幕可見視區內排版時,最好不要隨字號縮放,否則可能超出既定寬高。

考慮到iPhone機型的多樣性,不可能針對iPhone4(s)、5(s)、6、6+四種屏幕尺寸出四套視覺交互稿,也不要基于某一機型從上往下、從左往右給絕對標注,而應該關注subView在superView中的相對位置(EdgeInsets/Frame/Center)以及siblingView之間的偏移(Offset),盡量給出適合Autolayout的相對布局比例(理想情況是只給百分比)。假如交互按照iPhone5(s)下絕對標注,則在iPhone4(s)上可能擠出屏幕底部,而在iPhone6(+)上則可能橫向偏左或縱向偏上。

開發人員基于與屏幕邊緣的間距(Margin/EdgeInsets),定位邊緣處的控件(釘釘子)作為參照,然后基于控件尺寸和間隙進行相對計算排版。這樣,若釘子移動,相鄰控件將順向偏移,不會因為局部調整而出現凌亂。

我們截取 iPhone5s QQ 文件助手列表中的文件cell,使用SketchMeasure對其進行測量標注。

打開[截圖.png]文件,由于不包含 Sketch 圖元對象,無法進行 measure 標注(提示:請在畫板中使用該功能)。因此,第一步需要對要相對標注的各個UI元素進行對象化。依次Insert Artboard 創建圖層?frame、thumbnail、title、detail、source、button。

選中整個cell的frame(bounds),進行 Measure size:width=640px(SCREEN_WIDTH),height=168px。默認橫向尺寸和縱向參考線都居中導致標注重疊,將縱向參考線右移至合適位置;也可選中WIDTH標注圖層中的text和label元素,在不移動參考線的前提下,利用鼠標局部移動標注字面量。

(1)縮略圖標

在左側邊欄layer list中選中frame,再command選中文件類型縮略圖對象thumbnail,進行 Measure spacing,丈量縮略圖左側相對frame的間距為24px。

選中文件類型縮略圖對象thumbnail,進行 measure size,由于正方形等寬為112px*112px,故橫縱標注重疊無影響。thumbnail在frame中縱向整體居中,因此上下邊距計算均攤即可,無需再給定標注。

(2)傳輸按鈕

對 button 和 frame 進行 Measure spacing,丈量按鈕右側相對frame的間距為24px。

選中按鈕button進行 measure size,其寬高為144px*60px。橫縱標注重疊影響視覺,將縱向參考線右移至合適位置。

button在frame中縱向整體居中,因此上下邊距計算均攤即可,無需再給定標注。

(3)文件信息

對thumbnail和detail(title、source等寬且左對齊)進行 Measure spacing,丈量圖標右側相對detail的間距為20px;對button和detail進行 Measure spacing,丈量按鈕左側相對detail間距為20px。這樣,左側釘住thumbnail,右側釘住button,中間信息部分的寬度無需給定,計算被動約束的橫向余量即可。具體編程時,調用sizeWithFont/boundingRectWithSize 可動態計算每行 label 的自然寬度,一般title都會超過約束寬度,因此需設置 lineBreakMode指定Wrapping省略或Truncating截斷格式。

選中文件信息第1行標題title和第2行詳情detail,進行 Measure spacing,測量縱向相對間距10px;第2行詳情detail和第3行來源的縱向相對間距也為10px。一般 UILabel 的文本在給定字體下的縱向自然顯示無約束,調用sizeWithFont/boundingRectWithSize 可動態計算每行 label 的自然高度,title的上間距和source的底間距無需給定,通過計算縱向余量均攤即可。

可簡單的基于屏寬橫縱比例進行scale縮放,將以上測量出的標注應用到iPhone6(+)大屏下,當然交互設計工程師最好還是針對特定機型都給定適配標注。蘋果在WWDC2012 iOS6中已提出了Auto Layout的概念,即使用約束條件來定義視圖的位置和尺寸,以適應不同尺寸和分辨率的屏幕。

最后,除了對屏幕尺寸和分辨率進行適配之外,還需對iOS SDK中相關的DEPRECATED API進行適配。典型的如:

(1)UILineBreakMode->NSLineBreakMode

(2)UITextAlignment->NSTextAlignment

(3)sizeWithFont:->boundingRectWithSize:

(4)stretchableImageWithLeftCapWidth:topCapHeight:->resizableImageWithCapInsets:

(5)...

參考:

《iOS界面適配(一)(二)(三)》

總結

以上是生活随笔為你收集整理的html5开发之ios屏幕适配,iOS开发屏幕尺寸以及屏幕适配等问题(转载内容)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日韩中字在线 | 超污巨黄的小短文 | 亚洲精品www久久久久久广东 | 国产丝袜在线播放 | 中国一级免费毛片 | 污视频大全 | 日本免费观看视频 | 国产成人久久精品麻豆二区 | 性xxxfllreexxx少妇 | 桃色成人 | 成人福利视频网站 | 成人综合激情网 | 欧美xxxxxx片免费播放软件 | 玉米地疯狂的吸允她的奶视频 | 视频二区中文字幕 | av色站| 日本www在线播放 | 久久婷婷网站 | 欧美激情视频一区二区 | 精品国产一区二区三区在线 | 色欲av永久无码精品无码蜜桃 | 朝鲜美女黑毛bbw | 在线视频h | 国产精品福利小视频 | 欧美极品一区二区 | аⅴ资源中文在线天堂 | 久久久久综合网 | 国产一级片精品 | 亚洲国产成人在线视频 | 性高湖久久久久久久久aaaaa | 亚洲操片| 特黄视频在线观看 | 欧美精品成人久久 | 欧美网站在线 | 久久人妻少妇嫩草av无码专区 | 国产精选一区二区三区 | 亚洲97视频 | 亚洲玖玖爱 | 欧美精品久久久久久久久 | 神马影院一区二区 | 澳门黄色 | 色综合久久久久综合体桃花网 | 国产免费叼嘿网站免费 | 国产91成人| 芒果视频在线观看免费 | 狠狠躁夜夜躁人人爽视频 | 成人黄色激情 | 91日本在线观看 | 国产成人精品综合久久久久99 | 免费观看污视频 | 一区不卡在线 | 女仆乖h调教跪趴1v1 | 国产成人精品999在线观看 | 女人扒开腿让男人捅爽 | 在线亚洲人成电影网站色www | 久久视频这里只有精品 | 超碰下载页面 | 久久精精品久久久久噜噜 | 性色生活片 | 婷婷伊人综合中文字幕 | 91精品一区二区三区四区 | 免费污片网站 | 四虎精品视频 | 久久国产成人精品av | 亚洲瑟瑟 | 日本少妇bbwbbw精品 | 亚洲福利小视频 | 美女脱了裤子让男人桶 | 国产精品suv一区二区三区 | 日韩操比| 99这里只有 | 欧美又粗又长 | 国产精品精品软件视频 | 国产精品久久久999 www日本高清视频 | 日本成人毛片 | 日韩在线中文字幕视频 | 欧美xxx性| 亚洲福利在线播放 | 99免费视频 | 久久天天操 | 国产欧美日韩专区 | 欧美三级又粗又硬 | 成人麻豆视频 | 中文字幕亚洲日本 | 波多野结衣视频在线观看 | 草草视频在线 | 偷拍第一页 | 少妇一级淫片免费播放 | 91精品啪在线观看国产线免费 | 不卡视频在线观看 | 黄色av一区 | 九九综合九九综合 | 青娱乐av| 丰满熟妇肥白一区二区在线 | 艳妇臀荡乳欲伦交换h漫 | 精品人妻大屁股白浆无码 | 精品无码国产一区二区三区51安 | 日本熟妇成熟毛茸茸 | 黄网免费视频 |