스토리 보드에서 사용자 지정 글꼴이있는 특성 문자열이 올바르게로드되지 않음


100

우리는 프로젝트에서 사용자 정의 글꼴을 사용하고 있습니다. Xcode 5에서 잘 작동합니다. Xcode 6에서는 코드의 문자열 속성 인 일반 텍스트로 작동합니다. 그러나 스토리 보드에 설정된 해당 문자열은 시뮬레이터 또는 장치에서 실행할 때 모두 Helvetica로 되돌아갑니다.

Xcode 6 또는 iOS 8 SDK의 버그인지 확실하지 않거나 Xcode 6 / iOS 8에서 사용자 지정 글꼴 사용 방법이 변경 되었습니까?


여기에도 같은 문제가 있습니다. 무슨 일인지 알고 싶어요.
obeattie 2014 년

1
지금은 GLMarkdownLabel이라는 사용자 지정 UILabel을 만들고 IBInspectable을 사용하여 일부 속성을 내 보낸 다음 스토리 보드에서 마크 다운 문자열을 설정하고 nib에서 깨어날 때 마크 다운 문자열을 특성이있는 문자열로 다시 변환합니다.
Allen Hsu

이제 장기적인 해결책이며 Apple이 다음 버전의 Xcode에서이 버그를 수정하기를 바랍니다.
Allen Hsu

Yikes, 그런 잔인 함. 하지만 격리 된 문제가 아니라는 것을 알려 주셔서 감사합니다. 레이더가 있습니까?
obeattie 2014 년

1
해결 방법은 결국 속성 레이블에 IBCustomFonts 를 사용하는 입니다.
yonix

답변:


30

나를위한 해결책은 IBDesignable수업 을 사용하는 것이 었습니다 .

import UIKit

@IBDesignable class TIFAttributedLabel: UILabel {

    @IBInspectable var fontSize: CGFloat = 13.0

    @IBInspectable var fontFamily: String = "DIN Light"

    override func awakeFromNib() {
        var attrString = NSMutableAttributedString(attributedString: self.attributedText)
        attrString.addAttribute(NSFontAttributeName, value: UIFont(name: self.fontFamily, size: self.fontSize)!, range: NSMakeRange(0, attrString.length))
        self.attributedText = attrString
    }
}

Interface Builder에서 다음을 제공합니다.

속성 문자열이있는 Interface Builder 사용자 정의 글꼴

평상시처럼 attributestring을 설정할 수 있지만 사용 가능한 새 속성에서 fontsize 및 fontfamily를 다시 한 번 설정해야합니다.

Interface Builder는 기본적으로 사용자 지정 글꼴로 작업하므로 결과적으로 표시되는 내용 이 표시됩니다. 애플리케이션을 구축 할 때 내가 좋아하는.

노트

평범한 버전 대신 이것을 사용하는 이유는 평범한 스타일을 사용할 때 사용할 수없는 linespacing과 같은 특성 레이블에 속성을 설정하기 때문입니다.


1
귀하의 솔루션은 레이블에 대해 하나의 글꼴 패밀리와 크기 만 지원합니다. 그러면 대신 일반 텍스트를 사용하지 않는 이유는 무엇입니까?
Allen Hsu 2014

마찬가지로 @IBInspectable글꼴과 크기 대신 속성을 일시적으로 사용 하고 있습니다. 우리는이 markdownText대부분의 시간, 우리는 굵게 또는 밑줄 텍스트 문자열을 기인 사용하기 때문에, 속성을. 그런 다음 마크 다운 텍스트를 일반 텍스트에 대해 설정된 글꼴 및 크기 정보가있는 속성 문자열로 구문 분석합니다.
Allen Hsu

@AllenHsu, 당신 말이 맞아요. 그것에 대해 언급하지 않았지만 내 레이블에 기여 된 줄 간격을 사용하고 있습니다. Offcourse, 다른 그냥 평범한 스타일 : 사용합니다
앙투안

