Xcode 6 크기 클래스의 사용자 정의 글꼴 크기 조정이 사용자 정의 글꼴에서 작동하지 않음
Xcode 6에는 UILabel, UITextField 및 UIButton의 글꼴 및 글꼴 크기가 스토리 보드에서 바로 현재 장치 구성의 크기 클래스에 따라 자동으로 설정 될 수있는 새로운 기능이 있습니다. 예를 들어, "모든 너비, 높이 축소"(예 : 가로의 iPhone) 구성에서 글꼴 크기 12를 사용하고 "일반 너비, 일반 높이"구성 (예 : iPad)에서 UILabel을 사용할 수 있습니다. . 자세한 정보는 여기에서 확인할 수 있습니다.
설치 장치 구성에 따라 UI 기능에 다른 글꼴을 프로그래밍 방식으로 접근 할 수 있기 때문에 이론상 정말 기능입니다. 지금은 장치 유형에 따라 글꼴을 설정하는 조건부 코드가 분명히 앱 전체에서 글꼴을 프로그래밍 방식으로 설정해야합니다. 그래서 처음에는 정말 흥미로 웠지만 실제 사용에 심각한 문제가 버그 일 것입니다. SDK 8에 대해 빌드하고 iOS 8의 최소 배포 대상을 설정하고 이전 버전의 iOS와의 관련이 없습니다.
문제는 이것입니다. 다른 크기 클래스에 대해 다른 글꼴 크기를 설정하고 iOS에서 제공하는 "시스템"글꼴을 사용하면 모든 것이 예상대로 작동하고 크기 클래스에 따라 글꼴 크기가 변경됩니다. 내 응용 프로그램에서 사용하는 사용자 지정 글꼴 (예, 프로그래밍 방식으로 보드 작동 응용 프로그램 프로그램 제공) 사용자 지정 글꼴이 설정되어 있음 XCode 6 스토리의 레이블로 설정 예상대로 작동합니다. 하지만 스토리 보드에서 다양한 크기의 클래스에 대해 다른 크기의 사용자 지정 글꼴을 사용하려고합니다. 구성의 유일한 차이점은 내가 선택한 글꼴 (사용자 정의 글꼴 대 시스템 글꼴)입니다. 대신 모든 글꼴이 장치 및 시뮬레이터에 기본 크기의 기본 시스템 글꼴로 표시됩니다. 크기 클래스에 관계없이 (그리고 디버거를 통해 스토리 보드에 지정된 실제 글꼴을 시스템 글꼴로 대체하고 있음을 확인했습니다). 멋진 것처럼 보이네요. 또한 흥미롭게도 사용자 지정 글꼴은 실제로보기 컨트롤러의 XCode 6 "미리보기"창에서 제대로 표시되고 크기를 조정합니다. iOS 시스템에서 실행 중일 때만 작동이 중지됩니다 (내가 구성하고 실행 중일합니다). 바르게).
작동하지 않는 것 같지만 대신 "시스템"을 사용하면 항상 작동합니다.
어쨌든, Xcode 6 에서이 문제를 본 사람이 있습니까? 이것이 iOS 8, Xcode의 버그인지 또는 내가 뭘 잘못하고 있는지에 대한 아이디어가 있습니까? 내가 유일한 해결 방법은 내가 말한 것처럼 약 3 버전의 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 클래스 관련) 버그는 최근에 거대한 스토리 보드 파일을 통해 물건을 해킹해야 때문에 심각한 슬픔을 일 으세요습니다.
이 위치에있는 다른 사람에게 고통을 덜어주기 위해 @ 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]];
}
이것은 모든 장치에서 완벽하게 작동합니다.
이것들 중 어느 것도 나를 위해 일하지 않았지만 이것은 효과가있었습니다. 또한 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
아직 서명 된 정답이 없습니다. 이 코드는 저에게 잘 작동합니다. 먼저 인터페이스 빌더에서 크기 클래스의 글꼴 크기를 비활성화해야합니다. 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];
}
}
위의 이후 답변 중 일부의 조합이 도움이되었습니다. Swift UILabel 확장을 통해 IB 버그를 해결 한 방법은 다음과 같습니다.
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)")
}
}
}
}
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)
}
}
Goto Designer-> Identity Inspector-> 클래스를 ExUILabel로 설정
그런 다음 디자이너의 속성 관리자로 이동하여 글꼴 이름을 설정합니다.
더 빠른 수정을 제안했습니다 (항상 하나의 사용자 지정 글꼴을 사용한다고 가정합니다).
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
스토리 보드에서 사용자 지정 글꼴을 사용하기 만하면됩니다. 버그가있는 인터프리터가 시스템 글꼴을 대신 사용하면이 범주가 사용자 지정 글꼴로 전환합니다.
나는 똑같은 문제가 있었고 정말로 명확하지는 않지만 훌륭한 해결책을 찾았습니다!
- 먼저 시스템 글꼴 이름으로 스토리 보드에 필요한 글꼴 크기를 설정합니다.
- 그런 다음이 레이블에 100에서 110까지의 태그를 할당합니다 (또는 그 이상이지만 하나의 뷰 컨트롤러에서는 항상 10으로 충분합니다).
- 그런 다음이 코드를 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) } } }
- 응용 프로그램에서 제공하는 글꼴을 app .plist에 추가하십시오.
- .ttf 파일을 항목 0에 추가하십시오.
- 그것을 사용하십시오 [UIFont fontWithName : "example.ttf"size : 10]
'IT' 카테고리의 다른 글
| 호출 된 개체와 클라이언트의 연결이 더 이상 발생하지 않습니다. (0) | 2020.08.15 |
|---|---|
| F # 및 C # 모두에서 사용할 F # 라이브러리를 디자인하는 가장 좋은 방법 (0) | 2020.08.15 |
| HTTP 401- 적절한 WWW-Authenticate 헤더 값은 무엇입니까? (0) | 2020.08.15 |
| Xcode는 C 및 Objective-C 코드 만 리팩터링 할 수 있습니다. (0) | 2020.08.15 |
| Git에 티타임이있는 이유는 무엇입니까? (0) | 2020.08.15 |