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?


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 :)


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.


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.


.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

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.


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.


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


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.


3

berdasarkan jawaban Nik Kov:

import UIKit


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

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.


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)
        }
    }
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.