簡體   English   中英

界面生成器:UIView的iOS 6/7布局增量有哪些用途?

[英]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

下圖直觀地顯示了這種變化。 這是一個極端的例子,但這是證明其能力。 我只希望實踐中的增量變化只有幾個像素。

iOS7視圖

iOS6視圖

您可能會注意到,這些值與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和更早版本的人有所幫助。

閱讀此Apple的《過渡指南》-支持早期版本

選擇“查看為”到“ 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM