ปรับขนาดตัวอักษร UIButton เป็นความกว้าง


122

ฉันมีรหัสต่อไปนี้:

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

ได้งานใช่ไหม?


ควรใช้งานได้หรือ theLabel.adjustsFontSizeToFitWidth = YES
ลุ

ทำงานโดยtitleButton.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
onmyway133

คำตอบ:


291

ลองสิ่งนี้:

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

ฉันไม่แน่ใจว่าทำไมจึงเป็นเคล็ดลับ แต่มันก็เป็นเช่นนั้น :)


1
ขอบคุณในขณะที่ button.titleLabel.lineBreakMode = UILineBreakModeClip; <- MAGIC LINE หมดค่าเสื่อมแล้ว
ยูนา

8
@yunas แทนที่ UILineBreakModeClip ด้วย NSLineBreakByClipping
CodeReaper

1
Nvm ที่เพิ่งเปลี่ยนnumberOfLinesเป็น 0
Marty

34
button.titleLabel.adjustsFontSizeToFitWidth = YES;

ควรดำเนินการด้วยตัวเองหากคุณใช้เค้าโครงอัตโนมัติและได้กำหนดข้อ จำกัด เกี่ยวกับความกว้างของปุ่ม

ตัวเลือกอื่น ๆ (ตัวคูณขนาดขั้นต่ำจำนวนบรรทัด ฯลฯ ) ยังสามารถใช้เพื่อปรับแต่งเพิ่มเติมตามความต้องการของคุณได้ แต่ไม่จำเป็นต้องใช้


15

คำตอบจาก EliBud ใช้ไม่ได้บน iOS 8 ฉันพบวิธีแก้ปัญหาที่ใช้ได้กับ iOS 8 ด้านล่างนี้คือรหัสที่รวดเร็ว:

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

คุณสามารถเล่นกับ label? .lineBreakMode เนื่องจากฉันพบว่าผลลัพธ์แตกต่างกันไปสำหรับโหมดพักที่แตกต่างกัน


.adjustsFontSizeToFitWidth = true - ฉันจะทำเช่นเดียวกันกับ NSTextField และหน้าต่างที่ปรับขนาดได้อย่างไร
Leo Dabus

สำหรับฉันแล้วมันเหมือนกับการใช้ Xcode IB โดยเลือกป้ายกำกับและตั้งค่าให้ Autoshrink ขนาดตัวอักษรขั้นต่ำเป็น 0.01
Leo Dabus

ไม่มีตัวเลือก AutoShrink เมื่อใช้ NSTextField
Leo Dabus

UITextField มีตัวเลือกในการย่อขนาดข้อความอัตโนมัติในขณะที่ NSTextField ไม่มี ฉันคิดว่าคุณต้องปรับแบบอักษรด้วยตนเองเพื่อให้พอดีกับความกว้างของช่องข้อความ
Alexander Belyavskiy

10

อย่างรวดเร็วล่าสุดสิ่งนี้ดูเหมือนจะใช้ได้กับฉัน

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

10

โซลูชัน iOS 10.3 ขึ้นอยู่กับคำตอบอื่น ๆ ที่นี่:

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

baselineAdjustmentยังไม่มีใครพูดถึง; ฉันต้องการมันเนื่องจากป้ายกำกับปุ่มกลายเป็นแนวตั้งไม่ตรงแนวหลังจากadjustsFontSizeToFitWidthมีผลบังคับใช้ baselineAdjustmentเอกสารของ Apple :

ถ้าadjustsFontSizeToFitWidthคุณสมบัติถูกตั้งค่าเป็นคุณสมบัตินี้จะtrueควบคุมลักษณะการทำงานของเส้นบรรทัดข้อความในสถานการณ์ที่จำเป็นต้องปรับขนาดฟอนต์ alignBaselinesค่าเริ่มต้นของคุณสมบัตินี้คือ สถานที่แห่งนี้จะมีผลเฉพาะเมื่อมีการตั้งค่าคุณสมบัติnumberOfLines1


FWIW ฉันไม่สามารถจัดวางป้ายกำกับได้อย่างสมบูรณ์แบบ


8

adjustsFontSizeToFitWidth ใช้งานไม่ได้สำหรับฉันจนกว่าฉันจะกำหนดข้อ จำกัด ด้านความกว้างบนปุ่มของฉันในตัวสร้างอินเทอร์เฟซ

การตั้งค่าข้อ จำกัด ทำให้ปุ่มไม่มีขนาดใหญ่ขึ้นดังนั้นจึงไม่ทราบว่าปุ่มนั้นต้องย่อขนาดข้อความ


8

ส่วนขยาย 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 
        }
    }
}

ใส่คำอธิบายภาพที่นี่


คุณใช้แท็กเพื่ออะไร
Zaporozhchenko Oleksandr

สำหรับพร้อมที่จะทำให้ได้รับ
Nik Kov

ช่วยอธิบายให้ละเอียดกว่านี้ได้ไหมว่าคุณหมายถึงอะไร
Zaporozhchenko Oleksandr

ฉันใช้แท็กเหมือนแฟล็กเพื่อกำหนดว่าการปรับเปิดใช้งานหรือไม่
Nik Kov

ทำไมคุณไม่ใช้ self.titleLabel? .adjustsFontSizeToFitWidth? คุณต้องการอะไรเพิ่มเติม?
Zaporozhchenko Oleksandr

3

โซลูชัน 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);

ฉันลงเอยด้วยการตั้งค่าขนาดตัวอักษรเพื่อให้แน่ใจว่าแบบอักษร "ใหญ่" ก่อนที่ระบบจะปรับขนาดให้พอดี


3

จากคำตอบของ Nik Kov:

import UIKit


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

วิธีนี้ได้ผล แต่ขนาดตัวอักษรจะลดลงมากเช่นจาก 17 เป็น 12 มีวิธีใดในการเพิ่มความกว้างของป้ายชื่อเมื่อสตริงใหญ่ขึ้นหรือไม่?
อาร์โมฮัน

@ R.Mohan แน่นอน แต่ทั้งหมดนี้เกี่ยวกับความกว้างคงที่ เพียงแค่ทำให้ข้อ จำกัด ไม่ได้รับการแก้ไขและมันจะเติบโต อย่าตั้งทั้งนำหน้า / ต่อท้ายหรือสร้างอย่างใดอย่างหนึ่ง> =
Zaporozhchenko Oleksandr

0

โซลูชันด้านล่างใช้ได้ผลสำหรับฉัน:

button.titleLabel?.adjustsFontForContentSizeCategory = true

เอกสารสำหรับนักพัฒนาอธิบายคุณสมบัตินี้ว่า:

ค่าบูลีนที่ระบุว่าออบเจ็กต์อัปเดตแบบอักษรโดยอัตโนมัติหรือไม่เมื่อประเภทขนาดเนื้อหาของอุปกรณ์เปลี่ยนไป


0

ใน iOS 13.1 พร้อม Swift 5 ฉันต้องเตรียมcontentEdgeInsetsการปรับแพดดิ้งด้วย

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)
        }
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.