xcode swift nsattributedstring custom-font

xcode - nsattributedstring swift 4



UITextView con fuente personalizada no funciona cuando el texto se establece en "atribuido" (11)

Tengo un UITextView con un texto que viene de un .rtf (pegado directamente en Xcode)

El contexto contiene solo una fuente personalizada (Futura Book BT 11.0)

Si configuro la propiedad "texto (atribuido)" a "simple" = la fuente personalizada aparece correctamente en el guión gráfico y en la aplicación

Si configuro la propiedad "texto" a "atribuido" =. La fuente personalizada aparece correctamente en el guión gráfico, pero no en la aplicación.

Como mi objetivo era tener un texto con varias fuentes funcionando, ¿cómo tener la propiedad atribuida para trabajar con fuentes personalizadas? (Rápido)

¡Gracias!


La fuente personalizada aparece correctamente en el guión gráfico, pero no en la aplicación.

¿La aplicación no muestra la fuente o la restaura a la fuente del sistema? Si está volviendo a Helvetica, parece que esto puede ser un error conocido en iOS 8.1 http://openradar.appspot.com/radar?id=5117089870249984

Posible solución: ¿Lo probaste en el simulador y en un dispositivo? Puede ser que simplemente no funcione en el simulador, lo que significa que podría arreglarlo instalando la fuente en su sistema.


¿Se aseguró de que "Futura Book BT" se haya agregado correctamente como una fuente personalizada en su aplicación?


En mi caso, el problema era que no tenía la fuente instalada en mi sistema, así que lo hice con el Libro de fuentes. Luego, la fuente apareció en la lista en las etiquetas de texto atribuidas.

EDITAR: Ahora tuve algunos problemas para mostrar mi texto actual e hice esto (estoy usando un UILabel, no probado en UITextView):

Mi solución es crear una cadena atribuida desde html (vi esta extensión en algún lugar aquí en 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 } } }

Y luego lo que hago es algo como:

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

Una de las ventajas de esto es que ahora puedo poner un poco de texto ''% s'' dentro de la cadena para analizar con una palabra / número / etc. y es más fácil de traducir y analizar. Con el texto con formato tuve que hacer un montón de código para encontrar texto, aplicar el formato sin tocar nada. Esto funciona bastante bien para mí :)


Hacer que la vista posterior de la UIT sea "seleccionable" del guión gráfico funcionará.


Hay una solución. Simplemente haga doble clic en el archivo de fuente (en Finder) e instálelo en el sistema.


He enfrentado el mismo problema cuando usé varias fuentes personalizadas en UILabel atribuido. ¡El storyboard muestra el resultado correcto pero el dispositivo no!

Lo que he descubierto es que si el tamaño de la fuente es diferente del texto con diferentes fuentes personalizadas. ¡¡Funciona bien!!

Así que por ahora uso el tamaño de letra con una pequeña diferencia. Como si uno tuviera 14, usé 14.01 para el otro. No es posible dentro del guión gráfico, así que abrí el guión gráfico como código fuente y configuré manualmente el tamaño de fuente como:

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

¡Pero todavía no puedo encontrar por qué sucede!


Lo que hago:

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

Esto se aplica tanto a un nuevo color de fuente como a la propia fuente. Tengo una cierta UILabel que tiene que ser capaz de contener diferentes fuentes. Puede ser un título o un subtítulo. Por lo tanto, tuve que aplicar la fuente cuando había determinado lo que la etiqueta va a contener.


Por favor, llame a todo su código en el método viewDidLayoutSubviews ! Que funciona Tengo muchos problemas al cambiar el tamaño de fuente, el estilo i viewDidLoad o viewWillApperar métodos.

Tan solo mueva su código en el método viewDidLayoutSubviews . Puede usar la bandera para cambiar las fuentes solo una vez, ya que este método puede llamarse muchas veces:]


Utilicé los diferentes tamaños de fuente pero aún enfrentando los problemas. Entonces cambié la alineación del texto a la izquierda en lugar de justificado. Entonces funcionó bien.


✅FIXED:

Se UITextView subclasificando mi UITextView como KMPlaceholderTextView que también es útil para agregar un marcador de posición a la vista de texto y se puede usar desde Interface Builder como lo mismo que UITextField .

Ahora puedo usar fuentes personalizadas con éxito y agregar texto de marcador de posición.


Puedes usar esta extensión

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

Cómo usar la extensión

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

Por lo tanto, toda la cadena de caracteres configuró ''Helvetica'' con el tamaño 18 y para la fuente de texto ''Fuente personalizada'' configuró la fuente ''Arial'' con el tamaño 15