우리는 프로젝트에서 사용자 정의 글꼴을 사용하고 있습니다. Xcode 5에서 잘 작동합니다. Xcode 6에서는 코드의 문자열 속성 인 일반 텍스트로 작동합니다. 그러나 스토리 보드에 설정된 해당 문자열은 시뮬레이터 또는 장치에서 실행할 때 모두 Helvetica로 되돌아갑니다.
Xcode 6 또는 iOS 8 SDK의 버그인지 확실하지 않거나 Xcode 6 / iOS 8에서 사용자 지정 글꼴 사용 방법이 변경 되었습니까?
우리는 프로젝트에서 사용자 정의 글꼴을 사용하고 있습니다. 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에서 다음을 제공합니다.
평상시처럼 attributestring을 설정할 수 있지만 사용 가능한 새 속성에서 fontsize 및 fontfamily를 다시 한 번 설정해야합니다.
Interface Builder는 기본적으로 사용자 지정 글꼴로 작업하므로 결과적으로 표시되는 내용 이 표시됩니다. 애플리케이션을 구축 할 때 내가 좋아하는.
노트
평범한 버전 대신 이것을 사용하는 이유는 평범한 스타일을 사용할 때 사용할 수없는 linespacing과 같은 특성 레이블에 속성을 설정하기 때문입니다.
@IBInspectable
글꼴과 크기 대신 속성을 일시적으로 사용 하고 있습니다. 우리는이 markdownText
대부분의 시간, 우리는 굵게 또는 밑줄 텍스트 문자열을 기인 사용하기 때문에, 속성을. 그런 다음 마크 다운 텍스트를 일반 텍스트에 대해 설정된 글꼴 및 크기 정보가있는 속성 문자열로 구문 분석합니다.
가장 간단한 대답은 글꼴을 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에서 런타임에서 작동하지 않았습니다.
이것이 내가이 문제를 해결 한 방법이며 해결 방법이 될 수 있습니다.
textview의 속성 검사기를 열고 텍스트를 "일반"으로 변경하십시오.
"wC hR"(아래 빨간색)을 삭제하려면 십자가를 클릭하십시오.
텍스트를 "속성"으로 변경 한 다음 텍스트의 글꼴과 크기를 설정할 수 있습니다.
wC hR
속성 집합도 UILabel
없고 UITextView
.
동일한 문제를 만났습니다. 스토리 보드의 UILabel 속성 글꼴이 런타임에서 작동하지 않았습니다. 이 UIFont + IBCustomFonts.m을 사용하면 나를 위해 작동합니다 https://github.com/deni2s/IBCustomFonts
이것을 시도해보십시오.
제 경우에는 "Silversky Technology"를 인터페이스 빌더의 레이블에 대한 속성 텍스트로 설정하려고 할 때 시뮬레이터에서 실행하면 표시되지 않지만 인터페이스 빌더에서는 표시됩니다. 그래서 한 가지 트릭을 사용하여 기술 텍스트보다 1 픽셀 더 큰 Silversky 글꼴을 만들었습니다.
속성 텍스트는 동일한 글꼴 크기로 문제가 있으므로 1 단어의 크기를 변경 하십시오.
이것은 xcode 버그 일 수 있지만이 트릭은 나를 위해 작동합니다.
여러 단락이있는 텍스트로 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 글꼴은 중요하지 않았습니다.
이 경우의 결과 :
속성 문자열의 경우 글꼴 목록에 사용자 지정 글꼴을 다음과 같이 추가 할 수 있습니다.-글꼴 아이콘을 클릭하면 다음과 같은 대화 상자가 표시됩니다. 다음 대화 상자에서 사용자 지정 글꼴에 대해 자신의 범주 또는 기존 범주를 추가 할 수 있습니다. 속성 글꼴 대화 상자
글꼴 관리를 클릭 하면 생성 한 카테고리 또는 기존 카테고리를 선택하는 다음 대화 상자가 열립니다. + 기호를 클릭하여 카테고리에 글꼴을 추가하십시오. 글꼴 관리 대화 상자
그것은 간단하고 빠른 솔리 션을 가지고 있으며 제 경우에는 작동합니다. 이 솔루션은 AppDelegate.swift 파일의 didFinishLaunchingWithOptions func에 코드 줄을 추가하는 것입니다.
textViews :
UITextView.appearance().font = UIFont(name: "IranSans", size: 17)
라벨 :
UILabel.appearance().font = UIFont(name: "IranSans", size: 17)
나머지 UiView는이 두 ☝️
코드의 속성 문자열에 사용자 지정 글꼴을 적용하는 모든 사람 : viewDidLayoutSubviews
. 내 실수는에서 한 것이었고 viewDidLoad
거기에는 적용되지 않을 것입니다.