web-dev-qa-db-ja.com

テキストが「属性付き」に設定されている場合、カスタムフォントのUITextViewが機能しない

.rtf(Xcodeに直接貼り付けられた)からのテキストを含むUITextViewがあります

コンテキストにはカスタムフォントが1つだけ含まれています(Futura Book BT 11.0)

「text(attributed)」プロパティを「plain」に設定した場合=カスタムフォントはストーリーボードとアプリから正しく表示されます

「text」プロパティを「attributed」=に設定した場合。カスタムフォントはストーリーボードからは正しく表示されますが、アプリからは表示されません。

私の目標は複数のフォントでテキストを機能させることだったので、属性付きプロパティをカスタムフォントで機能させるにはどうすればよいですか? (迅速)

ありがとう!

16
Franck

カスタムフォントはストーリーボードからは正しく表示されますが、アプリからは表示されません。

アプリはフォントをまったく表示しませんか、それともシステムフォントに復元しますか? Helveticaに戻っている場合、これはiOS 8.1の既知のバグのようです http://openradar.appspot.com/radar?id=5117089870249984

考えられる解決策:シミュレーターとデバイスでテストしましたか?シミュレーターでは機能しない可能性があります。つまり、システムにフォントをインストールすることで修正できます。

8
scott

属性付きUILabelで複数のカスタムフォントを使用したときに同じ問題に直面しました。ストーリーボードは正しい結果を表示しますが、デバイスは表示しません!!

フォントサイズが異なるカスタムフォントのテキストと異なる場合、私が見つけたもの。それはうまくいきます!

そのため、今のところ、わずかな違いはあるフォントサイズを使用しています。一方が14の場合のように、もう一方には14.01を使用しました。ストーリーボード内では不可能なので、ストーリーボードをソースコードとして開き、次のようにフォントサイズを手動で設定しました。

<attributedString key="attributedTitle">    
  <fragment content="Do not have account? ">
      <attributes>
        <color key="NSColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="calibratedRGB"/>
        <font key="NSFont" size="14" name="Roboto-Light"/>
        <paragraphStyle key="NSParagraphStyle" alignment="center" lineBreakMode="wordWrapping" baseWritingDirection="natural" tighteningFactorForTruncation="0.0"/>
      </attributes>
    </fragment>
    <fragment content="Login">
      <attributes>
        <color key="NSColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="calibratedRGB"/>
        <font key="NSFont" size="14.01" name="Roboto-Bold"/>
        <paragraphStyle key="NSParagraphStyle" alignment="center" lineBreakMode="wordWrapping" baseWritingDirection="natural" tighteningFactorForTruncation="0.0"/>
      </attributes>
    </fragment>
<attributedString key="attributedTitle">

しかし、それでも私はそれが起こる理由を見つけることができません!

7
Bilal Ahmad

私がやること:

private var _mutableString: NSMutableAttributedString!

if !isTitle {
    var titleFont: UIFont = UIFont(name: StyleGlobals.TitleFontName, size: StyleGlobals.TitleFontSize)!
    self._mutableString.addAttribute(NSFontAttributeName, value: titleFont, range: NSMakeRange(0, count(self._mutableString.string)))
    self._mutableString.addAttribute(NSForegroundColorAttributeName, value: StyleGlobals.FontColor, range: NSMakeRange(0, count(self._mutableString.string)))
}

self.Label.attributedText = self._mutableString

これにより、新しいフォントの色とフォント自体の両方が適用されます。さまざまなフォントを含めることができる必要がある特定のUILabelがあります。タイトルまたはサブタイトルのいずれかです。したがって、ラベルに何を含めるかを決定したときに、フォントを適用する必要がありました。

4
Orion

私の場合、問題はシステムにフォントがインストールされていないことだったので、FontBookでインストールしました。次に、フォントが属性付きテキストラベルのリストに表示されました。

EDIT:現在のテキストの表示に問題があり、これを実行しました(UILabelを使用しており、UITextViewでテストされていません):

私の解決策は、htmlから属性付き文字列を作成することです(この拡張機能をSOのどこかで見ました):

