การปรับขนาดแบบอักษรที่กำหนดเองในคลาสขนาด Xcode 6 ทำงานไม่ถูกต้องกับแบบอักษรที่กำหนดเอง


104

Xcode 6มีคุณลักษณะใหม่ที่แบบอักษรและขนาดตัวอักษรในUILabel, UITextFieldและUIButtonสามารถตั้งค่าโดยอัตโนมัติตามชั้นขนาดของการกำหนดค่าอุปกรณ์ในปัจจุบันจะอยู่ในสตอรี่บอร์ด ตัวอย่างเช่นคุณสามารถตั้งค่าUILabelให้ใช้แบบอักษรขนาด 12 ในการกำหนดค่า "ความกว้างความสูงใดก็ได้" (เช่นบน iPhone ในแนวนอน) และขนาด 18 ในการกำหนดค่า "ความกว้างปกติความสูงปกติ" (เช่นบนiPad ) ดูข้อมูลเพิ่มเติมได้ที่นี่:

developer.apple.com/size_class

นี่เป็นคุณสมบัติที่ยอดเยี่ยมในทางทฤษฎีเนื่องจากอาจทำให้ไม่จำเป็นต้องตั้งค่าแบบอักษรที่แตกต่างกันโดยทางโปรแกรมบนคุณสมบัติ UI ตามการกำหนดค่าอุปกรณ์ ตอนนี้ฉันมีโค้ดเงื่อนไขบางอย่างที่ตั้งค่าฟอนต์ตามประเภทอุปกรณ์ แต่แน่นอนว่านั่นหมายความว่าฉันต้องตั้งค่าฟอนต์โดยใช้โปรแกรมทุกที่ทั่วทั้งแอพ ตอนแรกฉันรู้สึกตื่นเต้นมากเกี่ยวกับคุณสมบัตินี้ แต่ฉันพบว่ามันมีปัญหาอย่างรุนแรงในการใช้งานจริงสำหรับฉัน (อาจเป็นข้อบกพร่อง) โปรดทราบว่าฉันกำลังสร้างจากSDK 8และตั้งเป้าหมายการปรับใช้ขั้นต่ำของiOS 8ดังนั้นสิ่งนี้จึงไม่เกี่ยวข้องกับความเข้ากันได้กับ iOS เวอร์ชันเก่า

ปัญหาคือ: ถ้าฉันตั้งค่าขนาดแบบอักษรที่แตกต่างกันสำหรับคลาสขนาดต่างๆและใช้แบบอักษร "ระบบ" ที่iOSจัดหาให้ทุกอย่างทำงานได้ตามที่คาดไว้และขนาดแบบอักษรจะเปลี่ยนไปตามระดับขนาด หากฉันใช้แบบอักษรที่กำหนดเองที่แอปพลิเคชันของฉันจัดหาให้ (ใช่ฉันได้ตั้งค่าอย่างถูกต้องในชุดแอปพลิเคชันของฉันเนื่องจากทำงานโดยใช้โปรแกรม) และตั้งค่าแบบอักษรที่กำหนดเองเป็นป้ายกำกับในสตอรีบอร์ดของ XCode 6ซึ่งก็ทำงานได้ตามที่คาดไว้เช่นกัน แต่เมื่อฉันพยายามใช้ขนาดที่แตกต่างกันของแบบอักษรที่กำหนดเองสำหรับคลาสที่มีขนาดต่างกันในสตอรีบอร์ดมันก็ใช้ไม่ได้ทันที ความแตกต่างเพียงอย่างเดียวในการกำหนดค่าคือแบบอักษรที่ฉันเลือก (แบบกำหนดเองเทียบกับแบบอักษรของระบบ) แบบอักษรทั้งหมดจะปรากฏในไฟล์อุปกรณ์และตัวจำลองเป็นแบบอักษรเริ่มต้นของระบบที่ขนาดเริ่มต้นโดยไม่คำนึงถึงระดับขนาด (และฉันตรวจสอบผ่านดีบักเกอร์ว่าใช้แทนแบบอักษรของระบบสำหรับแบบอักษรจริงที่ระบุในกระดานเรื่องราว) โดยพื้นฐานแล้วคุณลักษณะของคลาสขนาดดูเหมือนจะใช้งานไม่ได้สำหรับฟอนต์ที่กำหนดเอง นอกจากนี้ที่น่าสนใจคือแบบอักษรที่กำหนดเองจะแสดงและปรับขนาดอย่างเหมาะสมในบานหน้าต่าง "Preview" ของ XCode 6 สำหรับตัวควบคุมมุมมอง: จะหยุดทำงานเฉพาะเมื่อทำงานบนระบบ iOS จริงเท่านั้น (ซึ่งทำให้ฉันคิดว่ากำลังกำหนดค่าอย่างถูกต้อง) .

