J'ai un NSAttributedString auquel j'ajoute un NSTextAttachment. L'image mesure 50 W par 50 C, mais j'aimerais qu'elle soit réduite pour refléter la hauteur de ligne de la chaîne attribuée. Je pensais que cela se ferait automatiquement mais je suppose que non. J'ai consulté la référence de la classe UImage, mais cette image ne semble pas être définie dans un UIImageView, donc aucun accès à une propriété frame. Voici une capture d'écran de ce que j'ai actuellement:
Dans un monde idéal, j'aimerais également mettre en place un moyen de redimensionner l'image en fonction des entrées de l'utilisateur (par exemple, en augmentant la taille de la police). Des idées sur la façon de réaliser ceci?
tHX
voici comment je le crée:
NSTextAttachment *textAttachment = [[NSTextAttachment alloc] init];
textAttachment.image = [UIImage imageNamed:@"note-small.png"];
NSLog(@"here is the scale: %f", textAttachment.image.scale);
NSAttributedString *attrStringWithImage = [NSAttributedString attributedStringWithAttachment:textAttachment];
[headerAS replaceCharactersInRange:NSMakeRange([headerAS length], 0) withString:@" "];
[headerAS replaceCharactersInRange:NSMakeRange([headerAS length], 0) withAttributedString:attrStringWithImage];
Examinez le sous-classement NSTextAttachment
et l'implémentation des méthodes NSTextAttachmentContainer
pour renvoyer différentes tailles en fonction du conteneur de texte fourni. Par défaut, NSTextAttachment
renvoie simplement la taille de l'image qui lui est fournie.
Vous devez définir les pièces jointes du formulaire de limites pour redimensionner l'image comme suit:
attachment.bounds = CGRectMake(0, 0, yourImgWidth, yourImgHeight);
Si vous avez besoin de redimensionner un groupe d’images NSTextAttachment
tout en conservant leurs proportions, j’ai écrit une extension pratique: http://hack.swic.name/convenient-nstextattachment-image-resizing
extension NSTextAttachment {
func setImageHeight(height: CGFloat) {
guard let image = image else { return }
let ratio = image.size.width / image.size.height
bounds = CGRect(x: bounds.Origin.x, y: bounds.Origin.y, width: ratio * height, height: height)
}
}
Exemple d'utilisation:
let textAttachment = NSTextAttachment()
textAttachment.image = UIImage(named: "Image")
textAttachment.setImageHeight(16) // Whatever you need to match your font
let imageString = NSAttributedString(attachment: textAttachment)
yourAttributedString.appendAttributedString(imageString)
Swift4 Si vous souhaitez attribuer une chaîne avec l'image ou une icône
Ici, vous pouvez faire quelque chose comme ça.
func AttributedTextwithImgaeSuffixAndPrefix(AttributeImage1 : UIImage , AttributedText : String ,AttributeImage2 : UIImage, LabelBound : UILabel) -> NSMutableAttributedString
{
let fullString = NSMutableAttributedString(string: " ")
let image1Attachment = NSTextAttachment()
image1Attachment.bounds = CGRect(x: 0, y: ((LabelBound.font.capHeight) - AttributeImage1.size.height).rounded() / 2, width: AttributeImage1.size.width, height: AttributeImage1.size.height)
image1Attachment.image = AttributeImage1
let image1String = NSAttributedString(attachment: image1Attachment)
let image2Attachment = NSTextAttachment()
image2Attachment.bounds = CGRect(x: 0, y: ((LabelBound.font.capHeight) - AttributeImage2.size.height).rounded() / 2, width: AttributeImage2.size.width, height: AttributeImage2.size.height)
image2Attachment.image = AttributeImage2
let image2String = NSAttributedString(attachment: image2Attachment)
fullString.append(image1String)
fullString.append(NSAttributedString(string: AttributedText))
fullString.append(image2String)
return fullString
}
vous pouvez utiliser ce code comme mentionné ci-dessous:
self.lblMid.attributedText = AttributedTextwithImgaeSuffixAndPrefix(AttributeImage1: #imageLiteral(resourceName: "Left") , AttributedText: " Payment Details ", AttributeImage2: #imageLiteral(resourceName: "RIght") , LabelBound: self.lblMid)
ici vous pouvez ajouter des images que vous pouvez remplacer par les vôtres:
NSTextAtatchment est juste un support pour un UIImage afin de redimensionner l'image lorsqu'elle doit être redimensionnée et de recréer la pièce jointe ou de définir son image. Vous devrez forcer une mise à jour nslayout si vous modifiez l'image sur une pièce jointe existante.