iOS - UILayoutGuide的基本使用

weixin_34279579發表於2017-02-09

UILayoutGuide類定義了可以通過自動佈局互動的矩形區域。使用佈局指南來替換可能已建立的虛擬檢視,以在使用者介面中表示檢視間間距或封裝。

傳統上,有一些Auto Layout技術需要虛擬檢視。虛擬檢視是一個空檢視,它沒有自己的任何可視元素,只用於在檢視層次結構中定義一個矩形區域。例如,如果要使用約束來定義檢視之間的空白空間的大小或位置,則需要使用虛擬檢視來表示該空間。如果要將一組物件居中,則需要一個虛擬檢視來包含這些物件。類似地,虛擬檢視可以用於包含和封裝您的部分使用者介面。虛擬檢視可以將大型,複雜的使用者介面分解成自包含的模組化塊。當正確使用時,它們可以大大簡化您的Auto Layout約束邏輯。
在檢視層次結構中新增虛擬檢視會產生大量成本。首先,有建立和維護檢視本身的成本。第二,虛擬檢視是檢視層次結構的完整成員,這意味著它為層次結構執行的每個任務增加了開銷。最糟糕的是,不可見的虛擬檢視可以攔截用於其他檢視的訊息,導致很難找到的問題。
該UILayoutGuide課程旨在執行先前由虛意見執行的所有任務,但這樣做在一個更安全,更有效的方式。佈局指南不定義新檢視。它們不參與檢視層次結構。相反,他們只需在自己檢視的座標系中定義一個矩形區域,可以與自動佈局進行互動。

建立佈局指南

要建立佈局指南,必須執行以下步驟:

例項化新的佈局指南。

通過呼叫檢視中新增布局引導到檢視

addLayoutGuide:
的方法。

使用自動佈局定義佈局指南的位置和大小。

您可以使用這些指南來定義佈局中元素之間的間距。
以下示例顯示用於在一系列檢視之間定義等間距的佈局指南。

UILayoutGuide *space1 = [[UILayoutGuide alloc] init]; [self.view addLayoutGuide:space1]; UILayoutGuide *space2 = [[UILayoutGuide alloc] init]; [self.view addLayoutGuide:space2]; [space1.widthAnchor constraintEqualToAnchor:space2.widthAnchor].active = YES; [self.saveButton.trailingAnchor constraintEqualToAnchor:space1.leadingAnchor].active = YES; [self.cancelButton.leadingAnchor constraintEqualToAnchor:space1.trailingAnchor].active = YES; [self.cancelButton.trailingAnchor constraintEqualToAnchor:space2.leadingAnchor].active = YES; [self.clearButton.leadingAnchor constraintEqualToAnchor:space2.trailingAnchor].active = YES;

佈局指南也可以作為一個黑盒子,包含許多其他檢視和控制元件。這允許您封裝檢視的一部分,將佈局打破為模組化塊。

UILayoutGuide *container = [[UILayoutGuide alloc] init]; [self.view addLayoutGuide:container]; // 佈局容器的內容 [self.label.lastBaselineAnchor constraintEqualToAnchor:self.textField.lastBaselineAnchor].active = YES; [self.label.leadingAnchor constraintEqualToAnchor:container.leadingAnchor].active = YES; [self.textField.leadingAnchor constraintEqualToAnchor:self.label.trailingAnchor constant:8.0].active = YES; [self.textField.trailingAnchor constraintEqualToAnchor:container.trailingAnchor].active = YES; [self.textField.topAnchor constraintEqualToAnchor:container.topAnchor].active = YES; [self.textField.bottomAnchor constraintEqualToAnchor:container.bottomAnchor].active = YES; // 設定外部約束。 UILayoutGuide *margins = self.view.layoutMarginsGuide; [container.leadingAnchor constraintEqualToAnchor:margins.leadingAnchor].active = YES; [container.trailingAnchor constraintEqualToAnchor:margins.trailingAnchor].active = YES; [container.topAncor constraintEqualToAnchor:self.topLayoutGuide.bottomAnchor constant:20.0].active = YES;

相關文章