ios - priority - intrinsic content size



UIButton佔用自己的大小Autolayout (3)

我試過的是這樣的:

UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
[self.view addSubview:btn];
btn.translatesAutoresizingMaskIntoConstraints = NO;
[btn addTarget:self action:@selector(bringUpNextViewController:) 
                    forControlEvents:UIControlEventTouchUpInside];
btn.titleLabel.font = [UIFont fontWithName:@"HelveticaNeue" size:14];
[btn setTitle:@"8" forState:UIControlStateNormal];
[self.view layoutIfNeeded];

NSLog(@"button size : %@", NSStringFromCGSize(btn.frame.size));

作為輸出,我得到這個:

button size : {30, 29}

然後,我給了setTitle字符串什麼都沒有。 按鈕寬度仍然是30。

那為什麼總是這樣呢?

我也嘗試給予high compression resistance priorityhigh content hugging priority 。 不收縮。

這個問題也是因為我想簡單地根據它的內容來減小按鈕的寬度,而沒有給出任何固定的寬度。

我可以把文本的寬度和按鈕的寬度,但我不應該需要這樣做,如果按鈕佔用的內容寬度。

編輯:

它不是導致寬度為30的插槽。 鬼的價值。

https://src-bin.com


Answer #1

一個按鈕由幾個子視圖組成。 很可能按鈕的內部佈局在標籤和按鈕視圖之間有一些默認的填充。

像你這樣做一個按鈕,並檢查約束顯示如下:

button constraints (
"<NSContentSizeLayoutConstraint:0x8c40a60 H:[UIButton:0x8f29840(30)] Hug:250 CompressionResistance:750>",
"<NSContentSizeLayoutConstraint:0x8c55280 V:[UIButton:0x8f29840(29)] Hug:250 CompressionResistance:750>"
)

30和29與您看到的尺寸值相關。 該按鈕的內在內容大小屬性也返回30,29。 基本上這是一個按鈕的最小尺寸,在沒有其他的情況下。

目前還不清楚你想要什麼或者你為什麼被這個困擾。 任何更小的將是一個不好的觸摸目標,無標籤或圖像的按鈕將無形。 如果添加更長的標題,按鈕將變得更大。 如果添加其他約束來強制特定大小,則這些將覆蓋內在內容大小。

如果您希望按鈕在沒有標題時變得不可見,那麼您應該明確地隱藏它。 這使得您在代碼中的意圖更加清晰,並且可以防止用戶意外觸碰到他們看不到的按鈕。


Answer #2

你有沒有嘗試[button sizeToFit];

對於自定義按鈕,我認為你需要覆蓋:

- (CGSize)sizeThatFits:(CGSize)size;

最後,如果沒有其他的作品,你總是可以嘗試從文本大小的按鈕寬度如此

CGSize textsize = [yourText sizeWithFont:[UIFont fontWithName:@"HelveticaNeue" size:14]]; 
[button setFrame:CGRectMake(0,0,textsize.width, textsize.height)];

Answer #3

首先為故事板中的按鈕大小定義一個約束。

@property (weak, nonatomic) IBOutlet NSLayoutConstraint *buttonSizeConst;

之後,你可以將它的大小設置為任何你想要的。

self.buttonSizeConst.constant = 65.0;

編輯:用這種方法,你需要計算你的按鈕寬度,但我認為你不想這樣做。 你需要自動調整UIButton的內容。 為此,你應該給像下面的圖像約束。 當你改變你的標題時它會擴展到正確的位置。





autolayout