2017-01-17 17 views
0

Это мой HTML строка:Как вынести HTML строку в UITextView с различными стилями шрифта, но то же семейство шрифтов

<i>Italics </i><b>Bold </b><u>Underline</u><blockquote>block quote<br></blockquote> 

Я хочу, чтобы все стайлинг быть таким же (курсив, полужирный и т.д.), но я хочу внедрить семейство шрифтов в Open Sans. Поэтому, где бы то ни было курсивом, я хочу, чтобы шрифт был Open-Sans Italic. Как это реализовать? Пожалуйста помоги.

+0

Я бы попытаться построить 'NSAttributedString' с' опцией NSHTMLTextDocumentType', а затем изменить атрибуты для обеспечения желаемого шрифта на каждой его части. – werediver

ответ

1

попробуйте использовать NSAttributedString с опцией NSHTMLTextDocumentType и .utf8 строки кодирования

Swift 3:

extension String { 

    var htmlAttributedString: NSAttributedString? { 

     do { 
      return try NSAttributedString(data: data(using: .utf8)!, options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: String.Encoding.utf8.rawValue], documentAttributes: nil) 
     } catch let error { 
      print(error.localizedDescription) 
     } 
     return nil 
    } 
} 

Использование

let htmlStringCode = "<i>Italics </i><b>Bold </b><u>Underline</u><blockquote>block quote<br></blockquote>" 

if let htmlText = htmlStringCode.htmlAttributedString { 
     let attributes = [NSFontAttributeName: UIFont(name: "Open Sans", size: 18.0)!] 
     let attributedText = NSMutableAttributedString(string: htmlText.string, attributes: attributes) 

     let htmlString = htmlText.string as NSString 
     let range = htmlString.range(of: "Italics") 
     attributedText.addAttribute(NSFontAttributeName, value: UIFont(name: "OpenSans-Italic", size: 18.0)!, range: range) 

     textView.attributedText = attributedText 
} 
+0

Таким образом, это будет только системный шрифт, а не мой собственный шрифт – Ghazalah

+0

Вы можете попробовать отредактированный код и использовать ту же логику, где вам нужны специальные атрибуты шрифтов – suhit

0

Один из способов достичь желаемого поведения это (копия -and-paste на игровой площадке).

import PlaygroundSupport 
import UIKit 

func attributedString(fromHTML html: String, fontFamily: String) -> NSAttributedString? { 
    let prefix = "<style>* { font-family: \(fontFamily) }</style>" 
    return (prefix + html).data(using: .utf8).map { 
     try! NSMutableAttributedString(
      data: $0, 
      options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType], 
      documentAttributes: nil 
     ) 
    } 
} 

let attributedText = attributedString(fromHTML: "<i>Italics </i><b>Bold </b><u>Underline</u><blockquote>block quote<br></blockquote>", fontFamily: "Courier") 

let label = UILabel(frame: CGRect(x: 0, y: 0, width: 200, height: 50)) 
label.backgroundColor = .white 
label.attributedText = attributedText 
PlaygroundPage.current.liveView = label 

Example

1

мне пришлось добавить свой собственный CSS. Это решило мою проблему:

UIFont *postFont = [UIFont fontWithName:@"OpenSans" size:13.0]; 

NSString *postWithFont = [self.msgHtml stringByAppendingString:[NSString stringWithFormat:@"<style>body{font-family: '%@'; font-size:%fpx;}i{font-family: '%@'; font-size:%fpx;}</style>", postFont.fontName, postFont.pointSize, [postFont.fontName stringByAppendingString:@"-Italic"], postFont.pointSize]]; 

_mainText = [[NSMutableAttributedString alloc] 
             initWithData:[postWithFont dataUsingEncoding:NSUTF8StringEncoding] 
             options:@{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, 
               NSCharacterEncodingDocumentAttribute: @(NSUTF8StringEncoding)} 
             documentAttributes:nil 
             error:nil]; 
+0

Отдельный стиль для '' кажется лишним для меня. Стиль для '' или '*' (все) будет работать (как показано в [моем ответе] (http://stackoverflow.com/a/41694316/3541063)). – werediver