Programming

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

procodes 2020. 8. 25. 20:27
반응형

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


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

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


나를위한 해결책은 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를 다시 한 번 설정해야합니다.

인터페이스 빌더는 기본적으로 사용자 정의 글꼴과 협력하고 같이,이 결과는 당신이 보는 무슨은 당신이 무엇을 얻을 애플리케이션을 구축 할 때 내가 좋아하는.

노트

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


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


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

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

여기에 이미지 설명 입력

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

여기에 이미지 설명 입력

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


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

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
}

내 솔루션은 약간의 해결 방법입니다. 실제 해결책은 애플이 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;
}

이 게시물에서 영감을 얻음


동일한 문제를 만났습니다. 스토리 보드의 TextView에 설정된 속성 글꼴이 XCode 6.1 및 iOS 8 SDK에서 런타임에서 작동하지 않았습니다.

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

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

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

    여기에 이미지 설명 입력

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

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

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

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


동일한 문제를 만났습니다. 스토리 보드의 UILabel 속성 글꼴이 런타임에서 작동하지 않았습니다. 이 UIFont + IBCustomFonts.m을 사용하면 나를 위해 작동합니다 https://github.com/deni2s/IBCustomFonts


같은 문제입니다.

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


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


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

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

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


여러 단락이있는 텍스트로 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

Then in (probably override - depending on your view controller) 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 {  // ...

In the above code, the prototypeCell will be filled in the first time it is needed. The prototypeCell is then used to figure out the height for the cell after going through the autosizing process. You will need to round up the height with the ceil() function. I also added in some extra fudge factor.

The final code bit is how you configure the text for the cell. For this example, simply:

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

Also, here is a shot of the nib. Pinned the label to the edges of the cell (with margin desired), but used a "Greater Than or Equal" constraint, with a less than "Required" priority for the bottom constraint.

셀 제약

Set the label's font to Attributed. Actual IB font didn't matter.

LabelFont

The result in this case:

CellResults


In case of attributed string you can add custom font in font list as - Click on font icon this will display following dialog .In the following dialog you can add your own category or existing one for custom font.attributed font dialog

After it click on Manage Fonts it open the following dialog select category in you created or existing one . Click on + sign to add font in the category. Manage font dialog


that's have a simple and quick solition and that's work in my case . that solution is add a code line in didFinishLaunchingWithOptions func in AppDelegate.swift file :

for textViews :

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

for labels :

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

and for rest of UiView like this two ☝️


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


이것을 시도해보십시오.

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

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

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

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

반응형