lonelysoul

Happy share, happy life.

导航

介绍个图文混排的开源库

M80AttributedLabel  (涉及版权问题请联系我删贴,xuym1992@163.com)

一个非常不错的开源库!

今天使用了一下,非常的方便,感觉还缺少多种表情的支持(表面来看,可能我没发现吧),于是加了上去:

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    M80AttributedLabel *label = [[M80AttributedLabel alloc]initWithFrame:CGRectZero];
    label.font = [UIFont systemFontOfSize:15.f];
    label.textColor = [UIColor purpleColor];
    label.backgroundColor = [UIColor lightGrayColor];
    label.lineSpacing = 0.0;
    
    // 加一张图片
    [label appendImage:[UIImage imageNamed:@"logo.jpg"]
               maxSize:CGSizeMake(100, 100)
                margin:UIEdgeInsetsMake(0, 100, 0, 0)
             alignment:M80ImageAlignmentCenter];
    // 此文本内有很多种表情(中括号内)
    NSString *text  = @"\n有人问我为什么要去西藏\n谁都知道318这条天路难走又危险。[haha][haha][haha][haha]\n\t我回答道:“是内心驱使我去那里,因为那里有高原雪山,有哈达。”\n为了此次骑行,我辞掉工作并准备了很久,终于在2014年7月1日和队友们踏上了征途。\n\t除此之外[haha2]我喜欢骑行,其实并没有多么的热爱,就是喜欢而已,而318是每一位骑行者的终极梦想[haha][haha][haha]路途中困难重重,恶劣的天气[face37]以及物质的缺乏[face44][face43],每天都要骑上几十甚至几百公里。[haha]下雨下雪下冰雹最为艰苦,手指僵硬导致很难抓紧刹车把,很多时候一下坡就是一百多公里。无论怎么样,再多的苦难都是值得的,痛并快乐着[face39]。\n[haha][haha1][haha2][face44][face43]\n\n  如果有一天我不见了,那我一定在西藏。[face41]\n  如果有一天我不见了,那我一定在西藏。[face41]\n  如果有一天我不见了,那我一定在西藏。[face41]";
    
    // 利用正则表达式找出文本内所有的表情名,也就是中括号里面的内容
    NSArray *emotes = [self match:text withRegex:@"(?<=\\[).*?(?=\\])"];
    
    // 在字符串内前后分别添加]和[,是为了方便找出表情两边的内容
    text = [NSString stringWithFormat:@"]%@[", text];
    // 如有换行,下面的正则表达式无法查出正确的内容(求高手帮忙写个咯),因此先把换行符转义了
    text = [text stringByReplacingOccurrencesOfString:@"\n" withString:@"\\n"];
    // 找出表情两边的内容
    NSArray *texts  = [self match:text withRegex:@"(?<=\\]).*?(?=\\[)"];
    
    for (NSUInteger i = 0; i < [texts count]; i++) {
        NSString *s = [texts objectAtIndex:i];
        // 根据上面的转义替换成换行符,这样绘制的时候就能换行了
        s = [s stringByReplacingOccurrencesOfString:@"\\n" withString:@"\n"];
        [label appendText:s];
        if (i < [texts count] - 1) {
            [label appendImage:[UIImage imageNamed:[emotes objectAtIndex:i]]
                       maxSize:CGSizeMake(20, 20)
                        margin:UIEdgeInsetsZero
                     alignment:M80ImageAlignmentBottom];
        }
    }
    // 获取label的size(参数是label的最大size)
    CGSize size = [label sizeThatFits:CGSizeMake(kScreenWidth, 600)];
    label.frame = CGRectInset(CGRectMake(5, 20, size.width - 5*2, size.height),0, 0);
    [self.view addSubview:label];
}
- (NSArray *)match:(NSString *)string withRegex:(NSString *)regex {
    NSError *error;
    NSRegularExpression *regularExpression = [NSRegularExpression regularExpressionWithPattern:regex
                                                                                       options:NSRegularExpressionCaseInsensitive
                                                                                         error:&error];
    NSArray *matchResults = [regularExpression matchesInString:string options:0 range:NSMakeRange(0, string.length)];
    NSString *tmpStr = @"";
    NSMutableArray *matchs = [NSMutableArray array];
    for (NSTextCheckingResult *match in matchResults) {
        NSRange matchRange = [match range];
        tmpStr = [string substringWithRange:matchRange];
//        NSLog(@"=%@=", tmpStr);
        [matchs addObject:tmpStr];
    }
    return matchs;
}

 

演示Demo下载地址:demo下载地址 (Xcode 6.1.1 & iOS SDK 8.1)

效果如图所示:

posted on 2014-12-11 15:24  lonelysoul  阅读(695)  评论(0编辑  收藏  举报