ฉันลองใช้ฟอนต์ที่กำหนดเองหลายแบบและดูเหมือนจะใช้ไม่ได้กับฟอนต์ใด ๆ เลย แต่จะใช้ได้เสมอถ้าฉันใช้ "ระบบ" แทน

อย่างไรก็ตามมีใครเห็นปัญหานี้ในXcode 6หรือไม่?

มีแนวคิดว่านี่เป็นข้อบกพร่องใน iOS 8, Xcode หรืออะไรบางอย่าง

ฉันทำผิดหรือเปล่า?

วิธีแก้ปัญหาเดียวที่ฉันพบอย่างที่ฉันพูดคือตั้งค่าแบบอักษรทางโปรแกรมต่อไปเหมือนที่ฉันเคยเป็นสำหรับ iOS สามเวอร์ชันเพราะมันใช้งานได้

แต่ฉันชอบที่จะสามารถใช้คุณสมบัตินี้ได้หากสามารถใช้งานกับฟอนต์ที่กำหนดเองได้ การใช้แบบอักษรของระบบไม่เป็นที่ยอมรับสำหรับการออกแบบของเรา


ข้อมูลเพิ่มเติม: ตั้งแต่ Xcode 8.0 ข้อบกพร่องได้รับการแก้ไขแล้ว


3
ฉันสามารถยืนยันได้ว่ายังคงเป็นเช่นนี้ใน xCode 6.1 (6A1052d) app store release
jodm

3
ไม่ใช่วิธีแก้ปัญหา แต่ฉันสามารถแก้ไขปัญหาได้โดยใช้หมวดหมู่ หมวดหมู่ของฉัน UILabel + Font.h (ฉันมีปุ่มสำหรับปุ่มด้วย) มีรหัสต่อไปนี้ - (โมฆะ) AwakenFromNib {float size = [self.font pointSize]; self.font = [UIFont fontWithName: @ "YourCustomFont" ขนาด: size]; } ดังนั้นสิ่งนี้ช่วยให้เราสามารถใช้คลาสขนาดกับแบบอักษรของระบบเพื่อตั้งค่าจุดในคลาสขนาดต่างๆและหมวดหมู่จะช่วยให้มั่นใจได้ว่าตั้งค่าแบบอักษรที่ถูกต้อง บางทีคุณอาจลองทำแบบนั้นจนกว่า Apple จะออกอัปเดต
Daniel Retief Fourie

2
ยังไม่แก้ไขใน Xcode 6.3.1 ฉันโกรธเรื่องนี้
Fury

7
ยังไม่ทำงานกับ Xcode 7 ขั้นสุดท้าย ไม่เข้าใจว่าทำไม Apple ไม่แก้ไข
ernesto

5
ยังไม่ทำงานบน Xcode 7.2 iOS 9.2
Mojtaba

คำตอบ:


41

แก้ไขอย่างรวดเร็ว:

