Extending to @bilobatum answer and using this category from another question. I have prepared this:
Using:
UILabel *labelWithImage = [UILabel new]; labelWithImage.text = @"Tap [new-button] to make a new thing!"; NSAttributedString *stringWithImage = [labelWithImage.attributedText attributedStringByReplacingOccurancesOfString:@"[new-button]" withImage:[UIImage imageNamed:@"MyNewThingButtonImage"] scale:0]; labelWithImage.attributedText = stringWithImage;
Implementation:
@interface NSMutableAttributedString (InlineImage) - (void)replaceCharactersInRange:(NSRange)range withInlineImage:(UIImage *)inlineImage scale:(CGFloat)inlineImageScale; @end @interface NSAttributedString (InlineImages) - (NSAttributedString *)attributedStringByReplacingOccurancesOfString:(NSString *)string withInlineImage:(UIImage *)inlineImage scale:(CGFloat)inlineImageScale; @end
.
@implementation NSMutableAttributedString (InlineImages) - (void)replaceCharactersInRange:(NSRange)range withInlineImage:(UIImage *)inlineImage scale:(CGFloat)inlineImageScale { if (floorf(inlineImageScale) == 0) inlineImageScale = 1.0f; // Create resized, tinted image matching font size and (text) color UIImage *imageMatchingFont = [inlineImage imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; { // Font size NSDictionary *attributesForRange = [self attributesAtIndex:range.location effectiveRange:nil]; UIFont *fontForRange = [attributesForRange valueForKey:NSFontAttributeName]; CGSize imageSizeMatchingFontSize = CGSizeMake(inlineImage.size.width * (fontForRange.capHeight / inlineImage.size.height), fontForRange.capHeight); // Some scaling for prettiness CGFloat defaultScale = 1.4f; imageSizeMatchingFontSize = CGSizeMake(imageSizeMatchingFontSize.width * defaultScale, imageSizeMatchingFontSize.height * defaultScale); imageSizeMatchingFontSize = CGSizeMake(imageSizeMatchingFontSize.width * inlineImageScale, imageSizeMatchingFontSize.height * inlineImageScale); imageSizeMatchingFontSize = CGSizeMake(ceilf(imageSizeMatchingFontSize.width), ceilf(imageSizeMatchingFontSize.height)); // Text color UIColor *textColorForRange = [attributesForRange valueForKey:NSForegroundColorAttributeName]; // Make the matching image UIGraphicsBeginImageContextWithOptions(imageSizeMatchingFontSize, NO, 0.0f); [textColorForRange set]; [inlineImage drawInRect:CGRectMake(0 , 0, imageSizeMatchingFontSize.width, imageSizeMatchingFontSize.height)]; imageMatchingFont = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); } // Text attachment with image NSTextAttachment *textAttachment = [NSTextAttachment new]; textAttachment.image = imageMatchingFont; NSAttributedString *imageString = [NSAttributedString attributedStringWithAttachment:textAttachment]; [self replaceCharactersInRange:range withAttributedString:imageString]; } @end @implementation NSAttributedString (InlineImages) - (NSAttributedString *)attributedStringByReplacingOccurancesOfString:(NSString *)string withInlineImage:(UIImage *)inlineImage scale:(CGFloat)inlineImageScale { NSMutableAttributedString *attributedStringWithImages = [self mutableCopy]; [attributedStringWithImages.string enumerateOccurancesOfString:string usingBlock:^(NSRange substringRange, BOOL *stop) { [attributedStringWithImages replaceCharactersInRange:substringRange withInlineImage:inlineImage scale:inlineImageScale]; }]; return [attributedStringWithImages copy]; } @end
Stian Hรธiland Aug 25 '16 at 11:47 2016-08-25 11:47
source share