좋은 점, 우리는 lineSpacing도 내보냈습니다. : p 실제로 Xcode의 버그이기 때문에 귀하의 답변을 받아 들일 것이라고 생각하며 현재로서는 더 나은 해결책이 없습니다. 다음 버전의 Xcode를 기다리겠습니다.
Allen Hsu 2014

2
텍스트의 일부를 굵게 표시하려면 작동하지 않습니다
xtrinch

28

가장 간단한 대답은 글꼴을 FontBook으로 드래그하는 것입니다. 글꼴이 프로젝트에는 있지만 컴퓨터의 FontBook에는없는 경우 IB는 가끔 찾는 데 문제가 있습니다. 이상하지만 여러 번 나를 위해 일했습니다.


17
이렇게하면 Xcode가 사용자 정의 글꼴을 선택할 수 있지만 실제로는 작동하지 않습니다. 런타임시 예상 한대로 글꼴이 사용되지 않습니다.
다니엘

불행히도 나는 해결 방법을 찾지 못했습니다. 제가 할 수있는 최선은 Apple에 버그를 기록하는 것이 었습니다.
Daniel

예, 이것이 수정되었습니다. 다른 개발자가 디자인 한 스토리 보드를 가지고 있었는데 svn 업데이트는 괜찮 았지만 UI에서 글꼴을 얻지 못했습니다. 글꼴이 리소스에 있지만 장치 / 시뮬레이터 UI에 표시되지 않았습니다. 그는 속성 문자열을 사용하기 때문에 글꼴 북에 있어야합니다. 그것은 문제를 해결합니다.
karim

예. 이것은 동일한 문제를 해결하는 데 도움이됩니다. 글꼴 북에 사용자 정의 글꼴을 추가하면 매력처럼 작동합니다.
Sushant Jagtap 2018

1
이 솔루션은 경우에 따라 작동하지만 동일한 글꼴 패밀리를 사용하는 동일한 프로젝트에서 @Daniel과 동일한 문제에 직면했습니다. XCode는이 문제를 해결해야합니다.
dey.shin

16

서체 목록에 사용자 정의 서체를 추가 할 수 있습니다.

1 단계 : 글꼴 관리를 클릭합니다. 글꼴 북이 열립니다.

여기에 이미지 설명 입력

2 단계 : 더하기를 클릭하고 글꼴을 추가합니다.

여기에 이미지 설명 입력

다음에 속성 텍스트가있는 글꼴을 클릭하면 새로 추가 된 글꼴도 목록에 표시됩니다. 그러나 info.plist 및 번들 리소스에 사용자 정의 글꼴이 추가되었는지 확인하십시오.


이것은 스토리 보드에서 작동하지만 실행 후 형식이 표시되지 않습니다
Van

1
@Van 형식화? 더 말씀해 주시겠습니까? 작동하지 않을 때?
mahbaleshwar hegde

rgualr과 굵은 글꼴이 혼합 된 텍스트를 설정해야합니다. 위의 솔루션을 사용했기 때문에 스토리 보드에서 작동했지만 앱을 실행하면 레이블이 적용된 글꼴을 표시하지 않고 시스템 글꼴을 표시합니다
Van

info.plist에 사용자 정의 글꼴을 추가 했습니까? 그 후 모든 글꼴 패밀리를 인쇄하십시오
mahbaleshwar hegde

2
예. 일반 텍스트의 경우 앱 전체에서 사용자 지정 글꼴을 설정할 수 있습니다. 특성 텍스트를 설정해야합니다
Van

5

이 스레드 덕분에이 솔루션에 도달했습니다.

private let fontMapping = [
    "HelveticaNeue-Medium": "ITCAvantGardePro-Md",
    "HelveticaNeue": "ITCAvantGardePro-Bk",
    "HelveticaNeue-Bold": "ITCAvantGardePro-Demi",
]

func switchFontFamily(string: NSAttributedString) -> NSAttributedString {
    var result = NSMutableAttributedString(attributedString: string)
    string.enumerateAttribute(NSFontAttributeName, inRange: NSRange(location: 0, length: string.length), options: nil) { (font, range, _) in
        if let font = font as? UIFont {
            result.removeAttribute(NSFontAttributeName, range: range)
            result.addAttribute(NSFontAttributeName, value: UIFont(name: fontMapping[font.fontName]!, size: font.pointSize)!, range: range)
        }
    }
    return result
}