1) ตั้งค่าแบบอักษรเป็นระบบสำหรับคลาสขนาด

ผู้ตรวจสอบแอตทริบิวต์ป้ายกำกับ

2) Subclass UILabel และแทนที่เมธอด "layoutSubviews" เช่น:

- (void)layoutSubviews
{
  [super layoutSubviews];

   // Implement font logic depending on screen size
    if ([self.font.fontName rangeOfString:@"bold" options:NSCaseInsensitiveSearch].location == NSNotFound) {
        NSLog(@"font is not bold");
        self.font = [UIFont fontWithName:@"Custom regular Font" size:self.font.pointSize];
    } else {
        NSLog(@"font is bold");
        self.font = [UIFont fontWithName:@"Custom bold Font" size:self.font.pointSize];
    }

}

อย่างไรก็ตามมันเป็นเทคนิคที่สะดวกมากสำหรับฟอนต์ที่เป็นสัญลักษณ์


แม้ว่านี่จะเป็นวิธีแก้ปัญหาที่ดีหากแบบอักษรที่ใช้ในแอปเหมือนกัน แต่ก็สะดวกกว่าเล็กน้อยหากคุณต้องการใช้แบบอักษรที่แตกต่างกันในที่ต่างๆเพราะคุณต้องมีคลาสย่อยที่แตกต่างกันเป็นต้นในกรณีของฉันฉันอยู่แล้ว มีการตั้งค่าฟอนต์แบบเป็นโปรแกรมและมีหลายวิธีที่คุณสามารถทำได้ แต่ประเด็นของคำถามของฉันไม่ได้อยู่ที่การถามว่าจะทำอย่างไรโดยใช้โปรแกรม: เพื่อถามว่าเหตุใดจึงทำงานไม่ถูกต้องโดยใช้ Storyboards (เป็นข้อบกพร่องของ Apple)
โรคโลหิตจาง

@mnemia ฉันเห็นด้วย จุดมุ่งหมายของฉันคือแสดงให้เห็นวิธีหนึ่งในการจัดการกับข้อบกพร่องนั้น
razor28

1
ใช้งานได้ดี คุณไม่จำเป็นต้อง subclass UILabel แต่คุณสามารถแทนที่วิธีนี้ในมุมมองที่มีป้ายกำกับและทำself.label.font = ...วิธีนี้คุณสามารถใช้แบบอักษรที่แตกต่างกันในที่ต่างๆ
KPM

หรือคุณสามารถตั้งค่า @IBInspectable เพื่อจัดเก็บชื่อฟอนต์เพื่อนำคลาสเลเบลที่กำหนดเองเดียวกันมาใช้ซ้ำและขอฟอนต์ที่แตกต่างจากสตอรี่บอร์ดโดยตรง
Craig Grummitt

มีวิธีแก้ปัญหาที่คล้ายกันสำหรับ UITextField หรือไม่?
Chris Byatt

17

หลังจากลองทุกอย่างแล้วในที่สุดฉันก็ตัดสินใจเลือกวิธีแก้ปัญหาข้างต้นร่วมกัน ใช้ Xcode 7.2, Swift 2

import UIKit

class LabelDeviceClass : UILabel {

    @IBInspectable var iPhoneSize:CGFloat = 0 {
        didSet {
            if isPhone() {
                overrideFontSize(iPhoneSize)
            }
        }
    }

    @IBInspectable var iPadSize:CGFloat = 0 {
        didSet {
            if isPad() {
                overrideFontSize(iPadSize)
            }
        }
    }

    func isPhone() -> Bool {
        // return UIDevice.currentDevice().userInterfaceIdiom == .Phone
        return !isPad()
    }

    func isPad() -> Bool {
        // return UIDevice.currentDevice().userInterfaceIdiom == .Pad
        switch (UIScreen.mainScreen().traitCollection.horizontalSizeClass, UIScreen.mainScreen().traitCollection.verticalSizeClass) {
        case (.Regular, .Regular):
            return true
        default:
            return false
        }
    }

