ios - tutorial - objective-c swift




將UIButton字體大小調整為寬度 (6)

我有以下代碼:

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(0.0, 0.0, 25, 25);

[[button layer] setCornerRadius:5.0f];
[[button layer] setMasksToBounds:YES];
[[button layer] setBackgroundColor:[[UIColor redColor] CGColor]];
[button.titleLabel setFrame:CGRectMake(0,0, 25, 25)];

[button setTitle:[NSString stringWithFormat:@"%@", [[topics objectAtIndex:indexPath.row] unread]] forState:UIControlStateNormal];

問題是,當文本中的字符串不長時,它顯示正常(1-2位數)。 但是,當它很長(3 ++數字)時,我只能看到一個紅色按鈕,裡面沒有文字。 我該如何調整?

我不這麼認為:

[button.titleLabel setAdjustsFontSizeToFitWidth:YES];

這份工作,對嗎?


Swift 4擴展

extension UIButton {
    @IBInspectable var adjustFontSizeToWidth: Bool {
        get {
            return self.titleLabel?.adjustsFontSizeToFitWidth
        }
        set {
            self.titleLabel?.numberOfLines = 1
            self.titleLabel?.adjustsFontSizeToFitWidth = newValue;
            self.titleLabel?.lineBreakMode = .byClipping;
            self.titleLabel?.baselineAdjustment = .alignCenters 
        }
    }
}


EliBud的答案在iOS 8上不起作用。我找到了一個適用於iOS 8的解決方案。下面是一個快速的代碼:

let label = self.button?.titleLabel
label?.minimumScaleFactor = 0.01
label?.adjustsFontSizeToFitWidth = true
label?.font = UIFont.systemFontOfSize(100)

您可以使用標籤?.lineBreakMode,因為我發現不同的休息模式的結果會有所不同。


嘗試這個:

button.titleLabel.numberOfLines = 1;
button.titleLabel.adjustsFontSizeToFitWidth = YES;
button.titleLabel.lineBreakMode = NSLineBreakByClipping; //<-- MAGIC LINE

我不知道為什麼這樣做但它確實:)


在我在Interface Builder中的按鈕上設置寬度約束之前, adjustsFontSizeToFitWidth對我不起作用。

設置約束使按鈕的大小不變,因此沒有意識到它必須縮小文本。


基於Nik Kov的回答:

import UIKit


    extension UIButton {
        @IBInspectable var adjustFontSizeToWidth: Bool {
            get {
                return titleLabel!.adjustsFontSizeToFitWidth
            }
            set {
                titleLabel!.adjustsFontSizeToFitWidth = newValue
                titleLabel!.lineBreakMode             = .byClipping
            }
        }
    }

基於其他答案的iOS 10.3解決方案:

    button.titleLabel!.numberOfLines = 1
    button.titleLabel!.adjustsFontSizeToFitWidth = true
    button.titleLabel!.baselineAdjustment = .alignCenters

還沒有人提到baselineAdjustment ; 我需要它,因為在adjustsFontSizeToFitWidth生效後,按鈕標籤變得垂直未對齊。 Apple的baselineAdjustment文檔:

如果adjustsFontSizeToFitWidth屬性設置為true ,則此屬性控制在需要調整字體大小的情況下文本基線的行為。 此屬性的默認值為alignBaselines 。 僅當numberOfLines屬性設置為1時,此屬性才有效。

FWIW,我永遠無法讓標籤完美對齊。







objective-c