簡體   English   中英

當我更改自動布局約束時,為什么我的 NSWindow 不調整大小?

[英]Why doesn't my NSWindow resize when I change auto layout constraints?

我想我已經對 Interface Builder (ha) 中的自動布局如何工作有了很好的理解。 我有一個 .xib,上面寫着“沒有自動布局問題”。 這是它的兩個屏幕截圖,未選擇任何內容和已選擇的內容,以便您了解工作中的限制:

在此處輸入圖片說明 在此處輸入圖片說明

現在我想,例如,減少“總縮略圖大小:”標簽和“使用 TIFF”單選按鈕矩陣之間的垂直間距。 所以我點擊一些東西來選擇那個約束,然后我編輯它的“常量”值,將它從 47 更改為 30。當我這樣做時,我希望窗口將垂直縮小 17,這樣繼續遵守所有限制條件。 相反,它改變了“大小和格式”標簽的垂直位置,這樣做打破了它的垂直限制,然后抱怨涉及一堆項目的“內容優先級歧義”; 這是該狀態的屏幕截圖,顯示了優先級的模糊性:

在此處輸入圖片說明 在此處輸入圖片說明

它希望我改變垂直壓縮阻力優先級和/或垂直擁抱優先級,以允許它壓縮/擴展某些東西而不是它的固有尺寸; 但我不想那樣做。 我希望所有這些項目都保留其固有大小,並且我希望窗口調整大小。 我可以手動調整窗口大小 -17,並將各種項目移動到適當的位置,然后再次顯示“沒有自動布局問題”; 所以這種情況真的沒有什么困難或模棱兩可的,除了出於某種原因它拒絕按應有的方式調整窗口大小。 所以,我的問題是:我如何避免它這樣做,並讓它自己調整窗口大小並正確移動東西? 我不明白為什么這么困惑; 在我看來,從窗口的頂部到底部有一條清晰、明確的垂直約束鏈,更改這些約束之一應該只是強制窗口調整大小。 我試過使用“更新框架”,但它似乎沒有幫助。

我想我已經在約束更改之前將 .xib 文件上傳到我的 Dropbox: https : //www.dropbox.com/s/vp90s1fh692i8pi/CopyThumbs.xib

我抓住了你的 xib 並嘗試了一些東西......我只能找到兩個會導致問題的項目。

但首先,有一些提示(根據我的經驗):

  • 首先讓你的窗口比你需要的大
    • 使用您的布局,使其可能為600 x 600
  • 添加 UI 元素時僅添加垂直和前導約束(我們可以稍后將取消/復制按鈕居中
    • 當然,我也指的是橫向元素間約束
  • 對於包裝多行標簽(即“選擇你想要的方式...”標簽),給它一個特定的寬度約束
    • 285對您的布局來說是一個很好的價值……您可以稍后根據需要進行調整
  • 不要給出底部約束

你的 xib 現在看起來像這樣(我把你的取消按鈕保持在你擁有的>= 50 ):

在此處輸入圖片說明

現在,您可以調整垂直間距約束,而無需擔心窗口框架的大小。

一旦您對布局感到滿意,您只需要一個 Trailing 約束(在您的多行標簽上)和一個底部約束(在 Cancel 按鈕上)。

添加這些約束,您的窗口框架自行調整大小。 如果沒有,選擇“更新框架”應該可以修復它。

我提到的兩個問題項目...您將“Matte thumbs...”和“Frame thumbs...”的 Content Hugging Priority 設置為250 這些都應該是默認值750

您的“取消/復制”按鈕根據您當前的約束水平居中。 不過,我建議將它們放在 StackView 中,然后將該 StackView Top 約束到它上面的元素,將 Bottom 約束到 Superview ......然后水平居中。


編輯

注意:我不為 Apple 工作……這些評論只是我的軼事觀察。

首先,Interface Builder的是(大家都知道)一樣的運行時輸出。 它很接近,但肯定不完全相同。

其次,IB 做了很多假設——同時,它不知道我們接下來要做什么。

iOS開發的一個完美例子:

如果在 IB 中,我向視圖添加UIScrollView而不向其添加任何內容,IB 將無休止地抱怨Content Size Ambiguity ......甚至不會定位視圖以反映約束。

那是因為 IB 不知道我將在運行時添加子視圖(具有適當的約束)。 擺脫紅色“錯誤”消息的唯一方法是在 IB 中添加一個子視圖,然后我必須在運行時立即刪除它(呃)。

IB 還傾向於抱怨/警告“固定寬度約束可能會導致裁剪”,並且正如您所遇到的,“本地化問題:缺少尾隨約束”。

我的標簽是靜態的(文本永遠不會改變)或者我是否按照我想要的方式設置了約束都沒有關系。 IB 將盡最大努力讓我相信我需要改變。

這是許多人不再使用 Storyboards / XIBs 的原因之一。 對於我的工作,我們不使用任何 XIB,我們使用的唯一 Storyboard 用於 LaunchScreen (iOS)。

我可能會在 IB 中布置一些東西來開始,並很好地了解我希望我的布局看起來如何,但隨后我將所有這些都寫在代碼中以獲得最終結果。

並不是說我說這種方法更好……很多時候當我對自己說“嘿,我可以拖放 UI 元素,添加約束和IBOutlet / IBAction連接,我已經完成了!”

不過,再次,只是我對這個話題的個人想法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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