Esta respuesta se ha actualizado para Swift 4.2.
Referencia rápida
La forma general para hacer y establecer una cadena atribuida es así. Puede encontrar otras opciones comunes a continuación.
// create attributed string
let myString = "Swift Attributed String"
let myAttribute = [ NSAttributedString.Key.foregroundColor: UIColor.blue ]
let myAttrString = NSAttributedString(string: myString, attributes: myAttribute)
// set attributed text on a UILabel
myLabel.attributedText = myAttrString
let myAttribute = [ NSAttributedString.Key.foregroundColor: UIColor.blue ]
let myAttribute = [ NSAttributedString.Key.backgroundColor: UIColor.yellow ]
let myAttribute = [ NSAttributedString.Key.font: UIFont(name: "Chalkduster", size: 18.0)! ]
let myAttribute = [ NSAttributedString.Key.underlineStyle: NSUnderlineStyle.single.rawValue ]
let myShadow = NSShadow()
myShadow.shadowBlurRadius = 3
myShadow.shadowOffset = CGSize(width: 3, height: 3)
myShadow.shadowColor = UIColor.gray
let myAttribute = [ NSAttributedString.Key.shadow: myShadow ]
El resto de esta publicación ofrece más detalles para aquellos que estén interesados.
Atributos
Los atributos de cadena son solo un diccionario en forma de [NSAttributedString.Key: Any]
, donde NSAttributedString.Key
es el nombre clave del atributo y Any
es el valor de algún tipo. El valor podría ser una fuente, un color, un número entero u otra cosa. Hay muchos atributos estándar en Swift que ya han sido predefinidos. Por ejemplo:
- nombre clave:
NSAttributedString.Key.font
valor: aUIFont
- nombre clave:
NSAttributedString.Key.foregroundColor
valor: aUIColor
- nombre clave:
NSAttributedString.Key.link
valor: an NSURL
oNSString
Hay muchos otros Vea este enlace para más. Incluso puedes crear tus propios atributos personalizados como:
nombre clave:, NSAttributedString.Key.myName
valor: algún tipo.
si haces una extensión :
extension NSAttributedString.Key {
static let myName = NSAttributedString.Key(rawValue: "myCustomAttributeKey")
}
Crear atributos en Swift
Puede declarar atributos como declarar cualquier otro diccionario.
// single attributes declared one at a time
let singleAttribute1 = [ NSAttributedString.Key.foregroundColor: UIColor.green ]
let singleAttribute2 = [ NSAttributedString.Key.backgroundColor: UIColor.yellow ]
let singleAttribute3 = [ NSAttributedString.Key.underlineStyle: NSUnderlineStyle.double.rawValue ]
// multiple attributes declared at once
let multipleAttributes: [NSAttributedString.Key : Any] = [
NSAttributedString.Key.foregroundColor: UIColor.green,
NSAttributedString.Key.backgroundColor: UIColor.yellow,
NSAttributedString.Key.underlineStyle: NSUnderlineStyle.double.rawValue ]
// custom attribute
let customAttribute = [ NSAttributedString.Key.myName: "Some value" ]
Tenga en cuenta lo rawValue
que se necesitaba para el valor de estilo de subrayado.
Debido a que los atributos son solo Diccionarios, también puede crearlos haciendo un Diccionario vacío y luego agregando pares clave-valor. Si el valor contendrá múltiples tipos, entonces debe usarlo Any
como tipo. Aquí está el multipleAttributes
ejemplo de arriba, recreado de esta manera:
var multipleAttributes = [NSAttributedString.Key : Any]()
multipleAttributes[NSAttributedString.Key.foregroundColor] = UIColor.green
multipleAttributes[NSAttributedString.Key.backgroundColor] = UIColor.yellow
multipleAttributes[NSAttributedString.Key.underlineStyle] = NSUnderlineStyle.double.rawValue
Cadenas atribuidas
Ahora que comprende los atributos, puede crear cadenas atribuidas.
Inicialización
Hay algunas formas de crear cadenas atribuidas. Si solo necesita una cadena de solo lectura, puede usarla NSAttributedString
. Aquí hay algunas formas de inicializarlo:
// Initialize with a string only
let attrString1 = NSAttributedString(string: "Hello.")
// Initialize with a string and inline attribute(s)
let attrString2 = NSAttributedString(string: "Hello.", attributes: [NSAttributedString.Key.myName: "A value"])
// Initialize with a string and separately declared attribute(s)
let myAttributes1 = [ NSAttributedString.Key.foregroundColor: UIColor.green ]
let attrString3 = NSAttributedString(string: "Hello.", attributes: myAttributes1)
Si necesita cambiar los atributos o el contenido de la cadena más adelante, debe usar NSMutableAttributedString
. Las declaraciones son muy similares:
// Create a blank attributed string
let mutableAttrString1 = NSMutableAttributedString()
// Initialize with a string only
let mutableAttrString2 = NSMutableAttributedString(string: "Hello.")
// Initialize with a string and inline attribute(s)
let mutableAttrString3 = NSMutableAttributedString(string: "Hello.", attributes: [NSAttributedString.Key.myName: "A value"])
// Initialize with a string and separately declared attribute(s)
let myAttributes2 = [ NSAttributedString.Key.foregroundColor: UIColor.green ]
let mutableAttrString4 = NSMutableAttributedString(string: "Hello.", attributes: myAttributes2)
Cambiar una cadena atribuida
Como ejemplo, creemos la cadena atribuida en la parte superior de esta publicación.
Primero cree un NSMutableAttributedString
con un nuevo atributo de fuente.
let myAttribute = [ NSAttributedString.Key.font: UIFont(name: "Chalkduster", size: 18.0)! ]
let myString = NSMutableAttributedString(string: "Swift", attributes: myAttribute )
Si está trabajando, establezca la cadena atribuida a un UITextView
(o UILabel
) como este:
textView.attributedText = myString
No lo usas textView.text
.
Aquí está el resultado:
Luego, agregue otra cadena de atributos que no tenga ningún conjunto de atributos. (Tenga en cuenta que, aunque solía let
declarar más myString
arriba, todavía puedo modificarlo porque es un NSMutableAttributedString
. Esto me parece bastante inestable y no me sorprendería si esto cambia en el futuro. Déjeme un comentario cuando eso suceda).
let attrString = NSAttributedString(string: " Attributed Strings")
myString.append(attrString)
A continuación, seleccionaremos la palabra "Cadenas", que comienza en el índice 17
y tiene una longitud de 7
. Tenga en cuenta que este es un NSRange
y no un Swift Range
. (Consulte esta respuesta para obtener más información sobre Rangos). El addAttribute
método nos permite poner el nombre de la clave del atributo en el primer lugar, el valor del atributo en el segundo lugar y el rango en el tercer lugar.
var myRange = NSRange(location: 17, length: 7) // range starting at location 17 with a lenth of 7: "Strings"
myString.addAttribute(NSAttributedString.Key.foregroundColor, value: UIColor.red, range: myRange)
Finalmente, agreguemos un color de fondo. Para variar, usemos el addAttributes
método (tenga en cuenta el s
). Podría agregar varios atributos a la vez con este método, pero simplemente agregaré uno nuevamente.
myRange = NSRange(location: 3, length: 17)
let anotherAttribute = [ NSAttributedString.Key.backgroundColor: UIColor.yellow ]
myString.addAttributes(anotherAttribute, range: myRange)
Tenga en cuenta que los atributos se superponen en algunos lugares. Agregar un atributo no sobrescribe un atributo que ya está allí.
Relacionado
Otras lecturas
NSUnderlineStyleAttributeName: NSUnderlineStyle.StyleSingle.rawValue | NSUnderlineStyle.PatternDot.rawValue