[英]Interface Builder: What are the UIView's Layout iOS 6/7 Deltas for?
我只是注意到在UIView的結構布局下找到了iOS 6/7 Delta屬性。
這是做什么用的,為什么AutoLayout缺少此功能?
注意:我前一陣子注意到了這個問題,但是現在我只發布我的答案,因為NDA已取消
您可能已經注意到,iOS 7帶來了全新的外觀。 UI元素的外觀已更改,但它們的一些尺寸(或通常的指標)也已更改。 這可以使界面設計同時適應iOS 7和它的前任產品。
蘋果公司的官方路線是使用AutoLayout解決此問題。 這會給您布置UI元素帶來很多麻煩。 有時合並起來並不容易,特別是如果出於商業原因您仍然必須支持iOS 5,或者對界面進行管理時會使得實現AutoLayout困難。 因此,如果您屬於這一小眾市場類別,Apple似乎提供了一種使您的工作容易一些的方法,並且他們將其稱為iOS 6/7 Deltas。
雖然在此情況下Interface Builder中的標簽尚不清楚“ Delta”的含義,但與該功能相對應的.xib文件中包含的代碼更加清晰:
<inset key="insetFor6xAndEarlier" minX="-50" minY="-100" maxX="-50" maxY="300"/>
關鍵字名稱insetFor6xAndEarlier
明確說明了此操作; 在iOS 7的前代產品上運行時,您可以為UI元素提供替代的插圖。 例如,上面定義了以下增量更改:
x: 50
y: 100
width: -100
height: 200
雖然存儲在.xib中的值不直接與引用的值相對應,但它們之間存在相關性。
x: -minX
y: -minY
width: minX + maxX
height: minY + maxY
下圖直觀地顯示了這種變化。 這是一個極端的例子,但這是證明其能力。 我只希望實踐中的增量變化只有幾個像素。
您可能會注意到,這些值與iOS 6視圖相反。 這是因為變化量與您正在使用的視圖類型有關。 如果您要在iOS 6上進行編輯,則可以使用delta,以便為iOS 7正確轉換元素(與上面示例相反)。
為了查看不同的樣式,您可以根據要運行的OS更改Interface Builder呈現它的方式。 它包含在File Inspector-> Interface Builder文檔中(右側欄的第一個選項卡),如下所示:
不是直接的,但是通過對代碼中的OS版本進行條件檢查,並相應地設置正確的位置/大小,可以輕松實現相同的效果。 增量功能之所以存在於Interface Builder中,是因為沒有代碼就無法直接進行條件定位,而Interface Builder的目的就是要為UI提供盡可能多的代碼。
Apple強烈建議您使用AutoLayout,這在大多數情況下都可以使您的生活更輕松。 如果您不能使用它(由於上述原因),則增量可讓您靈活地根據當前OS的指標適當地放置UI元素,而無需手動在代碼中重新放置它們。 一個很好的例子是根據狀態欄的缺乏進行調整,但是還有很多其他用例。
自然,如果您僅針對iOS7及更高版本進行開發,則無需知道此功能/不會發現它。 僅當使用iOS7 SDK構建且沒有自動布局的情況下需要讓iOS6設備運行應用程序時,才需要增量。
在撰寫本文時(8月21日),我找不到有關此功能的任何文檔,也找不到WWDC材料中的任何提及。 我玩了一圈,經過一些研究,這就是我發現的東西。
這實際上是指從iOS6到iOS7的布局位置之間的Delta。
在iOS7中,某些視圖可以隱藏狀態欄或將其透明化,實際上,它覆蓋在視圖頂部。 因此,如果在iOS6上將UI元素放在(0.0,0.0),它將顯示在狀態欄下方,但是在iOS7上,它將被部分覆蓋在狀態欄下方。 因此,在這種情況下,您需要一個與狀態欄高度匹配的增量(20.0點),以使布局在iOS6和iOS7中看起來相同。
我相信,如果您使用自動布局,則不需要這樣做,但是,當然,您會失去對iPad1的支持,而我們當中的許多人目前不願意讓步。
我知道已經解決了這個問題,只是添加了一個小的變體,希望它也可以對那些不使用自動布局並且仍然希望支持iOS 6.1和更早版本的人有所幫助。
選擇“查看為”到“ iOS 7.0及更高版本”
iOS 7的基本UI。對於iOS 6,請提供適當的增量值。 使用預覽查看如何在iOS 7和iOS 6設備中呈現。
快速步驟:
分別選擇根視圖的每個直接子代,並將其“ Y”值添加20px。
然后,共同選擇所有直接子級,並將增量Y設置為-20px。 您也可以批量或單獨執行此操作。
AutoLayout至少需要iOS 6.0。 如果要支持iOS 5.0,則不能使用自動版式。
這些增量可用於幫助您調整不同iOS版本(主要是iOS 7和低於7的iOS版本)上的視圖位置。
我用這些價值來幫助我喜歡這張照片。
要查看運行中的iOS 6/7 Delta,我將使用在iOS 6和iOS 7設備上正確顯示的SegmentedControl進行演示。
首先,在情節提要中選擇.Xib或ViewController。 取消選中“ 使用自動布局”,然后選擇“ 以iOS 7及更高版本查看 ”
在Interface Builder畫布中,放置SegmentedControl,使它的origin.y為20。在iOS 6/7 Delta中, 為DeltaY選擇-20。
這會將您的SegmentedControl置於iOS 6和iOS 7設備的狀態欄下方
iOS 7狀態欄開發人員指南中的另一個有用報價
可以為每個視圖和期望的工作分別設置增量。 如果將情節提要或筆尖設置為在iOS 6上查看,則在iOS 7中運行時,設置變化量將導致視圖按設置的變化量移動和/或調整大小。在iOS 7中,則增量將在iOS 6中運行時應用
如果使用的是AutoLayout,則Delta不可用。 嘗試一下(在運行iOS6的iPhone 4s中測試):
- (void) viewWillLayoutSubviews {
//iOS 6 workaround offset
if ([[[UIDevice currentDevice] systemVersion] floatValue] < 7) {
self.view.clipsToBounds = YES;
CGRect screenRect = [[UIScreen mainScreen] bounds];
CGFloat screenHeight = 0.0;
screenHeight = screenRect.size.width;
CGRect screenFrame = CGRectMake(0, -20, self.view.frame.size.width,self.view.frame.size.height+10);
self.view.frame = screenFrame;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.