    func overrideFontSize(fontSize:CGFloat){
        let currentFontName = self.font.fontName
        if let calculatedFont = UIFont(name: currentFontName, size: fontSize) {
            self.font = calculatedFont
        }
    }

}
  • @IBInspectable ให้คุณกำหนดขนาดตัวอักษรใน Storyboard
  • ใช้didSetผู้สังเกตการณ์เพื่อหลีกเลี่ยงข้อผิดพลาดจาก layoutSubviews()(ลูปไม่สิ้นสุดสำหรับความสูงของแถวมุมมองตารางแบบไดนามิก) และawakeFromNib() (ดูความคิดเห็นของ @CocoNoob)
  • ใช้คลาสขนาดมากกว่าสำนวนอุปกรณ์โดยหวังว่าจะใช้สิ่งนี้ด้วยในที่สุด @IBDesignable
  • น่าเศร้าที่ใช้@IBDesignableไม่ได้traitCollectionตามบทความสแต็กอื่น ๆนี้
  • คำสั่งสวิตช์คอลเลกชันลักษณะถูกดำเนินการUIScreen.mainScreen()มากกว่าselfต่อบทความสแต็กนี้

คำตอบที่ดีที่สุด แต่เศร้าภายใต้การโหวต. ขอบคุณ
โรหิต

9

วิธีแก้ปัญหาสำหรับUILabel: ใช้ขนาดตัวอักษรเท่ากันในทุกขนาดคลาส แต่เปลี่ยนความสูงของป้ายกำกับให้สอดคล้องกันในแต่ละคลาสขนาด ฉลากของคุณต้องเปิดใช้งานเครื่องดื่มอัตโนมัติ มันใช้งานได้ดีในกรณีของฉัน


1
ฉันสามารถทำสิ่งเดียวกันนี้ได้โดยเปลี่ยนความกว้างของฉลากในแต่ละคลาสขนาด เคล็ดลับดีๆ!
dmzza

1
ฉันไม่ได้รับแบบอักษรให้ย่อขนาดโดยการตั้งค่าความสูงคงที่ที่น้อยลงสำหรับ UILabel ของฉันคุณทำให้มันทำงานได้อย่างไร? adjustsFontSizeToFitWidthดูเหมือนว่าจะใช้ได้กับความกว้างเท่านั้น (ซึ่งฉันใช้ไม่ได้เพราะข้อความของป้ายกำกับเป็นแบบไดนามิก)
ernesto

ฉันมีปัญหาเดียวกันกับการปรับให้พอดีกับความกว้าง
Jules

1
ฉันลงเอยด้วยการตั้งค่าข้อจำกัดความสูงของป้ายกำกับตามความสูงของซุปเปอร์วิว ทำงานได้ดีตราบเท่าที่คุณตั้งค่าพารามิเตอร์ "Lines" ของ Label ใน IB เป็น 0
Dorian Roy

8

ข้อผิดพลาดนี้ (และ Xcode - Size Classes อื่น ๆ ที่เกี่ยวข้อง) ทำให้ฉันเศร้าโศกเมื่อเร็ว ๆ นี้เนื่องจากฉันต้องผ่านไฟล์สตอรี่บอร์ดขนาดใหญ่ที่แฮ็กสิ่งต่างๆ

สำหรับคนอื่นที่อยู่ในตำแหน่งนี้ฉันต้องการเพิ่มคำตอบของ @ razor28 เพื่อบรรเทาความเจ็บปวด

ในไฟล์ส่วนหัวของคลาสย่อยที่คุณกำหนดเองให้ใช้IBInspectableสำหรับแอ็ตทริบิวต์รันไทม์ของคุณ ซึ่งจะทำให้สามารถเข้าถึงแอตทริบิวต์เหล่านี้ได้จาก "Attributes Inspector" ซึ่งอยู่เหนือตำแหน่งเริ่มต้นสำหรับการตั้งค่าแบบอักษร