1
좋은 생각. 이것이 Apple에서 깨 졌다는 것은 정말 믿기지 않습니다. 놀라운.
Fattie 2016-07-03

4

내 솔루션은 약간의 해결 방법입니다. 실제 해결책은 애플이 Interface Builder를 수정하는 것입니다.

이를 통해 인터페이스 빌더에서 시스템 글꼴을 사용하여 굵게 및 기울임 꼴 텍스트를 모두 표시 한 다음 런타임에 사용자 정의 글꼴을 렌더링 할 수 있습니다. 모든 경우에 최적이 아닐 수 있습니다.

 NSMutableAttributedString* ApplyCustomFont(NSAttributedString *attributedText,
                     UIFont* boldFont,
                     UIFont* italicFont,
                     UIFont* boldItalicFont,
                     UIFont* regularFont)
{

    NSMutableAttributedString *attrib = [[NSMutableAttributedString alloc] initWithAttributedString:attributedText];
    [attrib beginEditing];
    [attrib enumerateAttribute:NSFontAttributeName inRange:NSMakeRange(0, attrib.length) options:0
                    usingBlock:^(id value, NSRange range, BOOL *stop)
    {
        if (value)
        {
            UIFont *oldFont = (UIFont *)value;
            NSLog(@"%@",oldFont.fontName);

            [attrib removeAttribute:NSFontAttributeName range:range];

            if([oldFont.fontName rangeOfString:@"BoldItalic"].location != NSNotFound && boldItalicFont != nil)
                [attrib addAttribute:NSFontAttributeName value:boldItalicFont range:range];
            else if([oldFont.fontName rangeOfString:@"Italic"].location != NSNotFound && italicFont != nil)
                [attrib addAttribute:NSFontAttributeName value:italicFont range:range];
            else if([oldFont.fontName rangeOfString:@"Bold"].location != NSNotFound && boldFont != nil)
                [attrib addAttribute:NSFontAttributeName value:boldFont range:range];
            else if(regularFont != nil)
                [attrib addAttribute:NSFontAttributeName value:regularFont range:range];
        }
    }];
    [attrib endEditing];

    return attrib;
}

이 게시물에서 영감을 얻음


4

이 버그로 고생했습니다. UILabel은 사용자 지정 글꼴을 사용하여 IB에서 올바르게 표시되지만 장치 또는 시뮬레이터에서는 올바르게 표시되지 않습니다 (글꼴은 프로젝트에 포함되어 있고 일반 UILabels에서 사용됨).

마침내 (Mac) App Store에서 Attributed String Creator를 찾았습니다. 앱의 적절한 위치에 배치 할 코드를 생성합니다. 환상적입니다. 나는 창조자가 아니라 행복한 사용자 일뿐입니다.


3

동일한 문제가 발생했습니다. 스토리 보드의 TextView에 대한 속성 글꼴 세트가 XCode 6.1 및 iOS 8 SDK에서 런타임에서 작동하지 않았습니다.

이것이 내가이 문제를 해결 한 방법이며 해결 방법이 될 수 있습니다.

  1. textview의 속성 검사기를 열고 텍스트를 "일반"으로 변경하십시오.

  2. "wC hR"(아래 빨간색)을 삭제하려면 십자가를 클릭하십시오.

    여기에 이미지 설명 입력

  3. 텍스트를 "속성"으로 변경 한 다음 텍스트의 글꼴과 크기를 설정할 수 있습니다.

  4. 작동하는지 확인하기 위해 실행

기본적으로 wC hR속성 집합도 UILabel없고 UITextView.
Allen Hsu

