programing

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

starjava 2023. 8. 20. 10:09
반응형

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

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

Xcode 6 또는 iOS 8 SDK의 버그인지 아니면 Xcode 6 / iOS 8에서 사용자 지정 글꼴을 사용하는 방법이 변경되었는지 잘 모르겠습니다.

가장 간단한 방법은 글꼴을 FontBook으로 끌어다 놓는 것입니다.글꼴이 프로젝트에 있지만 컴퓨터의 FontBook에는 없는 경우 IB에서 해당 글꼴을 찾는 데 문제가 발생할 수 있습니다.이상하지만, 저를 위해 여러 번 일했습니다.

제가 해결할 수 있는 방법을 사용하는 것이었습니다.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 custom font with attributed string

일반적인 경우와 마찬가지로 속성 문자열을 설정할 수 있지만 사용 가능한 새 속성에서 글꼴 크기와 글꼴 패밀리를 다시 설정해야 합니다.

인터페이스 빌더는 기본적으로 사용자 지정 글꼴로 작업하기 때문에 앱을 만들 때 선호하는 것으로 표시됩니다.

메모

일반 버전 대신 이 기능을 사용하는 이유는 일반 스타일을 사용할 때 사용할 수 없는 선 간격과 같은 속성을 속성 레이블에 설정하기 때문입니다.

글꼴 북에 사용자 정의 글꼴을 추가할 수 있습니다.

1단계: 글꼴 관리를 클릭합니다.그러면 글꼴 책이 열립니다.

enter image description here

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

enter image description here

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

제 해결책은 약간의 해결책입니다.진정한 해결책은 애플이 인터페이스 빌더를 수정하는 것입니다.

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

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

게시물에서 영감을 받았습니다.

이 스레드 덕분에 저는 다음과 같은 솔루션에 도달했습니다.

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
}

저는 이 버그로 어려움을 겪었습니다. UILabel은 IB에서 사용자 지정 글꼴로 올바르게 표시되지만 장치나 시뮬레이터에서는 올바르게 표시되지 않습니다(글꼴은 프로젝트에 포함되어 있으며 일반 UILabel에서 사용됨).

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

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

이 문제를 해결한 방법은 다음과 같습니다. 해결 방법이 될 수 있습니다.

  1. 텍스트 보기의 속성 검사기를 열고 텍스트를 "일반"으로 변경합니다.

  2. 십자 기호를 클릭하여 "wChR"(아래 빨간색)을 삭제합니다.

    enter image description here

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

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

이것을 사용해 보세요. 효과가 있을 거예요.

제 경우 "Silversky Technology"를 인터페이스 빌더의 레이블에 대한 Attributed text로 설정하려고 하면 시뮬레이터에서 실행할 때 표시되지 않고 인터페이스 빌더에 표시됩니다.그래서 저는 테크놀러지 텍스트보다 1픽셀 큰 실버스키 글꼴을 만드는 트릭을 사용했습니다.

속성 텍스트는 동일한 크기의 글꼴에 문제가 있으므로 1단어 크기를 변경하는 것이 저와 함께 작동합니다.

아마도 이것은 xcode 버그일 수도 있지만 이 속임수는 나에게 효과가 있습니다.

동일한 문제가 발생했습니다. 스토리보드의 UI 레이블 속성 글꼴이 런타임에 작동하지 않았습니다.이 UIFont+ 사용IBCustomFonts.m은 https://github.com/deni2s/IBCustomFonts 에서 사용할 수 있습니다.

같은 문제입니다.

해결됨: 텍스트 보기에서 선택 가능을 선택하기만 하면 됩니다.이것이 없으면 표준 시스템 글꼴이 있습니다.

두 번 클릭하고 시스템에 글꼴을 설치합니다.작동합니다(Xcode 8.2).

@Hamidptb 솔루션이 작동합니다. 글꼴 이름을 정확하게 지정해야 합니다(FontBook에 추가한 후).

  • Font Book 응용 프로그램을 열고 글꼴로 이동한 다음 Command+I를 누릅니다.PostScript 이름은 여기서 사용할 글꼴 이름입니다.

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

여러 문단이 있는 텍스트가 있는 tableView 셀을 가져오려고 했습니다.속성된 문자열은 단락 사이에 추가 공간을 확보하는 방법인 것 같습니다(줄에 두 줄 입력을 하는 것보다 조금 더 멋져 보이는 것).셀에 다른 텍스트를 넣고 싶을 때 실행 시 IB 설정이 적용되지 않는 것을 발견했을 때 이 게시물과 다른 게시물을 발견했습니다.

제가 생각해낸 주요한 것은 String(Swift 사용)에 확장자를 추가하여 특정 특성을 가진 속성 문자열을 만드는 것이었습니다.여기서 예제는 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
    }
}

그런 다음 사용자 정의 테이블 ViewCell에서 원하는 텍스트를 보내면 UILabel의 속성 문자열로 변환됩니다.

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

View 테이블이 있는 View 컨트롤러에서 viewDidLoad()에 셀을 등록해야 합니다. nib를 사용했기 때문에 다음과 같은 작업을 수행했습니다.

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

셀의 높이를 확인하려면 크기 정보를 가져오는 데 사용되고 테이블 뷰에 추가되지 않는 원형 셀을 만듭니다.따라서 보기 컨트롤러의 변수는 다음과 같습니다.

var prototypeSummaryCell : MarkerFeltCell? = nil

그런 다음 RowAt에 대한 in(뷰 컨트롤러에 따라 오버라이드될 수 있음) 높이인덱스 경로:

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 {  // ...

위의 코드에서 프로토타입 Cell은 필요할 때 처음으로 채워집니다.시제품 Cell은 자동 크기 조정 과정을 거친 후 셀의 높이를 파악하는 데 사용됩니다.천장() 기능을 사용하여 높이를 반올림해야 합니다.퍼지 인자도 추가했습니다.

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

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

또한, 여기 닙의 사진이 있습니다.레이블을 셀 가장자리에 고정했지만(여유가 필요함) 하단 제약 조건에 대해 "필수" 미만의 우선 순위를 가진 "보다 크거나 같음" 제약 조건을 사용했습니다.

Cell constraints

레이블의 글꼴을 속성으로 설정합니다.실제 IB 글꼴은 문제가 되지 않았습니다.

LabelFont

이 경우 결과는 다음과 같습니다.

CellResults

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

Manage Fonts(글꼴 관리)를 클릭하면 작성한 대화 상자 또는 기존 대화 상자에서 다음 대화 상자 선택 범주가 열립니다. + 기호를 클릭하여 해당 범주에 글꼴을 추가합니다.글꼴 관리 대화 상자

단순하고 빠른 솔루션을 사용하는 것이 제 경우에 해당합니다. 이 솔루션은 AppDelegate.swift 파일의 didFinishLaunchingWithOptions 함수에 코드 행을 추가하는 것입니다.

텍스트 보기:

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

레이블의 경우:

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

이 두 가지와 같은 UiView의 나머지 부분에 대해서는 ☝timeout

코드의 속성 문자열에 사용자 정의 글꼴을 적용하는 사용자:설정해 보세요.viewDidLayoutSubviews내 실수는 그것을 안에서 한 것이었습니다.viewDidLoad그것은 거기에 적용되지 않을 것입니다.

언급URL : https://stackoverflow.com/questions/25925914/attributed-string-with-custom-fonts-in-storyboard-does-not-load-correctly

반응형