對于 MacOS 應用程式,我有一個 Window,其中包含一個NSView; 在該視圖中,我想添加一個具有恒定大小和高度的子視圖。
當通過 以編程方式加載子視圖時[myView addSubview:mySubview],我希望NSView *myView托管子視圖的大小發生變化,以便它容納子視圖,并且視窗的大小也相應地改變;這樣視窗內的 NSView 的邊緣與視窗中的周圍環境保持相同的距離。我如何最有效地實作這一目標,我必須在 IB 中指定哪些屬性才能使其發揮作用?我是否必須myView手動以編程方式調整Window 和 Window的大小,還是可以以更漂亮的方式實作這一點?
uj5u.com熱心網友回復:
有多種方法可以實作這一點。
一個簡單的方法是設定autoresizingMask您想要的值。您可以在 Interface Builder 中看到的掩碼由NSAutoresizingMaskOptions您將與位操作結合的預定義數字 ( ) 表示
view.autoresizingMask = NSViewMaxXMargin | NSViewMaxYMargin;
這類似于 IB 的這個螢屏截圖中的自動調整大小

必須在 IB 或以編程方式將Layout Translates Mask Into Constraints上的復選標記用作約束。
view.translatesAutoresizingMaskIntoConstraints = YES;
當視圖
-initWithFrame:使用給定的框架或在 IB 中設定的值創建實體并通過-initWithCoder:.
請注意,這不會阻止 IB 的自動布局機制來警告您所需的坐標、大小和約束可能與約束沖突。
uj5u.com熱心網友回復:
正如@Willeke所建議的,我需要了解并應用自動布局。為了使其在 IB 中作業,我將autoresizingMask子視圖的設定為堅持所有邊并自動調整寬度和高度。即使它可以完全在 IB 中完成,我認為以編程方式這將是
subview.autoresizingMask = NSViewWidthSizable | NSViewHeightSizeable;
正如@Ol Sen在他的回答中指出的那樣,也必須激活將掩碼轉換為約束。
為了按照開篇文章中的描述在以編程方式添加的子視圖中排列元素,我依賴嵌套的堆疊視圖并調整它們的大小,而不是調整父視圖的大小。
剩下的唯一問題是在添加之前正確調整子視圖的框架以匹配父視圖。如果省略這一步,子視圖的自動調整大小掩碼在添加時會被轉換為約束,這將導致正確的調整大小行為,但錯誤的邊距。基本代碼如下所示:
MySubViewController *subViewController = [[MySubViewController alloc] init];
subViewController.view.frame = superView.bounds; // Correct the margins
[superView addSubview:subViewController.view];
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/399405.html
上一篇:ios模擬器磁區問題