xcode 6에서 "Regular Width | Any Height", "Compact Width | Regular Height"와 같은 다른 종류의 높이 너비를 설정 했습니까? Xcode 5에서 개발 된 프로젝트가 있고 해당 텍스트 뷰가 iOS 8 SDK에서도 작동하기 때문에 설정을 확인한 결과 유일한 차이점은 Xcode 6에서 텍스트를 설정하면 사용자가 다양한 크기의 장치에 대한 글꼴을 설정할 수 있다는 것입니다. "평원". 이 새로운 구성은 "속성"에서 텍스트를 설정하지만 글꼴이 작동하지 않는 이유 일 수 있습니다.
Zhihao 양

1
사용자 정의 글꼴을 사용하고 있습니까? 시스템 글꼴이 아닌 자체 내장 된 글꼴을 의미합니다.
Allen Hsu

아하, 당신이 언급 한 "사용자 정의"글꼴은 "시스템"글꼴이있는 Xcode에서 제공하는 글꼴이라고 생각했습니다.
Zhihao 양

나를 위해 작동하지 않습니다. 일반 문자열에는 작동하지만 속성 문자열에는 작동하지 않습니다.
Pratik Somaiya 2015


2

이것을 시도해보십시오.

제 경우에는 "Silversky Technology"를 인터페이스 빌더의 레이블에 대한 속성 텍스트로 설정하려고 할 때 시뮬레이터에서 실행하면 표시되지 않지만 인터페이스 빌더에서는 표시됩니다. 그래서 한 가지 트릭을 사용하여 기술 텍스트보다 1 픽셀 더 큰 Silversky 글꼴을 만들었습니다.

속성 텍스트는 동일한 글꼴 크기로 문제가 있으므로 1 단어의 크기를 변경 하십시오.

이것은 xcode 버그 일 수 있지만이 트릭은 나를 위해 작동합니다.


1

같은 문제입니다.

해결 : TextView에서 선택 가능을 선택하십시오. 이것이 없으면 표준 시스템 글꼴이 있습니다.



1

@Hamidptb 솔루션이 작동하면 글꼴의 올바른 이름을 확인하십시오 (글꼴 관리자에 추가 한 후).

  • 서체 관리자 응용 프로그램을 열고 서체로 이동 한 다음 Command + I를 누릅니다. 포스트 스크립트 이름은 여기에 사용할 글꼴 이름입니다 :

    UILabel.appearance (). font = UIFont (이름 : " PostScriptName ", 크기 : 17)


0

여러 단락이있는 텍스트로 tableView 셀을 가져 오려고했습니다. 어트 리뷰 션 된 문자열은 단락 사이에 여분의 공간을 확보하는 방법 인 것 같습니다 (문자열에 두 개의 줄 바꿈을 수행하는 것보다 조금 더보기 좋은 것입니다). 셀에 다른 텍스트를 넣고 싶을 때 IB 설정이 런타임에 적용되지 않는다는 것을 발견했을 때이 게시물과 다른 게시물을 보았습니다.

내가 생각 해낸 가장 중요한 것은 특정 특성을 가진 속성 문자열을 만들기 위해 (Swift를 사용하여) String에 확장을 추가하는 것이 었습니다. 여기 예제에서는 Helvetica와 쉽게 구분할 수있는 Marker Felt 글꼴을 사용합니다. 이 예제에서는 단락 사이에 약간의 추가 간격을 표시하여 서로 더 구별되도록합니다.

extension String {
func toMarkerFelt() -> NSAttributedString {
    var style = NSMutableParagraphStyle()
    style.paragraphSpacing = 5.0
    let markerFontAttributes : [NSObject : AnyObject]? = [
        NSFontAttributeName : UIFont(name: "Marker Felt", size: 14.0)!,
        NSParagraphStyleAttributeName: style,
        NSForegroundColorAttributeName : UIColor.blackColor()
    ]
    let s = NSAttributedString(string: self, attributes: markerFontAttributes)
    return s
    }
}

그런 다음 내 사용자 정의 tableViewCell에서 원하는 텍스트를 보내고 UILabel의 속성 문자열로 변환합니다.

//  MarkerFeltCell.swift
class MarkerFeltCell: UITableViewCell {
@IBOutlet weak var myLabel: UILabel!
func configureCellWithString(inputString : String) {
    myLabel.attributedText = inputString.toMarkerFelt()
}}

