前言
提供类似于通讯录头像,支持汉字转拼音,小写转大写,分割等操作
头像浏览
GitHub地址:KJEmitterView
简单介绍 Property & API
NS_ASSUME_NONNULL_BEGIN @interface UIImageViewLettersInfo : NSObject /// 图片颜色,默认随机色 @property(nonatomic,strong)UIColor *color; /// 是否切圆,默认yes @property(nonatomic,assign)BOOL circle; /// 是否取第一个,默认yes @property(nonatomic,assign)BOOL frist; /// 是否将汉字转拼音,默认NO @property(nonatomic,assign)BOOL pinyin; /// 是否将拼音转为大写,默认yes @property(nonatomic,assign)BOOL uppercase; /// 以该符号分割显示第一个,默认空格 @property(nonatomic,strong)NSString *partition; /// 是否分割,默认NO @property(nonatomic,assign)BOOL isPartition; /// 文字信息 @property(nonatomic,strong)NSDictionary *attributes; @end @interface UIImageView (KJLetters) /// 显示文字图片 - (void)kj_imageViewWithText:(NSString*)text LettersInfo:(UIImageViewLettersInfo*(^)(UIImageViewLettersInfo *info))block; /// 浏览头像,点击全屏展示 - (void)kj_headerImageShowScreen; /// 浏览头像,背景颜色 - (void)kj_headerImageShowScreenWithBackground:(UIColor*)color; @end NS_ASSUME_NONNULL_END
kj_imageViewWithText:LettersInfo:
内部我采用回调的方式来接收外界UIImageViewLettersInfo
参数
使用示例
CGFloat x,y; CGFloat sp = kAutoW(10); CGFloat w = (kScreenW-sp*5)/4.; CGFloat h = w+w/2; NSArray *name = @[@"回头",@"看看",@"Z Jian",@"I Love You",@"你好",@"喜 欢",@"痛苦的信 仰",@"吗?",@"End",@"hao ba"]; for (int k=0; k<name.count; k++) { x = k%4*(w+sp)+sp; y = k/4*(h+sp*2)+sp+64+sp*2; UILabel *label = [UILabel kj_createLabelWithText:name[k] FontSize:14 TextColor:UIColor.orangeColor]; label.backgroundColor = [UIColor.orangeColor colorWithAlphaComponent:0.2]; label.borderWidth = 1; label.borderColor = UIColor.orangeColor; label.frame = CGRectMake(x, y, w, w/3); [self.view addSubview:label]; UIImageView *imageView = [[UIImageView alloc]init]; imageView.frame = CGRectMake(x, y+w/3+10, w, w); [self.view addSubview:imageView]; [imageView kj_imageViewWithText:name[k] LettersInfo:^UIImageViewLettersInfo * _Nonnull(UIImageViewLettersInfo * _Nonnull info) { if (k==0) { info.circle = NO; info.color = UIColor.orangeColor; }else if (k==1) { info.pinyin = YES; info.uppercase = NO; }else if (k==2) { }else if (k==3) { info.partition = @" "; info.isPartition = YES; }else if (k==4) { info.pinyin = YES; }else if (k==5) { info.frist = NO; info.isPartition = YES; }else if (k==6) { info.frist = NO; info.isPartition = YES; }else if (k==9) { info.frist = NO; info.uppercase = NO; info.isPartition = YES; } return info; }]; [imageView kj_AddTapGestureRecognizerBlock:^(UIView * _Nonnull view, UIGestureRecognizer * _Nonnull gesture) { [imageView kj_headerImageShowScreen]; }]; }
Category
// // UIImageView+KJLetters.m // KJExtensionHandler // // Created by 杨科军 on 2020/11/17. // https://github.com/yangKJ/KJExtensionHandler #import "UIImageView+KJLetters.h" #import <objc/runtime.h> @implementation UIImageView (KJLetters) /// 显示文字图片 - (void)kj_imageViewWithText:(NSString*)text LettersInfo:(UIImageViewLettersInfo*(^)(UIImageViewLettersInfo *info))block{ UIImageViewLettersInfo *info = [[UIImageViewLettersInfo alloc]init]; if (block) { info = block(info); if (!info.attributes) info.attributes = @{NSFontAttributeName:[self fontForFontName:nil],NSForegroundColorAttributeName:[UIColor whiteColor]}; if (info.pinyin) { text = [self pinYin:text]; if (info.uppercase) text = text.uppercaseString; } if (info.frist) { NSRange range = [text rangeOfComposedCharacterSequencesForRange:NSMakeRange(0,1)]; text = [text substringWithRange:range]; }else{ if (info.isPartition) { NSMutableString *displayString = [NSMutableString stringWithString:info.partition]; NSMutableArray *words = [[text componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] mutableCopy]; if ([words count]) { NSString *firstWord = [words firstObject]; if ([firstWord length]) { NSRange range = [firstWord rangeOfComposedCharacterSequencesForRange:NSMakeRange(0,1)]; [displayString appendString:[firstWord substringWithRange:range]]; } if ([words count] >= 2) { NSString *lastWord = [words lastObject]; while ([lastWord length] == 0 && [words count] >= 2) { [words removeLastObject]; lastWord = [words lastObject]; } if ([words count] > 1) { NSRange lastLetterRange = [lastWord rangeOfComposedCharacterSequencesForRange:NSMakeRange(0,1)]; [displayString appendString:[lastWord substringWithRange:lastLetterRange]]; } } } if (info.uppercase) { text = [displayString uppercaseString]; }else { text = displayString.mutableCopy; } } } self.image = [self imageSnapshotFromText:text Color:info.color Circle:info.circle TextAttributes:info.attributes]; } } - (NSString*)pinYin:(NSString*)text{ NSMutableString *string = [text mutableCopy]; CFStringTransform((CFMutableStringRef)string,NULL,kCFStringTransformMandarinLatin,NO); CFStringTransform((CFMutableStringRef)string,NULL,kCFStringTransformStripDiacritics,NO); return string; } - (UIFont*)fontForFontName:(NSString*)fontName { CGFloat fontSize = CGRectGetWidth(self.bounds) * 0.42; if (fontName) { return [UIFont fontWithName:fontName size:fontSize]; }else{ return [UIFont systemFontOfSize:fontSize]; } } - (UIImage*)imageSnapshotFromText:(NSString*)text Color:(UIColor*)color Circle:(BOOL)circle TextAttributes:(NSDictionary*)attributes{ CGFloat scale = [UIScreen mainScreen].scale; CGSize size = self.bounds.size; if (self.contentMode == UIViewContentModeScaleToFill || self.contentMode == UIViewContentModeScaleAspectFill || self.contentMode == UIViewContentModeScaleAspectFit || self.contentMode == UIViewContentModeRedraw){ size.width = floorf(size.width * scale) / scale; size.height = floorf(size.height * scale) / scale; } UIGraphicsBeginImageContextWithOptions(size, NO, scale); CGContextRef context = UIGraphicsGetCurrentContext(); if (circle) { CGPathRef path = CGPathCreateWithEllipseInRect(self.bounds, NULL); CGContextAddPath(context, path); CGContextClip(context); CGPathRelease(path); } CGContextSetFillColorWithColor(context, color.CGColor); CGContextFillRect(context, CGRectMake(0, 0, size.width, size.height)); CGSize textSize = [text sizeWithAttributes:attributes]; CGRect bounds = self.bounds; [text drawInRect:CGRectMake(bounds.size.width/2 - textSize.width/2, bounds.size.height/2 - textSize.height/2, textSize.width, textSize.height) withAttributes:attributes]; UIImage *snapshot = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return snapshot; } /// 浏览头像,点击全屏展示 - (void)kj_headerImageShowScreen{ [self kj_headerImageShowScreenWithBackground:UIColor.blackColor]; } - (void)kj_headerImageShowScreenWithBackground:(UIColor*)color{ UIImage *image = self.image; CGFloat w = [UIScreen mainScreen].bounds.size.width; CGFloat h = [UIScreen mainScreen].bounds.size.height; UIWindow *window = [UIApplication sharedApplication].keyWindow; UIView *backgroundView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, w, h)]; self.kOriginRect = [self convertRect:self.bounds toView:window]; backgroundView.backgroundColor = color; backgroundView.alpha = 0; UIImageView *imageView = [[UIImageView alloc]initWithFrame:self.kOriginRect]; imageView.image = image; imageView.tag = 552000; [backgroundView addSubview:imageView]; [window addSubview:backgroundView]; UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(kj_hideImage:)]; [backgroundView addGestureRecognizer:tap]; [UIView animateWithDuration:0.3 animations:^{ imageView.frame = CGRectMake(0,(h-image.size.height*w/image.size.width)/2, w, image.size.height*w/image.size.width); backgroundView.alpha = 1; } completion:^(BOOL finished) { }]; } - (void)kj_hideImage:(UITapGestureRecognizer*)tap{ UIView *backgroundView = tap.view; UIImageView *imageView = (UIImageView*)[tap.view viewWithTag:552000]; [UIView animateWithDuration:0.3 animations:^{ imageView.frame = self.kOriginRect; backgroundView.alpha = 0; } completion:^(BOOL finished) { [backgroundView removeFromSuperview]; }]; } - (CGRect)kOriginRect{ return [objc_getAssociatedObject(self, @selector(kOriginRect)) CGRectValue]; } - (void)setKOriginRect:(CGRect)kOriginRect{ NSValue *rect = [NSValue valueWithCGRect:kOriginRect]; objc_setAssociatedObject(self, @selector(kOriginRect), rect, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } @end @implementation UIImageViewLettersInfo - (instancetype)init{ if (self == [super init]) { self.color = [self randomColor]; self.circle = YES; self.frist = YES; self.uppercase = YES; self.partition = @" "; } return self; } - (UIColor*)randomColor{ srand48(arc4random()); float red = 0.0; while (red < 0.1 || red > 0.84) { red = drand48(); } float green = 0.0; while (green < 0.1 || green > 0.84) { green = drand48(); } float blue = 0.0; while (blue < 0.1 || blue > 0.84) { blue = drand48(); } return [UIColor colorWithRed:red green:green blue:blue alpha:1.0f]; } @end