MinimumScaleFactor ของ UILabel ทำงานอย่างไร


109

ฉันเคยใช้มาminimumFontSizeก่อน แต่ตอนนี้เลิกใช้งานฟังก์ชันนั้นแล้วและฉันไม่ค่อยเข้าใจวิธีการminimumScaleFactorทำงาน

ฉันต้องการให้ขนาดตัวอักษรสูงสุดเป็น 10 และต่ำสุดคือ 7

ฉันจะปรับขนาดให้เล็กลงเป็นขนาดฟอนต์ 7 ด้วยสเกลแฟคเตอร์ได้อย่างไร

UILabel การสร้าง:

UILabel *label = [[UILabel alloc] init];
[label setTranslatesAutoresizingMaskIntoConstraints:NO];
label.text =  [labelName uppercaseString];
label.textAlignment = NSTextAlignmentCenter;
label.textColor = [UIColor whiteColor];
label.font = [UIFont fontWithName:HELVETICA_FONT_STYLE_BOLD size:9.5];
label.backgroundColor = [UIColor clearColor];
label.minimumScaleFactor = .1f;

[label addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[label(WIDTH)]"
                                                              options:0
                                                              metrics:@{@"WIDTH" : [NSNumber numberWithFloat:buttonSize.width]}
                                                                views:NSDictionaryOfVariableBindings(label)]];

[contentView addSubview:label];

คำตอบ:


204

คุณต้องตั้งค่าไฟล์ label.adjustsFontSizeToFitWidth = YES;


1
สมบูรณ์แบบนี่คือสิ่งที่ฉันขาดหายไปในรหัสของฉันเอง ขอบคุณ: D
Fogmeister

14
หมายเหตุ: "เอกสารของ Apple ระบุว่า MinimumScaleFactor จะใช้งานได้ก็ต่อเมื่อตั้ง numberOfLines เป็น 1 โดยใช้ 0 หรืออะไรก็ตามที่มากกว่า 1 จะไม่ทำงาน" . ขอบคุณ SeanK
samthui7

สุดยอด! ตลกดีที่ถ้าคุณตั้งค่า minumumScaleFactor ใน XIB คุณไม่จำเป็นต้องตั้งค่า adjustsFontSizeToFitWidth แต่คุณต้องใช้เมื่อทำในโค้ด
Politta

104

นอกจากสิ่งที่คำตอบอื่น ๆ บอกว่าถ้าคุณใส่ MinSize / defaultSize (ส่วน) ในขณะที่มันจะเป็นเช่นเดียวกับการใช้เก่าminimumScaleFactorminimumFontSize

ตัวอย่างเช่นหากคุณต้องการให้ขนาดแบบอักษรต่ำสุดเป็น 10 โดยใช้ขนาดฉลากเริ่มต้นคุณสามารถทำได้:

[label setMinimumScaleFactor:10.0/[UIFont labelFontSize]];

(แทนที่[UIFont labelFontSize]ด้วยขนาดแบบอักษรของป้ายกำกับหากไม่ใช่ค่าเริ่มต้น)

ซึ่งจะเหมือนกับ: [label setMinimumFontSize:10.0];


ควรแบ่งส่วนเป็น CGFloat มิฉะนั้นจะไม่ทำงาน
อยู่ที่

@dwery การทำ 10 / labelSize อาจลงท้ายด้วยค่าจำนวนเต็มที่ถูกตัดทอนเป็น 0 แต่ 10.0 หรือ 10.f ทำงานได้ดีโดยไม่ต้องแคสต์อย่างชัดเจน
Kalle

คุณพูดถูกมันควรจะได้ผล ฉันจำไม่ได้ว่ารหัสใดที่ใช้ไม่ได้สำหรับฉันอาจเป็นเพราะไม่มี f หรือจุด
58

20

ตามเอกสาร :

ใช้คุณสมบัตินี้เพื่อระบุตัวคูณที่เล็กที่สุดสำหรับขนาดฟอนต์ปัจจุบันที่ให้ขนาดฟอนต์ที่ยอมรับได้เพื่อใช้เมื่อแสดงข้อความของเลเบล หากคุณระบุค่าเป็น 0 สำหรับคุณสมบัตินี้ขนาดฟอนต์ปัจจุบันจะใช้เป็นขนาดฟอนต์ที่เล็กที่สุด

ดังนั้นหากขนาดตัวอักษรเริ่มต้นสำหรับป้ายกำกับของคุณคือ10คุณใส่0.7fเป็น a minimumScaleFactorและควรทำเช่นเดียวกับที่minimumFontSizeทำ


นั่นคือสิ่งที่ฉันคิดเช่นกัน แต่ถึงแม้จะใส่เป็น 0.1f แต่ข้อความก็ไม่ปรับขนาด ฉันจะเพิ่มรหัส uilabel
Padin215

จะเกิดอะไรขึ้นถ้าคุณลบข้อ จำกัด และเพียงแค่ย่อขนาดกรอบของฉลาก?
kovpas

9
Log139: numberOfLines ของคุณตั้งค่าเป็นอะไร? เอกสารของ Apple ระบุว่า MinimumScaleFactor จะใช้งานได้ก็ต่อเมื่อตั้ง numberOfLines เป็น 1 การใช้ 0 หรืออะไรที่มากกว่า 1 จะไม่ทำงาน
SeanK

1
@SeanK มันจะทำงานได้แม้ว่า numberOfLines จะถูกตั้งค่าเป็นมากกว่า 1 แต่ไม่ใช่ 0
ก็ตาม

12

นอกจากคำตอบอื่น ๆ แล้วฉันจะเพิ่มคำอธิบายสำหรับมือใหม่ที่ช่วยตัวเอง:

วิธีคำนวณ a minimumScaleFactor? แบ่งขนาดแบบอักษรขั้นต่ำของป้ายกำกับด้วยขนาดแบบอักษรเริ่มต้นของป้ายกำกับ ตัวอย่างเช่นขนาดแบบอักษรเริ่มต้นของคุณคือ 25 ขนาดแบบอักษรขั้นต่ำของคุณคือ 10

10/25 = 0.4

0.4 คือminimumScaleFactorคุณค่าของคุณ ดูคำตอบของ @Jsdodgers ด้านบนด้วย

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