Me gustaría agregar una NSTextAttachment
imagen a mi cadena atribuida y centrarla verticalmente.
He usado el siguiente código para crear mi cadena:
NSMutableAttributedString *str = [[NSMutableAttributedString alloc] initWithString:DDLocalizedString(@"title.upcomingHotspots") attributes:attrs];
NSTextAttachment *attachment = [[NSTextAttachment alloc] init];
attachment.image = [[UIImage imageNamed:@"help.png"] imageScaledToFitSize:CGSizeMake(14.f, 14.f)];
cell.textLabel.attributedText = [str copy];
Sin embargo, la imagen parece alinearse con la parte superior de la celda textLabel
.
¿Cómo puedo cambiar el rect en el que se dibuja el adjunto?
ios
objective-c
swift
uilabel
nstextattachment
Sean Danzeiser
fuente
fuente
Respuestas:
Puede cambiar el rect subclasificando
NSTextAttachment
y anulandoattachmentBoundsForTextContainer:proposedLineFragment:glyphPosition:characterIndex:
. Ejemplo:No es una solución perfecta. Tienes que averiguar el origen Y "a ojo" y si cambias la fuente o el tamaño del icono, probablemente querrás cambiar el origen Y. Pero no pude encontrar una mejor manera, excepto colocando el ícono en una vista de imagen separada (que tiene sus propias desventajas).
fuente
Puede utilizar el capHeight de la fuente.
C objetivo
Rápido
La imagen adjunta se representa en la línea de base del texto. Y el eje y está invertido como el sistema de coordenadas de los gráficos centrales. Si desea mover la imagen hacia arriba, establezca
bounds.origin.y
en positivo.La imagen debe alinearse verticalmente en el centro con el capHeight del texto. Así que necesitamos configurar el
bounds.origin.y
to(capHeight - imageHeight)/2
.Para evitar algún efecto irregular en la imagen, debemos redondear la parte fraccionaria de la y. Pero las fuentes y las imágenes suelen ser pequeñas, incluso una diferencia de 1 px hace que la imagen parezca desalineada. Entonces apliqué la función redonda antes de dividir. Hace que la fracción sea parte del valor de y en .0 o .5
En su caso, la altura de la imagen es mayor que la altura capHeight de la fuente. Pero puedes usar la misma forma. El valor de la compensación y será negativo. Y se presentará desde abajo de la línea de base.
fuente
Prueba
- [NSTextAttachment bounds]
. No se requieren subclases.Para el contexto, estoy renderizando a
UILabel
para usar como imagen adjunta, luego estableciendo los límites así:attachment.bounds = CGRectMake(0, self.font.descender, attachment.image.size.width, attachment.image.size.height)
y líneas de base de texto dentro de la imagen de la etiqueta y el texto en la línea de cadena atribuida como se desee.fuente
attachment.bounds = CGRect(x: 0.0, y: self.font.descender, width: attachment.image!.size.width, height: attachment.image!.size.height)
descender
propiedad de UIFont!Encontré una solución perfecta para esto, aunque funciona como un encanto para mí, sin embargo, debes probarlo tú mismo (probablemente la constante depende de la resolución del dispositivo y tal vez lo que sea;)
Debería funcionar y no debería estar borroso de ninguna manera (gracias a
CGRectIntegral
)fuente
Qué pasa:
No se necesitan subclases
fuente
@Travis tiene razón en que el desplazamiento es el descendiente de fuentes. Si también necesita escalar la imagen, deberá usar una subclase de NSTextAttachment. A continuación se muestra el código, que se inspiró en este artículo . También lo publiqué como una esencia .
Úselo de la siguiente manera:
fuente
Si tienes un ascendente muy grande y quieres centrar la imagen (centro de la altura de la tapa) como yo, prueba esto
El cálculo y es como la imagen de abajo
Tenga en cuenta que el valor de y es 0 porque queremos que la imagen se desplace hacia abajo desde el origen
Si desea que esté en el medio de toda la etiqueta, use este valor y:
fuente
Podemos hacer una extensión en swift 4 que genere un archivo adjunto con una imagen centrada como esta:
Luego puedes realizar la llamada enviando el nombre de la imagen y la fuente:
Y luego agregue el archivo imageAttachment a la cadena atribuida
fuente
En mi caso, llamar a sizeToFit () ayudó. En Swift 5.1
Dentro de su etiqueta personalizada:
fuente
Utilice -lineFrag.size.height / 5.0 para la altura de los límites. Esto centra exactamente la imagen y se alinea con el texto para todos los tamaños de fuentes.
fuente
-lineFrag.size.height/5.0
no es correcto. En cambio, es el descendiente de fuentes.