extension String {
    var html2AttStr: NSAttributedString? {
        guard let data = dataUsingEncoding(NSUTF8StringEncoding) else { return nil }
        do {
            return try NSAttributedString(data: data,
                                          options: [
                                            NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType,
                                            NSCharacterEncodingDocumentAttribute: NSUTF8StringEncoding],
                                          documentAttributes: nil)
        } catch let error as NSError {
            //print(error.code)
            return nil
        }
    }
}

そして、私がすることは次のようなものです:

let htmlStyle = "<meta charset=\"UTF-8\"><style> body { font-family: 'SourceSansPro-Light'; font-size: 18px; text-align: center; } b {font-family: 'SourceSansPro-Light'; }</style>"
let myString = "<font size=\"+2\">Slightly bigger font</font><br><br>Some message with normal text <b>a bold text</b> and some more text"
var attributedString = htmlStyle
attributedString.appendContentsOf(myString)
informationLabel.attributedText = attributedString.html2AttStr

これの利点の1つは、単語/数値などで解析するために、文字列内にいくつかの '%s'テキストを配置できることです。翻訳と解析が簡単です。フォーマットされたテキストでは、テキストを見つけるためのコードをたくさん作成し、周りに何も触れずにフォーマットを適用する必要がありました。これは私にとってはかなりうまくいきます:)

2
AngelMixu

「FuturaBookBT」がカスタムフォントとしてアプリに正しく追加されていることを確認しましたか?

2
freytag

この拡張機能を使用できます

extension NSMutableAttributedString {

    func createAttributedString(Word : NSArray, attributeCustomizeFont:UIFont, defaultFont : UIFont, defaultColor : UIColor, allowSpecing : Bool , allowUnderLine : Bool = false) -> NSAttributedString {

        self.addAttribute(NSAttributedString.Key.font, value: defaultFont, range: (self.string as NSString).range(of: self.string))
        if allowSpecing {
            self.addAttribute(NSAttributedString.Key.kern, value: NSNumber(value: 5), range: (self.string as NSString).range(of: self.string))
        }else {
            self.addAttribute(NSAttributedString.Key.kern, value: NSNumber(value: 0), range: (self.string as NSString).range(of: self.string))
        }

        self.addAttribute(NSAttributedString.Key.foregroundColor, value: defaultColor, range: (self.string as NSString).range(of: self.string))

        for i in 0..<Word.count {
            self.addAttribute(NSAttributedString.Key.font, value: attributeCustomizeFont, range: (self.string as NSString).range(of: Word.object(at: i) as! String))

        }
        if allowUnderLine {
            self.addAttribute(NSAttributedString.Key.underlineStyle, value: NSUnderlineStyle.single.rawValue, range: (self.string as NSString).range(of: self.string))
        }
        return self
    }
}

拡張機能の使用方法

var attributedString = NSMutableAttributedString(string:"Test for set custom font")
        attributedString = attributedString.createAttributedString(Word: ["custom font"], attributeCustomizeFont: UIFont(name: "Arial", size: 18)! , defaultFont: UIFont(name: "Helvetica", size: 15)!, defaultColor: UIColor.black, allowSpecing: false) as! NSMutableAttributedString

したがって、文字列全体のフォントセット「Helvetica」はサイズ18で、「カスタムフォント」テキストセット「Arial」フォントはサイズ15です。

1
Nilesh R Patel

viewDidLayoutSubviewsメソッドですべてのコードを呼び出してください!作品より。フォントサイズ、スタイルi viewDidLoadまたはviewWillApperarメソッドを変更するときに、多くの問題が発生します。

したがって、コードをviewDidLayoutSubviewsメソッドに移動するだけです。このメソッドは何度も呼び出すことができるため、フラグを使用してフォントを変更できるのは1回だけです:]

1
Nikola Jovic

ストーリーボードからUITextviewを「選択可能」にすることは機能します。

0
SaRaVaNaN DM

✅修正済み:

UITextViewKMPlaceholderTextView としてサブクラス化することで修正されました。これは、テキストビューにプレースホルダーを追加する場合にも役立ち、InterfaceBuilderからUITextFieldと同じように使用できます。

これで、カスタムフォントを正常に使用して、プレースホルダーテキストを追加できます。

0
Fadi