ตัวอย่างการใช้งาน:

@interface MyCustomLabel : UILabel

    @property (nonatomic) IBInspectable NSString *fontType;
    @property (nonatomic) IBInspectable CGFloat iphoneFontSize;
    @property (nonatomic) IBInspectable CGFloat ipadFontSize;

@end

สิ่งนี้จะช่วยสร้างผลลัพธ์นี้ได้มาก:

ป้อนคำอธิบายภาพที่นี่

ข้อดีเพิ่มเติมคือตอนนี้เราไม่ต้องเพิ่มแอตทริบิวต์รันไทม์ด้วยตนเองสำหรับแต่ละป้ายกำกับ นี่เป็นสิ่งที่ใกล้เคียงที่สุดที่ฉันสามารถทำได้กับพฤติกรรมที่ตั้งใจไว้ของ XCode หวังว่าการแก้ไขที่เหมาะสมจะมาพร้อมกับ iOS 9 ในฤดูร้อนนี้


ฉันเพิ่มตามคำสั่งของคุณ แต่ฉันไม่พบการเข้าถึง "Attributes Inspector" ด้วยสายตาใน xib ดังนั้นจะทำอย่างไรจึงจะบรรลุได้
Darshan Kunjadiya

3

วิธีแก้ปัญหาคล้ายกับของ @ razor28 แต่ฉันคิดว่าเป็นสากลกว่าเล็กน้อย นอกจากนี้ยังทำงานได้ดีกับ iOS เวอร์ชันเก่า

https://gist.github.com/softmaxsg/8a3ce30331f9f07f023e


และแน่นอนว่าคุณสามารถตั้งค่าคุณสมบัติ overrideFontName ใน Interface Builder ซึ่งช่วยให้หลีกเลี่ยงการเขียนโค้ดที่ไม่จำเป็น
Vitaly

สิ่งนี้ไม่ได้ผลสำหรับฉันฉันแสดงรายการแบบอักษรที่ติดตั้งทั้งหมดภายในวิธีการข้างต้นและแบบอักษรของฉันถูกแสดงรายการและกำหนดในตัวแปร แต่ไม่ได้เปลี่ยนแบบอักษรที่แสดงในป้ายกำกับบนเครื่องจำลองและฉันถือว่าอุปกรณ์
Jules

3

ข้อบกพร่องยังคงใช้ได้ใน XCode 7.0 GM

การแก้ปัญหาของ Razor28 ทำให้เกิดลูปแบบไม่สิ้นสุดในบางกรณี ประสบการณ์ของฉันได้รับกับการใช้มันร่วมกับSwipeView

แต่ขอแนะนำให้คุณ:

1) Subclass UILabel และ override setFont:

- (void)setFont:(UIFont *)font
{
    font = [UIFont fontWithName:(@"Montserrat") size:font.pointSize];
    [super setFont:font];
}

2) ตั้งค่าคลาสที่กำหนดเองของ UILabels ของคุณจากนั้นตั้งค่าคลาสขนาดฟอนต์โดยใช้ฟอนต์ของระบบ

ป้อนคำอธิบายภาพที่นี่


@ Maarten1909 คุณกำลังอ้างถึงวิธีแก้ปัญหาหรือวิธี XCode ที่ตรงไปตรงมา? ถ้าอย่างแรกช่วยระบุรุ่นให้ฉันลองทำซ้ำได้ไหม
Foti Dim

ดูเหมือนว่าฉันจะใช้ชื่อตระกูลแบบอักษรผิดมาตลอด ปรากฎว่าในกรณีนี้ฟอนต์จะถูกรีเซ็ตเป็นฟอนต์ระบบที่มีขนาด 14.0 ไพน์ ความผิดฉันเอง. แต่อาจมีประโยชน์กับคนอื่น ๆ !
Berendschot

