プロジェクトではカスタムフォントを使用しています。これはXcode 5でうまく機能します。Xcode6では、プレーンテキスト、コード内の属性付き文字列で機能します。ただし、ストーリーボードでは正常に表示されますが、ストーリーボードで設定された属性文字列は、シミュレータまたはデバイスで実行するとすべてHelveticaに戻ります。
Xcode 6またはiOS 8 SDKのバグなのか、Xcode 6 / iOS 8でカスタムフォントの使用方法が変更されたのかわかりません。
プロジェクトではカスタムフォントを使用しています。これはXcode 5でうまく機能します。Xcode6では、プレーンテキスト、コード内の属性付き文字列で機能します。ただし、ストーリーボードでは正常に表示されますが、ストーリーボードで設定された属性文字列は、シミュレータまたはデバイスで実行するとすべて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はデフォルトでカスタムフォントを使用しているので、アプリをビルドするときに私が好むものと同じものが表示されます。
注意
プレーンバージョンの代わりにこれを使用する理由は、ラインスペースのような属性付きラベルにプロパティを設定しているためです。これは、プレーンスタイルを使用するときには使用できません。
@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
}
私の解決策は少しの回避策です。本当の解決策は、Appleが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で実行時に機能しませんでした。
これは私がこの問題を解決した方法です、あなたのための回避策かもしれません:
テキストビューの属性インスペクターを開き、テキストを「プレーン」に変更します
十字をクリックして、「wC hR」を削除します(以下の赤)
テキストを「属性付き」に変更すると、テキストのフォントとサイズを設定できます。
wC hR
プロパティセットも、もUILabel
ないようUITextView
です。
同じ問題に遭遇しました:ストーリーボードのUILabelの属性フォントが実行時に機能しませんでした。このUIFont + IBCustomFonts.mを使用すると、私にとっては機能します https://github.com/deni2s/IBCustomFonts
これを試してみてください
私の場合、「Silversky Technology」をインターフェイスビルダーからのラベルの属性付きテキストとして設定しようとすると、シミュレーターで実行しても表示されませんが、インターフェイスビルダーでは表示されます。だから私は1つのトリックを使って、テクノロジーテキストよりも1ピクセル大きいSilverskyフォントを作りました。
属性テキストは同じサイズのフォントで問題があるので、1ワードのサイズを変更すると、これでうまくいきます。
これはxcodeのバグかもしれませんが、このトリックは私にとってはうまくいきます。
複数の段落を持つテキストを含むtableViewセルを取得しようとしました。属性付き文字列は、段落間に余分なスペースを設ける方法のように思われました(文字列で2つの改行を行うよりも少し見栄えが良いものです)。セルに別のテキストを入れたいときに実行時に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
}
}
また、こちらはペン先のショットです。ラベルをセルの端に固定(必要なマージンを使用)しましたが、「より大きい」または「等しい」制約を使用し、下部の制約には「必須」未満の優先度を使用しました。
ラベルのフォントを属性に設定します。実際のIBフォントは問題ではありませんでした。
この場合の結果:
属性付き文字列の場合、次のようにフォントリストにカスタムフォントを追加できます。-フォントアイコンをクリックすると、次のダイアログが表示されます。次のダイアログで、独自のカテゴリまたはカスタムフォントの既存のカテゴリを追加できます。属性付きフォントダイアログ
[フォントの管理 ]をクリックすると、次のダイアログが開き、作成したカテゴリまたは既存のカテゴリからカテゴリを選択できます。+記号をクリックして、カテゴリにフォントを追加します。 フォントダイアログの管理
それはシンプルで迅速な解決策であり、私の場合はそれでうまくいきます。その解決策は、AppDelegate.swiftファイルのdidFinishLaunchingWithOptions funcにコード行を追加することです。
textViewsの場合:
UITextView.appearance().font = UIFont(name: "IranSans", size: 17)
ラベル用:
UILabel.appearance().font = UIFont(name: "IranSans", size: 17)
そして、この2つのようなUiViewの残りのために☝️
コード内の属性付き文字列にカスタムフォントを適用する場合:で設定してみてくださいviewDidLayoutSubviews
。私の間違いはそれをで行っていたのでviewDidLoad
、そこでは適用されません。