簡體   English   中英

更改UIButton狀態時不更新內部大小

[英]Intrinsic size not updating when changing UIButton state

我有一個包含UIButton的UIView。 UIButton為UIControlStateNormal(“Follow”)和UIControlStateSelected(“Following”)狀態設置了2個標題。 我在UIButton上使用自動布局,它有一個約束,距離超視圖頂部一定距離,另一個距離超視圖左側有一定距離。 我也使用了“尺寸適合內容”。

當我從代碼中將按鈕設置為處於選定狀態時,標題會正確更改,但UIButton的固有寬度不會更改,因此當從“Follow”更改為“Follow”時,文本會被橢圓化。

self.selected = self.following;

在此輸入圖像描述在此輸入圖像描述

當我以不同的方式處理問題時,只需在有人點擊按鈕時更改UIControlStateNormal的文本,該按鈕就會正確地改變大小。

NSString *title = (self.following) ? @"Following" : @"Follow"
[self setTitle:title forState:UIControlStateNormal];

在此輸入圖像描述在此輸入圖像描述

這是UIKit中的一個錯誤嗎? 我希望按鈕可以更改其內在大小,以便在狀態發生變化時正確反映文本的新大小,特別是因為除了2按鈕狀態的文本之外還有其他我想要更改的內容。

就像David Caunt在評論中指出的那樣,調用invalidateIntrinsicContentSize會導致autolayout調整按鈕的大小以適應它的新內容。

self.selected = self.following;
[self invalidateIntrinsicContentSize];

PS。 大衛,如果你想發布你的commant作為答案我會刪除我的。

在您的故事板中選擇您的UIButton並在頂部選擇editor-> size以適合內容大小。

編輯:試試這個:

[self.myButton setTitle:@"Following" forState:UIControlStateSelected];
[self.myButton sizeToFit];

對我來說,設置contentEdgeInsets給了我唯一可靠的解決方案。

我正在使用帶有背景圖像的自定義按鈕。 因此,切片出現在圖片中。 事實證明,切片圖像的方式也會影響內在的內容大小! 測試一下! 所以,我必須確保我在不同狀態的圖像之間切換相同。 我也在使用屬性字符串。 這里發布的解決方案對我的案例不起作用。

我在一天(!)的實驗后發現,在按鈕上設置足夠的contentEdgeInsets值使得在使用autolayout更改標題時它的行為正確。 如果您這樣做,則無需使內在內容大小無效或調用任何布局代碼。

您可以在代碼或IB中設置contentEdgeInsets。

self.button.contentEdgeInsets = UIEdgeInsetsMake(10.0, 16.0, 10.0, 16.0);

我認為Swift代碼除了var屬性外是相同的。

Apple在文檔中說明了這一點:“按鈕使用此屬性來確定intrinsicContentSize和sizeThatFits:。”。

在此輸入圖像描述

無論這是一個錯誤,還是它的方式,我不知道,但看起來你將不得不解決它 - 我不認為你做錯了什么。 如果您想在每次觸摸后在所選內容之間切換,則可以執行以下操作:

- (IBAction)buttonClick:(UIButton *)sender {
    sender.selected = !sender.selected;
    if (sender.selected) {
        [self.button setTitle:@"Following" forState:UIControlStateNormal];
        //Do whatever else you want to do here for the selected state
    }else{
        [self.button setTitle:@"Follow" forState:UIControlStateNormal];
    }
}

暫無
暫無

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

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