0

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

เพียงตั้งค่าแบบอักษรตามอุปกรณ์ที่คุณต้องการด้านล่าง:

if (Your Device is iPAd) //For iPad
{
   [yourLabel setFont:[UIFont fontWithName:@"FontName" size:FontSize]]; 
}
else  //For Other Devices then iPad
{
   [yourLabel setFont:[UIFont fontWithName:@"FontName" size:FontSize]]; 
}

ใช้งานได้ดีกับทุกอุปกรณ์


0

สิ่งเหล่านี้ไม่ได้ผลสำหรับฉัน แต่สิ่งนี้ทำได้ คุณต้องใช้แบบอักษรของระบบใน IB ด้วย

#import <UIKit/UIKit.h>

@interface UILabelEx : UILabel


@end

#import "UILabelEx.h"
#import "Constants.h"

@implementation UILabelEx

- (void) traitCollectionDidChange: (UITraitCollection *) previousTraitCollection {
    [super traitCollectionDidChange: previousTraitCollection];

    self.font = [UIFont fontWithName:APP_FONT size:self.font.pointSize];   
}
@end

0

ยังไม่มีคำตอบที่ถูกต้องลงนาม รหัสนี้ใช้ได้ดีสำหรับฉัน คุณต้องปิดใช้งานขนาดฟอนต์สำหรับคลาสขนาดในตัวสร้างอินเทอร์เฟซก่อน ใน IB คุณสามารถใช้แบบอักษรที่กำหนดเองได้

- (void) traitCollectionDidChange: (UITraitCollection *) previousTraitCollection {
    [super traitCollectionDidChange: previousTraitCollection];

    if ((self.traitCollection.verticalSizeClass != previousTraitCollection.verticalSizeClass)
        || self.traitCollection.horizontalSizeClass != previousTraitCollection.horizontalSizeClass) {

         self.textField.font = [UIFont fontWithName:textField.font.fontName size:17.f];

    }
}

0

การรวมกันของคำตอบบางส่วนในภายหลังข้างต้นมีประโยชน์ นี่คือวิธีที่ฉันแก้ไขข้อผิดพลาด IB ผ่านส่วนขยาย Swift UILabel:

import UIKit

// This extension is only required as a work-around to an interface builder bug in XCode 7.3.1
// When custom fonts are set per size class, they are reset to a small system font
// In order for this extension to work, you must set the fonts in IB to System
// We are switching any instances of ".SFUIDisplay-Bold" to "MuseoSans-700" and ".SFUIDisplay-Regular" to "MuseoSans-300" and keeping the same point size as specified in IB

extension UILabel {
    override public func traitCollectionDidChange(previousTraitCollection: UITraitCollection?) {
        super.traitCollectionDidChange(previousTraitCollection)

        if ((traitCollection.verticalSizeClass != previousTraitCollection?.verticalSizeClass) || traitCollection.horizontalSizeClass != previousTraitCollection?.horizontalSizeClass) {
            //let oldFontName = "\(font.fontName)-\(font.pointSize)"

            if (font.fontName == systemFontRegular) {
                font = UIFont(name: customFontRegular, size: (font?.pointSize)!)
                //xlog.debug("Old font: \(oldFontName) -> new Font: \(font.fontName) - \(font.pointSize)")
            }
            else if (font.fontName == systemFontBold) {
                font = UIFont(name: customFontBold, size: (font?.pointSize)!)
                //xlog.debug("Old font: \(oldFontName) -> new Font: \(font.fontName) - \(font.pointSize)")
            }
        }
    }
}

-1

ฉันใช้ Swift, XCode 6.4 นี่คือสิ่งที่ฉันทำ

