Je voudrais ajouter une NSTextAttachment
image à ma chaîne attribuée et la centrer verticalement.
J'ai utilisé le code suivant pour créer ma chaîne:
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];
Cependant, l'image semble s'aligner sur le haut de la cellule textLabel
.
Comment puis-je changer le rect dans lequel la pièce jointe est dessinée?
ios
objective-c
swift
uilabel
nstextattachment
Sean Danzeiser
la source
la source
Réponses:
Vous pouvez changer le rect en sous
NSTextAttachment
-classant et en remplaçantattachmentBoundsForTextContainer:proposedLineFragment:glyphPosition:characterIndex:
. Exemple:Ce n'est pas une solution parfaite. Vous devez déterminer l'origine Y «à l'œil nu» et si vous changez la police ou la taille de l'icône, vous voudrez probablement changer l'origine Y. Mais je n'ai pas pu trouver de meilleur moyen, sauf en mettant l'icône dans une vue d'image séparée (ce qui a ses propres inconvénients).
la source
Vous pouvez utiliser le capHeight de la police.
Objectif c
Rapide
L'image de la pièce jointe est rendue sur la ligne de base du texte. Et l'axe y est inversé comme le système de coordonnées graphiques de base. Si vous souhaitez déplacer l'image vers le haut, définissez le
bounds.origin.y
sur positif.L'image doit être alignée verticalement au centre du capHeight du texte. Nous devons donc définir le
bounds.origin.y
sur(capHeight - imageHeight)/2
.En évitant un effet irrégulier sur l'image, nous devrions arrondir la partie fraction de y. Mais les polices et les images sont généralement petites, même une différence de 1px donne à l'image un aspect mal aligné. J'ai donc appliqué la fonction round avant de diviser. Il rend la fraction partie de la valeur y à 0,0 ou 0,5
Dans votre cas, la hauteur de l'image est plus grande que le capHeight de la police. Mais vous pouvez utiliser la même manière. La valeur du décalage y sera négative. Et il sera disposé à partir du dessous de la ligne de base.
la source
Essayez
- [NSTextAttachment bounds]
. Aucun sous-classement requis.Pour le contexte, je suis en
UILabel
train de rendre un pour l'utiliser comme image de pièce jointe, puis de définir les limites comme ceci:attachment.bounds = CGRectMake(0, self.font.descender, attachment.image.size.width, attachment.image.size.height)
et les lignes de base du texte dans l'image de l'étiquette et le texte dans la chaîne attribuée s'alignent comme souhaité.la source
attachment.bounds = CGRect(x: 0.0, y: self.font.descender, width: attachment.image!.size.width, height: attachment.image!.size.height)
descender
propriété d'UIFont!J'ai trouvé une solution parfaite à cela, cela fonctionne comme un charme pour moi, mais vous devez l'essayer vous-même (probablement la constante dépend de la résolution de l'appareil et peut-être de tout autre chose;)
Devrait fonctionner et ne devrait en aucun cas être flou (merci à
CGRectIntegral
)la source
Qu'en est-il de:
Aucun sous-classement nécessaire
la source
@Travis a raison de dire que le décalage est le descendant de la police. Si vous avez également besoin de mettre l'image à l'échelle, vous devrez utiliser une sous-classe de NSTextAttachment. Vous trouverez ci-dessous le code, inspiré de cet article . Je l'ai également posté comme un élément essentiel .
Utilisez comme suit:
la source
Si vous avez un très grand ascendant et que vous souhaitez centrer l'image (centre de la hauteur du bonnet) comme moi, essayez ceci
Le calcul y est comme l'image ci-dessous
Notez que la valeur y est 0 car nous voulons que l'image se décale de l'origine
Si vous voulez qu'il soit au milieu de l'étiquette entière, utilisez cette valeur y:
la source
Nous pouvons faire une extension dans swift 4 qui génère une pièce jointe avec une image centrée comme celle-ci:
Ensuite, vous pouvez passer l'appel en envoyant le nom de l'image et la police:
Et puis ajoutez l'imageAttachment à l'attributString
la source
Dans mon cas, l'appel de sizeToFit () m'a aidé. Dans Swift 5.1
À l'intérieur de votre étiquette personnalisée:
la source
Veuillez utiliser -lineFrag.size.height / 5.0 pour la hauteur des limites. Cela centre exactement l'image et aligné avec le texte pour toutes les tailles de polices
la source
-lineFrag.size.height/5.0
n'est pas correcte. Au lieu de cela, c'est le descendeur de police.