[ios] Xcode 6 크기 클래스의 사용자 정의 글꼴 크기 조정이 사용자 정의 글꼴에서 제대로 작동하지 않음

엑스 코드 6 새로운 기능 보유 폰트폰트 사이즈 의은 UILabel, UITextFieldUIButton오른쪽 스토리 보드에 현재 장치 구성의 크기 클래스에 따라 자동으로 설정 될 수있다. 예를 들어, UILabel“모든 너비, 높이 축소”(예 : 가로 방향의 iPhone) 구성에서 글꼴 크기 12를 사용하고 “일반 너비, 일반 높이”구성 (예 : iPad ) 에서 크기 18을 사용하도록 a를 설정할 수 있습니다 . 자세한 정보는 여기에서 확인할 수 있습니다.

developer.apple.com/size_class

이것은 장치 구성에 따라 UI 기능에 다른 글꼴을 프로그래밍 방식으로 설정할 필요가 없기 때문에 이론상 훌륭한 기능입니다. 지금은 장치 유형에 따라 글꼴을 설정하는 조건부 코드가 있지만 분명히 앱 전체에서 글꼴을 프로그래밍 방식으로 설정해야합니다. 그래서 처음에는이 기능에 대해 정말 흥분했지만 실제로 사용하는 데 심각한 문제가 있다는 것을 알게되었습니다 (아마도 버그 일 것입니다). SDK 8 에 대해 빌드 하고 iOS 8 의 최소 ​​배포 대상을 설정 하므로 이전 버전의 iOS와의 호환성과는 아무 관련이 없습니다.

문제는 이것입니다.
다른 크기 클래스에 대해 다른 글꼴 크기를 설정 하고 iOS 에서 제공 하는 “System”글꼴을 사용하면 모든 것이 예상대로 작동하고 크기 클래스에 따라 글꼴 크기가 변경됩니다. 내 응용 프로그램에서 제공하는 사용자 지정 글꼴을 사용하고 (예, 프로그래밍 방식으로 작동하므로 응용 프로그램 번들에 올바르게 설정되어 있음) 사용자 지정 글꼴을 XCode 6 스토리 보드레이블 로 설정하면 예상대로 작동합니다. 하지만 스토리 보드에서 다양한 크기의 클래스에 대해 다른 크기의 사용자 지정 글꼴을 사용하려고하면 갑자기 작동하지 않습니다. 구성의 유일한 차이점은 내가 선택한 글꼴 (사용자 정의 글꼴 대 시스템 글꼴)입니다. 대신 모든 글꼴이장치 및 시뮬레이터 를 크기 클래스에 관계없이 기본 크기기본 시스템 글꼴 로 사용했습니다 (그리고 디버거를 통해 스토리 보드에 지정된 실제 글꼴을 시스템 글꼴로 대체하고 있음을 확인했습니다). 따라서 기본적으로 크기 클래스 기능은 사용자 정의 글꼴에 대해 깨진 것처럼 보입니다. 또한 흥미롭게도 사용자 지정 글꼴은 실제로보기 컨트롤러의 XCode 6 “미리보기”창에서 제대로 표시되고 크기를 조정합니다. 실제 iOS 시스템에서 실행할 때만 작동이 중지됩니다 (올바르게 구성하고 있다고 생각합니다). .

여러 개의 다른 사용자 정의 글꼴을 시도했지만 어떤 글꼴에서도 작동하지 않는 것 같지만 대신 “시스템”을 사용하면 항상 작동합니다.

어쨌든, 다른 사람이 Xcode 6 에서이 문제를 본 적이 있습니까?

이것이 iOS 8, Xcode 또는 무언가의 버그인지에 대한 아이디어

내가 잘못하고 있니?

내가 찾은 유일한 해결 방법은 내가 말했듯이 약 세 가지 버전의 iOS에서와 같이 프로그래밍 방식으로 글꼴을 계속 설정하는 것입니다.

하지만이 기능을 사용자 정의 글꼴과 함께 사용할 수 있다면이 기능을 사용할 수 있기를 바랍니다. 시스템 글꼴을 사용하는 것은 우리의 디자인에 허용되지 않습니다.


추가 정보 :
Xcode 8.0부터 버그가 수정되었습니다.



답변

빠른 수정 :

1) 크기 클래스에 대한 시스템으로 글꼴 설정

라벨 속성 검사기

2) 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];
    }

}

그건 그렇고, 그것은 상징적 인 글꼴에 매우 편리한 기술입니다


답변

모든 것을 시도한 후 결국 위의 솔루션 조합을 결정했습니다. 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 스토리 보드에서 글꼴 크기를 설정할 수 있습니다.
  • (동적 테이블 뷰 행 높이에 대한 무한 루프) 및 (@cocoaNoob의 주석 참조 ) didSet의 함정을 피하기 위해 관찰자를 사용합니다.layoutSubviews()awakeFromNib()
  • 장치 관용구보다는 크기 클래스를 사용합니다. @IBDesignable
  • 슬프게도 다른 스택 기사 에 따르면 @IBDesignable작동하지 않습니다.traitCollection
  • 스택 기사를 기준 으로 UIScreen.mainScreen()하는 것이 아니라 트레이 트 수집 스위치 문이 수행됩니다.self

답변

해결 방법 에 대한 UILabel모든 크기의 클래스에 같은 글꼴 크기를 유지하는 대신 각 크기 클래스에 따라 레이블 높이를 변경합니다. 레이블에 자동 축소가 활성화되어 있어야합니다. 제 경우에는 잘 작동했습니다.


답변

이 (및 기타 Xcode-Size Classes 관련) 버그는 최근에 거대한 스토리 보드 파일을 통해 물건을 해킹해야했기 때문에 심각한 슬픔을 일으켰습니다.

이 위치에있는 다른 사람에게는 고통을 덜어주기 위해 @ razor28의 답변 위에 무언가를 추가하고 싶습니다.

사용자 정의 서브 클래스의 헤더 파일에서 IBInspectable런타임 속성에 사용 하십시오. 이렇게하면 글꼴 설정의 기본 위치 바로 위에있는 “속성 검사기”에서 이러한 속성에 액세스 할 수 있습니다.

사용 예 :

@interface MyCustomLabel : UILabel

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

@end

이것은 다음과 같은 출력을 매우 유용하게 생성합니다.

여기에 이미지 설명 입력

추가 된 이점은 이제 각 레이블에 대해 런타임 속성을 수동으로 추가 할 필요가 없다는 것입니다. 이것은 XCode의 의도 된 동작에 가장 가깝습니다. 올 여름 iOS 9에서 적절한 수정이 이루어지기를 바랍니다.


답변

@ razor28의 솔루션과 유사한 솔루션이지만 조금 더 보편적이라고 생각합니다. 또한 이전 iOS 버전에서 잘 작동합니다.

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


답변

버그는 XCode 7.0 GM에서 여전히 유효합니다.

Razor28의 솔루션은 경우에 따라 무한 루프를 발생시킵니다. 내 경험은 SwipeView 와 함께 사용하는 것입니다 .

대신 다음을 제안합니다.

1) UILabel 하위 클래스setFont 재정의 :

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

2) UILabels 의 사용자 정의 클래스설정 한 다음 시스템 글꼴을 사용하여 글꼴 크기 클래스설정합니다.

여기에 이미지 설명 입력


답변

인터페이스 빌더에서 다른 크기 클래스에 대해 글꼴을 설정하는 기능을 사용할 수 없다는 문제는 여전히 존재합니다.

원하는 장치에 따라 아래와 같이 글꼴을 설정하십시오.

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

이것은 모든 장치에서 완벽하게 작동합니다.