Sesuaikan ukuran font UIButton menjadi lebar

122

Saya memiliki kode berikut:

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

Masalahnya adalah ketika string dalam teks tidak panjang, itu menunjukkan baik-baik saja (1-2 digit). Namun, jika sudah cukup panjang (3 ++ digit), yang bisa saya lihat hanyalah tombol merah, tanpa teks di dalamnya. Bagaimana cara menyesuaikan ini?

Saya tidak berpikir bahwa:

[button.titleLabel setAdjustsFontSizeToFitWidth:YES];

melakukan pekerjaan, bukan?

adit
sumber
Ini harus bekerja, atau theLabel.adjustsFontSizeToFitWidth = YES.
Lukas
Ia bekerja olehtitleButton.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
onmyway133

Jawaban:

291

Coba ini:

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

Saya tidak yakin mengapa ini berhasil tetapi berhasil :)

elibud
sumber
1
terima kasih, sedangkan button.titleLabel.lineBreakMode = UILineBreakModeClip; <- MAGIC LINE disusutkan sekarang
yunas
8
@yunas Ganti UILineBreakModeClip dengan NSLineBreakByClipping
CodeReaper
1
Nvm, yang membuatnya berubah numberOfLinesmenjadi 0
Marty
34
button.titleLabel.adjustsFontSizeToFitWidth = YES;

harus melakukan pekerjaannya sendiri jika Anda menggunakan Tata Letak Otomatis dan telah menyetel batasan pada lebar tombol.

Opsi lainnya (faktor skala minimum, jumlah baris, dll) masih dapat digunakan untuk menyesuaikan lebih lanjut sesuai dengan kebutuhan Anda, tetapi tidak diperlukan.

joakim
sumber
15

Jawaban dari EliBud tidak berfungsi di iOS 8. Saya menemukan solusi yang berfungsi di iOS 8. Di bawah ini adalah kode cepat:

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

Anda dapat bermain dengan label? .LineBreakMode karena saya menemukan bahwa hasil bervariasi untuk mode istirahat yang berbeda.

Alexander Belyavskiy
sumber
.adjustsFontSizeToFitWidth = true - bagaimana saya bisa melakukan hal yang sama dengan NSTextField dan jendela yang dapat diubah ukurannya?
Leo Dabus
Itu terlihat bagi saya sama seperti menggunakan label pemilihan Xcode IB dan mengaturnya ke skala font minimum Autoshrink ke 0,01
Leo Dabus
tidak ada opsi AutoShrink saat menggunakan NSTextField
Leo Dabus
UITextField memiliki opsi untuk mengecilkan teks secara otomatis, sedangkan NSTextField tidak. Jadi saya pikir Anda perlu menyesuaikan font secara manual agar sesuai dengan lebar bidang teks.
Alexander Belyavskiy
10

dalam kecepatan terakhir ini tampaknya berhasil untuk saya

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

Solusi iOS 10.3 berdasarkan jawaban lain di sini:

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

Tidak ada yang disebutkan baselineAdjustment ; Saya membutuhkannya karena label tombol menjadi tidak sejajar secara vertikal setelah adjustsFontSizeToFitWidthditerapkan. baselineAdjustmentDokumentasi Apple :

Jika adjustsFontSizeToFitWidthproperti disetel ke true, properti ini mengontrol perilaku garis dasar teks dalam situasi di mana penyesuaian ukuran font diperlukan. Nilai default dari properti ini adalah alignBaselines. Properti ini hanya efektif jikanumberOfLines properti diatur ke 1.


FWIW, saya tidak pernah bisa mendapatkan label yang selaras dengan sempurna.

Anak anjing
sumber
8

adjustsFontSizeToFitWidth tidak berfungsi untuk saya sampai saya menetapkan batasan lebar pada tombol saya di Interface Builder.

Menetapkan batasan membuat tombol tidak bertambah besar dan oleh karena itu tidak menyadarinya harus mengecilkan teks.

kraftydevil.dll
sumber
8

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

masukkan deskripsi gambar di sini

Nik Kov
sumber
untuk apa kamu menggunakan tag?
Zaporozhchenko Oleksandr
Untuk tersedia untuk membuat pengambil
Nik Kov
Bisakah Anda menjelaskan lebih dalam apa yang Anda maksud?
Zaporozhchenko Oleksandr
Saya menggunakan tag seperti bendera untuk menentukan apakah penyesuaian diaktifkan.
Nik Kov
kenapa kamu tidak menggunakan self.titleLabel? .adjustsFontSizeToFitWidth? untuk apa kamu membutuhkan hal ekstra?
Zaporozhchenko Oleksandr
3

Solusi 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);

Saya akhirnya mengatur ukuran font untuk memastikan font itu "besar" sebelum sistem menyesuaikan ukuran agar pas.

ben
sumber
3

berdasarkan jawaban Nik Kov:

import UIKit


    extension UIButton {
        @IBInspectable var adjustFontSizeToWidth: Bool {
            get {
                return titleLabel!.adjustsFontSizeToFitWidth
            }
            set {
                titleLabel!.adjustsFontSizeToFitWidth = newValue
                titleLabel!.lineBreakMode             = .byClipping
            }
        }
    }
Zaporozhchenko Oleksandr
sumber
Ini berfungsi, tetapi ukuran font semakin berkurang, seperti dari 17 menjadi 12. Apakah ada cara untuk menambah lebar label judul saat string lebih besar?
R. Mohan
@ R.Mohan yakin, tapi ini semua tentang lebar tetap. Buat saja kendala tidak diperbaiki, dan itu akan tumbuh. Jangan tetapkan keduanya di depan / di belakang, atau membuat salah satunya> =
Zaporozhchenko Oleksandr
0

Solusi di bawah ini berhasil untuk saya:

button.titleLabel?.adjustsFontForContentSizeCategory = true

Dokumentasi pengembang menjelaskan properti ini sebagai:

Nilai Boolean yang menunjukkan apakah objek secara otomatis memperbarui font-nya saat kategori ukuran konten perangkat berubah.

Vinayak
sumber
0

Di iOS 13.1 dengan Swift 5, saya harus menyediakan contentEdgeInsetsjuga untuk menyesuaikan bantalan.

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)
        }
    }
}
Bharat
sumber