![](/img/trans.png)
[英]How to resize a parent view based on the size of subviews layouted with Autolayout
[英]Resize Window and contained NSView based on subviews size
對於 MacOS 應用程序,我有一個 Window,其中包含一個NSView
; 在該視圖中,我想添加一個具有恆定大小和高度的子視圖。
當通過[myView addSubview:mySubview]
以編程方式加載子視圖時,我希望托管子視圖的NSView *myView
改變大小以適應子視圖,並且 window 相應地改變大小; 使 Window 內部的 NSView 的邊緣與 Window 中的周圍環境保持相同的距離。 我如何最有效地實現這一點,我必須在 IB 中指定哪些屬性才能使其工作? 我是否必須手動以編程方式調整myView
和 Window 的大小,還是可以以更漂亮的方式實現這一點?
有多種方法可以實現這一目標。
一個簡單的方法是設置autoresizingMask
你想要的值。 您可以在 Interface Builder 中看到的掩碼由預定義的數字 ( NSAutoresizingMaskOptions
) 表示,您將與位操作結合使用
view.autoresizingMask = NSViewMaxXMargin | NSViewMaxYMargin;
必須在 IB 中或以編程方式對Layout Translates Mask Into Constraints進行復選標記,以便將它們用作約束。
view.translatesAutoresizingMaskIntoConstraints = YES;
當視圖被實例化時,定義與其封閉的父視圖的相對定位
-initWithFrame:
在創建實例並通過-initWithCoder:
初始化 UI 元素時使用給定的框架或在 IB 中設置的值。
請注意,這不會停止 IB 的自動布局機制來警告您所需的坐標、大小和約束可能與約束發生沖突。
正如@Willeke所建議的,我需要了解和應用自動布局。 為了讓它在 IB 中工作,我將我的子視圖的autoresizingMask
設置為堅持所有邊並自動調整寬度和高度。 即使它可以完全在 IB 中完成,我認為以編程方式這將是
subview.autoresizingMask = NSViewWidthSizable | NSViewHeightSizeable;
正如@Ol Sen在他的回答中指出的那樣, Translates Mask Into Constraints也必須被激活。
為了在以編程方式添加的子視圖中排列元素,如開篇文章中所述,我依靠嵌套的堆棧視圖並調整它們的大小而不是調整父視圖的大小。
剩下的唯一問題是在添加之前正確調整子視圖的框架以匹配父視圖。 如果忽略此步驟,則在添加子視圖時將轉換為子視圖的自動調整大小掩碼的約束將導致正確的調整大小行為,但邊距錯誤。 基本代碼如下所示:
MySubViewController *subViewController = [[MySubViewController alloc] init];
subViewController.view.frame = superView.bounds; // Correct the margins
[superView addSubview:subViewController.view];
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.