UIButton yazı tipi boyutunu genişliğe ayarlayın


122

Takip koduna sahibim:

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

Sorun, metindeki dizge uzun olmadığında iyi (1-2 hane) göstermesidir. Ancak, oldukça uzun olduğunda (3 ++ rakam), görebildiğim tek şey içinde metin olmayan kırmızı bir düğme. Bunu nasıl ayarlayabilirim?

Ben öyle düşünmüyorum:

[button.titleLabel setAdjustsFontSizeToFitWidth:YES];

iş, değil mi?


Çalışmalı veyaLabel.adjustsFontSizeToFitWidth = YES olmalıdır.
Luke

ÇalışıyortitleButton.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
onmyway133

Yanıtlar:


291

Bunu dene:

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

Bunun neden işe yaradığından emin değilim ama işe yarıyor :)


1
teşekkürler, oysa button.titleLabel.lineBreakMode = UILineBreakModeClip; <- MAGIC LINE artık amortismana tabi
tutuldu

8
@yunas UILineBreakModeClip'i NSLineBreakByClipping ile değiştirin
CodeReaper

1
Nvm, az numberOfLinesönce 0'a değiştirdi
Marty

34
button.titleLabel.adjustsFontSizeToFitWidth = YES;

Otomatik Yerleşim kullanıyorsanız ve düğmenin genişliğinde bir sınırlama ayarladıysanız işi kendi başına yapmalısınız .

Diğer seçenekler (minimum ölçek faktörü, satır sayısı vb.) Yine de ihtiyaçlarınıza göre özelleştirmek için kullanılabilir, ancak gerekli değildir.


15

EliBud'un cevabı iOS 8'de çalışmıyor. İOS 8'de çalışan bir çözüm buldum. Aşağıda hızlı bir kod var:

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

? .LineBreakMode etiketiyle oynayabilirsiniz, çünkü sonuçların farklı kesme modları için değişiklik gösterdiğini gördüm.


.adjustsFontSizeToFitWidth = true - aynısını bir NSTextField ve yeniden boyutlandırılabilir bir pencere ile nasıl yapabilirim?
Leo Dabus

Bu bana, Xcode IB'yi kullanarak etiket seçip bunu Autoshrink minimum yazı tipi ölçeğini 0,01 olarak ayarlamakla aynı görünüyor
Leo Dabus

NSTextField kullanılırken AutoShrink seçeneği yoktur
Leo Dabus

UITextField, metni otomatik olarak küçültme seçeneğine sahipken, NSTextField bunu yapmaz. Bu yüzden yazı tipini metin alanı genişliğine uyacak şekilde manuel olarak ayarlamanız gerektiğini düşünüyorum.
Alexander Belyavskiy

10

son hızla bu benim için işe yarıyor gibi görünüyor

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

10

Buradaki diğer yanıtlara göre iOS 10.3 çözümü:

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

baselineAdjustmentHenüz kimse bahsetmedi ; Buna ihtiyacım vardı çünkü düğme etiketi adjustsFontSizeToFitWidthyürürlüğe girdikten sonra dikey olarak yanlış hizalanmış hale geliyor . Apple'ın baselineAdjustmentbelgeleri:

Eğer adjustsFontSizeToFitWidthmülkiyet ayarlandığında true, bu özellik denetimleri yazı tipi boyutunun ayarlanması gereklidir durumlarda metin temelinin bir davranış. Bu özelliğin varsayılan değeri alignBaselines. Bu özellik, yalnızca numberOfLinesözellik olarak ayarlandığında etkilidir 1.


FWIW, etiketi asla mükemmel bir şekilde hizalayamadım.


8

adjustsFontSizeToFitWidth Arabirim Oluşturucu'daki düğmemde bir genişlik sınırlaması ayarlayana kadar benim için çalışmıyordu.

Kısıtlamayı ayarlamak, düğmenin boyutunun büyümesini engelledi ve bu nedenle metni küçültmek zorunda olduğunun farkına varmadı.


8

Swift 4 uzantısı

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

görüntü açıklamasını buraya girin


etiketi ne için kullanıyorsun?
Zaporozhchenko Oleksandr


Ne demek istediğini daha derin anlatır mısın lütfen?
Zaporozhchenko Oleksandr

Ayarlamanın etkin olup olmadığını tanımlamak için etiketi bir bayrak gibi kullanıyorum.
Nik Kov

neden sadece self.titleLabel kullanmıyorsunuz? .adjustsFontSizeToFitWidth? ne için fazladan bir şeye ihtiyacın var?
Zaporozhchenko Oleksandr

3

Xamarin.iOS çözümü

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

Sistem boyutu sığacak şekilde ayarlamadan önce yazı tipinin "büyük" olmasını sağlamak için yazı tipi boyutunu ayarladım.


3

Nik Kov'un cevabına göre:

import UIKit


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

Bu işe yarıyor, ancak yazı tipi boyutu, 17'den 12'ye kadar çok düşüyor. Dize daha büyük olduğunda başlık etiketinin genişliğini artırmanın bir yolu var mı?
R. Mohan

@ R.Mohan elbette, ama bu tamamen sabit genişlikle ilgili. Sadece kısıtlamaları sabitlemeyin ve büyüyecektir. Her ikisini de öne / arkaya ayarlamayın veya bunlardan birini yapmayın> =
Zaporozhchenko Oleksandr

0

Aşağıdaki çözüm benim için çalıştı:

button.titleLabel?.adjustsFontForContentSizeCategory = true

Geliştirici belgeleri bu özelliği şu şekilde açıklamaktadır:

Cihazın içerik boyutu kategorisi değiştiğinde nesnenin yazı tipini otomatik olarak güncelleyip güncellemediğini gösteren bir Boolean değeri.


0

Swift 5 ile iOS contentEdgeInsets13.1'de, dolguları ayarlamayı da sağlamam gerekiyordu .

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)
        }
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.