tableView가있는 뷰 컨트롤러에서 viewDidLoad ()에 셀을 등록해야합니다-필자는 펜촉을 사용했습니다.

let cellName = "MarkerFeltCell"
tableView.registerNib(UINib(nibName: cellName, bundle: nil), forCellReuseIdentifier: cellName)

셀의 높이를 파악하려면 크기 정보를 얻는 데 사용되며 tableView에 추가되지 않는 프로토 타입 셀을 만듭니다. 따라서 뷰 컨트롤러의 변수에서 :

var prototypeSummaryCell : MarkerFeltCell? = nil

그런 다음 (아마도 뷰 컨트롤러에 따라 재정의) heightForRowAtIndexPath :

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        // ...
    if xib == "MarkerFeltCell" {
            if prototypeCell == nil {
                prototypeCell = tableView.dequeueReusableCellWithIdentifier(xib) as? MarkerFeltCell
            }
            let width : CGFloat = tableView.bounds.width
            let height : CGFloat = prototypeCell!.bounds.height
            prototypeCell?.bounds = CGRect(x: 0, y: 0, width: width, height: height)
            configureCell(prototypeCell!, atIndexPath: indexPath)
            prototypeSummaryCell?.layoutIfNeeded()
            let size = prototypeSummaryCell!.contentView.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize)
            let nextHeight : CGFloat = ceil(size.height + 1.0)
            return nextHeight
    } else {  // ...

위 코드에서 prototypeCell은 처음 필요할 때 채워집니다. 그런 다음 prototypeCell은 자동 크기 조정 프로세스를 거친 후 셀의 높이를 파악하는 데 사용됩니다. ceil () 함수를 사용하여 높이를 반올림해야합니다. 나는 또한 약간의 퍼지 요소를 추가했습니다.

마지막 코드 비트는 셀의 텍스트를 구성하는 방법입니다. 이 예에서는 다음과 같이 간단합니다.

func configureCell(cell :UITableViewCell, atIndexPath indexPath: NSIndexPath) {
    if let realCell = cell as? MarkerFeltCell  {
        realCell.configureCellWithString("Multi-line string.\nLine 2.\nLine 3.")    // Use \n to separate lines
    }
}

또한 여기 펜촉 사진이 있습니다. 레이블을 셀의 가장자리에 고정했지만 (원하는 여백 포함) "크거나 같음"제약 조건을 사용하고 아래쪽 제약 조건에 대해 "필수"보다 낮은 우선 순위를 사용했습니다.

셀 제약

레이블의 글꼴을 Attributed로 설정합니다. 실제 IB 글꼴은 중요하지 않았습니다.

LabelFont

이 경우의 결과 :

CellResults


0

속성 문자열의 경우 글꼴 목록에 사용자 지정 글꼴을 다음과 같이 추가 할 수 있습니다.-글꼴 아이콘을 클릭하면 다음과 같은 대화 상자가 표시됩니다. 다음 대화 상자에서 사용자 지정 글꼴에 대해 자신의 범주 또는 기존 범주를 추가 할 수 있습니다. 속성 글꼴 대화 상자

글꼴 관리를 클릭 하면 생성 한 카테고리 또는 기존 카테고리를 선택하는 다음 대화 상자가 열립니다. + 기호를 클릭하여 카테고리에 글꼴을 추가하십시오. 글꼴 관리 대화 상자


0

그것은 간단하고 빠른 솔리 션을 가지고 있으며 제 경우에는 작동합니다. 이 솔루션은 AppDelegate.swift 파일의 didFinishLaunchingWithOptions func에 코드 줄을 추가하는 것입니다.

textViews :

UITextView.appearance().font = UIFont(name: "IranSans", size: 17)

라벨 :

UILabel.appearance().font = UIFont(name: "IranSans", size: 17)

나머지 UiView는이 두 ☝️


0

코드의 속성 문자열에 사용자 지정 글꼴을 적용하는 모든 사람 : viewDidLayoutSubviews. 내 실수는에서 한 것이었고 viewDidLoad거기에는 적용되지 않을 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.