Điều chỉnh kích thước phông chữ UIButton thành chiều rộng


122

Tôi có mã sau:

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];

Vấn đề là khi chuỗi trong văn bản không dài, nó hiển thị tốt (1-2 chữ số). Tuy nhiên, khi nó khá dài (3 ++ chữ số), tất cả những gì tôi có thể thấy là một nút màu đỏ, không có văn bản bên trong. Làm cách nào để điều chỉnh điều này?

Tôi không nghĩ rằng:

[button.titleLabel setAdjustsFontSizeToFitWidth:YES];

làm công việc, phải không?


Nó sẽ hoạt động, hoặc theLabel.adjustsFontSizeToFitWidth = YES.
Luke

Nó hoạt động bởititleButton.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
onmyway133

Câu trả lời:


291

Thử cái này:

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

Tôi không chắc tại sao điều này lại xảy ra thủ thuật nhưng nó có :)


1
cảm ơn, trong khi button.titleLabel.lineBreakMode = UILineBreakModeClip; <- MAGIC LINE hiện đang giảm giá
yunas

8
@yunas Thay UILineBreakModeClip với NSLineBreakByClipping
CodeReaper

1
Không, điều đó vừa làm cho nó thay đổi numberOfLinesthành 0
Marty

34
button.titleLabel.adjustsFontSizeToFitWidth = YES;

nên tự thực hiện công việc nếu bạn đang sử dụng Bố cục Tự động và đã đặt giới hạn về chiều rộng của nút.

Các tùy chọn khác (hệ số tỷ lệ tối thiểu, số dòng, v.v.) vẫn có thể được sử dụng để tùy chỉnh thêm theo nhu cầu của bạn, nhưng không bắt buộc.


15

Câu trả lời từ EliBud không hoạt động trên iOS 8. Tôi đã tìm thấy giải pháp hoạt động trên iOS 8. Dưới đây là mã nhanh:

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

Bạn có thể chơi với nhãn? .LineBreakMode vì tôi thấy rằng kết quả khác nhau đối với các chế độ nghỉ khác nhau.


.adjustsFontSizeToFitWidth = true - làm cách nào để làm điều tương tự với NSTextField và một cửa sổ có thể thay đổi kích thước?
Leo Dabus

Đó là vẻ với tôi nó như là giống như sử dụng Xcode IB chọn nhãn và seting nó để Autoshrink quy mô chữ tối thiểu để 0.01
Leo Dabus

không có tùy chọn AutoShrink khi sử dụng NSTextField
Leo Dabus

UITextField có một tùy chọn để tự động thu nhỏ văn bản, trong khi NSTextField thì không. Vì vậy, tôi nghĩ bạn cần điều chỉnh phông chữ theo cách thủ công để phù hợp với chiều rộng trường văn bản.
Alexander Belyavskiy

10

trong thời gian nhanh nhất, điều này có vẻ hiệu quả với tôi

button.titleLabel!.numberOfLines = 1
button.titleLabel!.adjustsFontSizeToFitWidth = true
button.titleLabel!.lineBreakMode = NSLineBreakMode.ByClipping

10

Giải pháp iOS 10.3 dựa trên các câu trả lời khác tại đây:

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

Chưa ai đề cập đến baselineAdjustment; Tôi cần nó vì nhãn nút bị lệch theo chiều dọc sau khi adjustsFontSizeToFitWidthcó hiệu lực. baselineAdjustmentTài liệu của Apple :

Nếu thuộc adjustsFontSizeToFitWidthtính được đặt thành true, thuộc tính này sẽ kiểm soát hoạt động của các đường cơ sở văn bản trong các tình huống cần điều chỉnh kích thước phông chữ. Giá trị mặc định của thuộc tính này là alignBaselines. Thuộc tính này chỉ có hiệu lực khi thuộc numberOfLinestính được đặt thành 1.


FWIW, tôi không bao giờ có thể căn chỉnh nhãn hoàn hảo.


8

adjustsFontSizeToFitWidth không hiệu quả với tôi cho đến khi tôi đặt giới hạn chiều rộng trên nút của mình trong Trình tạo giao diện.

Việc đặt ràng buộc đã giữ cho nút không tăng kích thước và do đó không nhận ra nó phải thu nhỏ văn bản.


8

Swift 4 phần mở rộng

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 
        }
    }
}

nhập mô tả hình ảnh ở đây


bạn sử dụng thẻ để làm gì?
Zaporozhchenko Oleksandr

Để có sẵn để làm cho getter
Nik Kov

Bạn có thể mô tả sâu hơn ý bạn là gì được không?
Zaporozhchenko Oleksandr

Tôi sử dụng thẻ như một lá cờ để xác định xem điều chỉnh có được bật hay không.
Nik Kov,

tại sao bạn không chỉ sử dụng self.titleLabel? .adjustsFontSizeToFitWidth? bạn cần thêm thứ gì để làm gì?
Zaporozhchenko Oleksandr

3

Giải pháp Xamarin.iOS

var accountButton = new UIButton();
accountButton.SetTitle("Account", UIControlState.Normal);            
accountButton.TitleLabel.AdjustsFontSizeToFitWidth = true;
accountButton.TitleLabel.Lines = 1;
accountButton.TitleLabel.LineBreakMode = UILineBreakMode.Clip;
accountButton.TitleLabel.Font = accountButton.TitleLabel.Font.WithSize(35);

Tôi đã kết thúc việc thiết lập kích thước phông chữ để đảm bảo phông chữ "lớn" trước khi hệ thống điều chỉnh kích thước cho phù hợp.


3

dựa trên câu trả lời của Nik Kov:

import UIKit


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

Điều này có hiệu quả, nhưng kích thước phông chữ ngày càng giảm đi rất nhiều, như từ 17 xuống 12. Có cách nào để tăng chiều rộng của nhãn hiệu khi chuỗi lớn hơn không?
R. Mohan

@ R.Mohan chắc chắn, nhưng điều này tất cả về chiều rộng cố định. Chỉ cần làm cho các ràng buộc không cố định, và nó sẽ phát triển. Đừng đặt cả hàng đầu / đuôi, hoặc làm cho một trong số họ> =
Zaporozhchenko Oleksandr

0

Giải pháp dưới đây phù hợp với tôi:

button.titleLabel?.adjustsFontForContentSizeCategory = true

Tài liệu dành cho nhà phát triển giải thích thuộc tính này là:

Giá trị Boolean cho biết liệu đối tượng có tự động cập nhật phông chữ của nó khi danh mục kích thước nội dung của thiết bị thay đổi hay không.


0

Trong iOS 13.1 với Swift 5, tôi cũng phải cung cấp contentEdgeInsetsđể điều chỉnh các phần đệm.

extension UIButton {
    @IBInspectable var adjustFontSizeToWidth: Bool {
        get {
            return self.titleLabel?.adjustsFontSizeToFitWidth ?? false
        }
        set {
            self.titleLabel?.numberOfLines = 1
            self.titleLabel?.adjustsFontSizeToFitWidth = newValue;
            self.titleLabel?.lineBreakMode = .byClipping;
            self.titleLabel?.baselineAdjustment = .alignCenters
            self.contentEdgeInsets = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
        }
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.