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
textView.atrributedtText = myString
omyLabel.attributedText = myString
al comienzo de su respuesta. Como novato que estaba haciendomyLabel.text
y no creía que tuviera que pasar por todas sus respuestas. ** 3) ** ¿Esto significa que solo puede tener unoattributedText
otext
que tener ambos no tendría sentido? 4) Recomiendo que también incorporeslineSpacing
ejemplos como este en tu respuesta, ya que es muy útil. 5) ачаар дахинappendAttributedString
es como 'Concatenación de cadenas'.addAttribute
está agregando un nuevo atributo a su cadena.addAttribute
es un método deNSMutableAttributedString
. Tienes razón en que no puedes usarlo conString
oNSAttributedString
. (Verifique lamyString
definición en la sección Cambiar una cadena atribuida de esta publicación. Creo que lo rechacé porque también utilicémyString
el nombre de la variable en la primera parte de la publicación donde estabaNSAttributedString
).Swift usa lo mismo
NSMutableAttributedString
que Obj-C. Se crea una instancia pasando el valor calculado como una cadena:Ahora cree la
g
cadena atribuida (je). Nota:UIFont.systemFontOfSize(_)
ahora es un inicializador disponible, por lo que debe desenvolverse antes de poder usarlo:Y luego añádelo:
Luego puede configurar el UILabel para que muestre la NSAttributedString de esta manera:
fuente
//Part 1 Set Up The Lower Case g var coffeeText = NSMutableAttributedString(string:"\(calculateCoffee())") //Part 2 set the font attributes for the lower case g var coffeeTypeFaceAttributes = [NSFontAttributeName : UIFont.systemFontOfSize(18)] //Part 3 create the "g" character and give it the attributes var coffeeG = NSMutableAttributedString(string:"g", attributes:coffeeTypeFaceAttributes)
Cuando configuro mi UILabel.text = coffeeText me sale un error "NSMutableAttributedString no se puede convertir en 'String'. ¿Hay alguna manera de hacer que UILabel acepte NSMutableAttributedString?Versión Xcode 6 :
Versión Xcode 9.3 :
Xcode 10, iOS 12, Swift 4 :
fuente
Swift 4:
fuente
Type 'NSAttributedStringKey' (aka 'NSString') has no member 'font'
Recomiendo encarecidamente utilizar una biblioteca para cadenas atribuidas. Hace que sea mucho más fácil cuando desea, por ejemplo, una cadena con cuatro colores diferentes y cuatro fuentes diferentes. Aquí está mi favorito. Se llama SwiftyAttributes
Si desea hacer una cadena con cuatro colores diferentes y fuentes diferentes utilizando SwiftyAttributes:
finalString
mostraría comofuente
Swift: xcode 6.1
fuente
La mejor manera de acercarse a las cadenas atribuidas en iOS es usar el editor de texto atribuido incorporado en el generador de interfaces y evitar la codificación innecesaria NSAtrributedStringKeys en sus archivos fuente.
Posteriormente, puede reemplazar dinámicamente placehoderls en tiempo de ejecución mediante el uso de esta extensión:
Agregue una etiqueta de guión gráfico con texto atribuido que se vea así.
Luego, simplemente actualice el valor cada vez que lo necesite así:
Asegúrese de guardar en initalAttributedString el valor original.
Puede comprender mejor este enfoque leyendo este artículo: https://medium.com/mobile-appetite/text-attributes-on-ios-the-effortless-approach-ff086588173e
fuente
let nsRange = NSRange(range,in:valueString)
línea.Swift 2.0
Aquí hay una muestra:
Swift 5.x
O
fuente
Funciona bien en beta 6
fuente
¡Creé una herramienta en línea que resolverá su problema! Puede escribir su cadena y aplicar estilos gráficamente y la herramienta le proporciona el objetivo-c y el código rápido para generar esa cadena.
También es de código abierto, así que no dude en extenderlo y enviar relaciones públicas.
Herramienta transformador
Github
fuente
Swift 5 y superior
fuente
//Implementación
fuente
Swift 4
Debe eliminar el valor bruto en swift 4
fuente
Para mí, las soluciones anteriores no funcionaron al establecer un color o propiedad específicos.
Esto funcionó:
fuente
Swift 2.1 - Xcode 7
fuente
Usa este código de muestra. Este es un código muy corto para cumplir con sus requisitos. Esto es trabajo para mí.
fuente
fuente
Los atributos se pueden configurar directamente en swift 3 ...
Luego use la variable en cualquier clase con atributos
fuente
Swift 4.2
fuente
Detalles
Solución
Uso
Ejemplo completo
Resultado
fuente
Será realmente fácil resolver su problema con la biblioteca que creé. Se llama Atributika.
Lo puedes encontrar aquí https://github.com/psharanda/Atributika
fuente
fuente
Swifter Swift tiene una manera bastante dulce de hacer esto sin ningún trabajo realmente. Simplemente proporcione el patrón que debe coincidir y qué atributos aplicarle. Son geniales para muchas cosas, échales un vistazo.
Si tiene varios lugares donde esto se aplicaría y solo desea que suceda para instancias específicas, entonces este método no funcionaría.
Puede hacer esto en un solo paso, simplemente más fácil de leer cuando está separado.
fuente
Swift 4.x
fuente
Swift 3.0 // crea una cadena atribuida
Definir atributos como
fuente
Por favor considere usar Prestyler
fuente
Swift 5
fuente
}
// Úselo como a continuación
fuente