import Foundation
import UIKit

    @IBDesignable class ExUILabel: UILabel {

        @IBInspectable var fontName: String = "Default-Font" {
            didSet {
                self.font = UIFont(name: fontName, size:self.font.pointSize)
            }
        }

        override func layoutSubviews() {
            super.layoutSubviews()
            self.font = UIFont(name: fontName, size:self.font.pointSize)
        }
    }
  1. Goto Designer -> Identity Inspector -> ตั้งค่าคลาสเป็น ExUILabel

  2. จากนั้นไปที่ Attribute inspector ใน designer และตั้งชื่อฟอนต์


-1

ฉันได้พบกับการแก้ไขที่เร็วยิ่งขึ้น (ฉันถือว่าคุณใช้แบบอักษรที่กำหนดเองเสมอ)

สร้างหมวดหมู่สำหรับ UILabel และรวมไว้ในไฟล์โดยใช้สตอรี่บอร์ดที่มีขนาดและการตั้งค่าแบบอักษรเฉพาะสำหรับคลาสต่างๆ:

@implementation UILabel (FontFixForSizeClassesAppleBug)

- (void)layoutSubviews
{
    [super layoutSubviews];
    if([[UIFont systemFontOfSize:10].familyName isEqualToString:self.font.familyName]) {
        //workaround for interface builder size classes bug which ignores custom font if various classes defined for label: http://stackoverflow.com/questions/26166737/custom-font-sizing-in-xcode6-size-classes-not-working-properly-w-custom-fonts
        self.font = [UIFont fontWithName:@"YOUR_CUSTOM_FONT_NAME" size:self.font.pointSize];
    }
}

@end

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


-1: ไม่ควรแทนที่วิธีการในหมวดหมู่เช่นนี้ เหตุผล: stackoverflow.com/questions/5272451/… แต่ควร swizzle (แม้ว่าจะแฮ็ค) หรือ subclass
JRG-Developer

-6

ฉันมีปัญหาเดียวกันและพบว่ามันไม่ชัดเจน แต่วิธีแก้ปัญหาที่ดี!

  1. ขั้นแรกให้คุณกำหนดขนาดฟอนต์ที่ต้องการในสตอรีบอร์ดด้วยชื่อฟอนต์ของระบบ
  2. จากนั้นป้ายกำกับนี้คุณกำหนดแท็กตั้งแต่ 100 ถึง 110 (หรือมากกว่า แต่ 10 ก็เพียงพอสำหรับฉันในตัวควบคุมมุมมองเดียวเสมอ)
  3. จากนั้นใส่รหัสนี้ลงในซอร์สไฟล์ VC ของคุณและอย่าลืมเปลี่ยนชื่อฟอนต์ รหัสอย่างรวดเร็ว
override func viewDidLayoutSubviews() {
    for i in 100...110 {
        if let label = view.viewWithTag(i) as? UILabel {
            label.font = UIFont(name: "RotondaC-Bold", size: label.font.pointSize)
        }
    }
}

1
อย่าใช้แท็ก ใช้ IBOutlets แท็กไม่ดี ดู WWDC 2015 เซสชั่น 231:“ หากคุณใช้ View With Tag หรือ Set Tag UIView API และรหัสการจัดส่งฉันขอแนะนำให้คุณหลีกเลี่ยงสิ่งนั้น แทนที่สิ่งนี้ให้ประกาศคุณสมบัติในชั้นเรียนของคุณจากนั้นคุณจะมีความเชื่อมโยงที่แท้จริงกับมุมมองเหล่านั้นที่คุณต้องการในภายหลัง”
KPM

ฉันเสียใจที่โซลูชันนี้ไม่สมบูรณ์แบบ แต่ได้ผล!
serg_ov

-8
  • เพิ่มแบบอักษรที่ได้รับจากแอปพลิเคชันลงในแอปของคุณ .plist
  • เพิ่มไฟล์. ttf ของคุณในรายการ 0
  • ใช้มัน [UIFont fontWithName: "example.ttf" size: 10]

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