stackView可以水平或垂直方向來管理一組視圖,自動更新它們放置的位置并且在窗口大小變化時變化大小。
概述
stackview使用自動布局(系統的自動布局特性)來根據你的要求管理和對齊一組視圖。要想高效使用stackview,你需要理解自動布局約束的基礎,這在《Auto Layout Guide》中有描述。
stackview的基本特性
stackview支持水平和垂直方向的布局,并且在窗口大小變化和Cocoa動畫時自動發生作用。你可以在運行時簡單配置stackview的內容。也就是說,當你在IB中創建和配置stackview后你可以動態的添加或者刪除視圖,而不用顯式地使用布局約束。比如說,如果你給一個stackview設置了3個checkbox,并且動態地增加第四個,stackview會根據自身屬性的設置,自動根據需要添加約束。新的checkbox會從stackview那獲得動態的布局設置(約束)。
stackview是可以嵌套的,一個stackview在另一個stackview的一組視圖中也是一個有效的元素。
要點
不要對stackview的私有視圖添加自視圖或者約束。stackview的私有視圖可能會在未來macOS版本中改變,并且不確保會支持NSCoder編碼解碼(encoded or decoded).
布局方向和重力區域
一個stackview有3個所謂的重力區域,每個區域分別標識堆棧視圖布局的一部分。一個水平方向的stackview(默認類型)
,有一個前向的,一個中間的(不一定是左、中、右),一個后向的重力區域。這些區域的順序取決于stackview的userInterfaceLayoutDirection屬性(繼承自NSView)。在左至右的語言中,水平stackview的前向重力區域位于左側。為了獨立于語言強制從左到右布局,需要在你的stackview實例中顯式的調用userInterfaceLayoutDirection方法。
對于垂直布局,就是用orientation屬性為NSUserInterfaceLayoutOrientationVertical(來自枚舉NSUserInterfaceLayoutOrientation)。在一個垂直的stackview中,重力區域的分是上、中、下。
視圖分離和隱藏
stackview會自動分離或者重新固定它的視圖以響應布局的變化,比如由用戶發起的窗口大小重變化,或者在相同的視圖層次結構中調整或重新定位另一個視圖。處于分離狀態的視圖不會出現在stackview的視圖層級中,但是它仍然消耗占用內存。
為了允許視圖分離,需要設置stackview所謂的clipping resistance(剪切阻力)的值低于默認值NSLayoutPriorityRequired。詳情見setClippingResistancePriority:forOrientation:方法。
你可以影響哪個視圖首先分離(并且最后重新連接)。通過設置所謂的visibility屬性給每個你想要指定分離順序的視圖。一個visibility屬性值較低的視圖會比一個值較高的視圖先 分離,并且重連接也在其之后。詳情見NSStackViewVisibilityPriority枚舉和setVisibilityPriority:forView: 方法。
要顯示的將一個視圖從stackview中分離,可以調用setVisibilityPriority:forView: 方法并給一個NSStackViewVisibilityPriorityNotVisible值。要顯式重連接一個視圖到stackview,還是調用這個方法,并給一個NSStackViewVisibilityPriorityMustHold值。如果你隱藏一個屬于stackview的視圖(通過調用視圖的hidden方法,并給YES值),視圖并不會從stackview分離。他不再可見,也不再接受輸入時間,但是它任然是視圖層級的一部分,并會繼續參與自動布局。
當一個視圖將要被分離或者被重連接時,系統會調用stackview的代理方法,來給你時機在那瞬間運行代碼。詳情見NSStackViewDelegate。
主題
初始化一個stackview
+ stackViewWithViews:
用一個特定的視圖數組來創建并返回一個stackview
響應stack相關的變化
delegate
stackview 的代理對象
NSStackViewDelegate
要想設置一個自定義類來響應視圖的分離或重連解到stackview,設置這個自定義類遵循NSStackViewDelegate協議。然后設置stackview的delegata為你的自定義類對象。
創建和設置一個stackview
- setViews:inGravity:
給一個stackview的特定重力區域設置一組視圖,替換之前這個重力區域之前的所有視圖。
alignment
stackview內部的視圖對齊方式
orientation
stackview的水平或者垂直布局方向
spacing
stackview中相鄰視圖的最小間距,以像素點為單位
edgeInsets
stackview內部的填充間距,環繞它的所有view,以像素點為單位
設置stackview的動態行為
- setClippingResistancePriority:forOrientation:
當自動布局試圖減少stackview的大小時,設置自動布局優先級,以便在stackview中防止子視圖的裁剪。
- setHuggingPriority:forOrientation:
設置堆棧視圖的自動布局優先級,以最小化它的大小,為指定的用戶界面坐標軸。
添加或移除子視圖
- addView:inGravity:
在當前stackview重力區域后面,添加一個視圖到重力區域
- insertView:atIndex:inGravity:
在指定下標位置天機一個視圖到stackview重力區域
- removeView:
從stackview中移除一個特定的視圖
在stackview中設置視圖
- customSpacingAfterView:
返回特定視圖和它后一個視圖的間距,以像素點為單位
- setCustomSpacing:afterView:
指定特定視圖和它后一個視圖的間距,以像素點為單位
- visibilityPriorityForView:
返回特定視圖的可見優先級( visibility priority )
- setVisibilityPriority:forView:
設置一個視圖的自動布局優先級以在自動布局減少stackview大小時保持和stackview的連接
檢查stackview
views
stackview擁有的一組視圖
- viewsInGravity:
返回stackview中特定重力區域的視圖數組
detachedViews
返回已經從stackview所有重力區域分離的視圖數組
- clippingResistancePriorityForOrientation:
返回當自動布局試圖減少stackview的大小時,為在stackview中拒絕裁剪視圖的自動布局優先級
- huggingPriorityForOrientation:
返回stackview為一個用戶界面坐標軸最小化大小來盡可能適應所有包含的視圖時的自動布局優先級
常量
NSUserInterfaceLayoutOrientation
兩個stackview布局方向,對于剪切阻力和hugging優先級,是兩個用戶界面坐標軸
NSStackViewGravity
在stackview中可用的各種重力區域
NSStackViewVisibilityPriority
為視圖在stackview中保持連接的各種自動布局優先級。
NSStackViewSpacingUseDefault
在stackview中的每個視圖后面指定默認間距的標志
原文鏈接