新浪微博客户端(55)-高亮显示微博内容中的昵称,话题,超链接

DJStatus.h

#import <Foundation/Foundation.h>

@class DJUser;

/** 微博 */
@interface DJStatus : NSObject

/** 微博id */
@property (nonatomic,copy) NSString *idstr;
/** 微博内容 */
@property (nonatomic,copy) NSString *text;
/** 微博内容(带属性) */
@property (nonatomic,copy) NSAttributedString *attributedText;
/** 微博关联用户 */
@property (nonatomic,strong) DJUser *user;
/** 发布日期 */
@property (nonatomic,copy) NSString *created_at;
/** 来源 */
@property (nonatomic,copy) NSString *source;
/** 配图 */
@property (nonatomic,strong) NSArray *pic_urls;
/** 转发微博 */
@property (nonatomic,strong) DJStatus *retweeted_status;
/** 转发微博(带属性) */
@property (nonatomic,copy) NSAttributedString *retweetedAttributedText;
/** 转发数 */
@property (nonatomic,assign) int reposts_count;
/** 评论数 */
@property (nonatomic,assign) int comments_count;
/** 表态数 */
@property (nonatomic,assign) int attitudes_count;

@end

DJStatus.m

// 设置带属性的文本内容
- (void)setText:(NSString *)text {

    _text = text;

    // 将微博内容文本转换为带属性的微博内容文本
    _attributedText = [self attributedTextWithText:text];

}

- (void)setRetweeted_status:(DJStatus *)retweeted_status {

    _retweeted_status = retweeted_status;

    DJUser *retwetedUser = retweeted_status.user;
    NSString *retweetedText = [NSString stringWithFormat:@"@%@: %@",retwetedUser.name,retweeted_status.text];

    _retweetedAttributedText = [self attributedTextWithText:retweetedText];

}

/** 普通文本->属性文本 */
- (NSAttributedString *)attributedTextWithText:(NSString *)text {

    // 表情的规则
    NSString *emotionPattern = @"\\[[0-9a-zA-Z\\u4e00-\\u9fa5]+\\]";
    // @的规则
    NSString *atPattern = @"@[0-9a-zA-Z\\u4e00-\\u9fa5-_]+";
    // #话题#的规则
    NSString *topicPattern = @"#[0-9a-zA-Z\\u4e00-\\u9fa5]+#";
    // url链接的规则
    NSString *urlPattern = @"\\b(([\\w-]+://?|www[.])[^\\s()<>]+(?:\\([\\w\\d]+\\)|([^[:punct:]\\s]|/)))";
    NSString *pattern = [NSString stringWithFormat:@"%@|%@|%@|%@", emotionPattern, atPattern, topicPattern, urlPattern];

    // 利用当前文本生成attributedText
    NSMutableAttributedString *attributedText = [[NSMutableAttributedString alloc] initWithString:text];

    // 遍历所有特殊字符串
    [text enumerateStringsMatchedByRegex:pattern usingBlock:^(NSInteger captureCount, NSString *const __unsafe_unretained *capturedStrings, const NSRange *capturedRanges, volatile BOOL *const stop) {
        // !注意: 此处block里回传的是NSRange的指针变量,需要通过*capturedRanges取出对应的NSRange
        [attributedText addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:*capturedRanges];

    }];

    return attributedText;

}

DJStatusCell.m

- (void)setStatusFrame:(DJStatusCellFrame *)statusFrame {
      // 微博内容
    self.contentLabel.frame = statusFrame.contentLabelF;
//    self.contentLabel.text = status.text;
    self.contentLabel.attributedText = status.attributedText;

 /* 转发微博 */
    DJStatus *retweetedStatus = status.retweeted_status;
    if (retweetedStatus) { // 如果有转发微博
        self.retweetView.hidden = NO;
//        DJUser *retwetedUser = retweetedStatus.user;

        // 转发微博内容
        self.retweetContentLabel.frame = statusFrame.retweetContentLabelF;
//        self.retweetContentLabel.text = [NSString stringWithFormat:@"@%@: %@",retwetedUser.name,retweetedStatus.text];
        self.retweetContentLabel.attributedText = status.retweetedAttributedText;

        // 转发微博相册
        if (retweetedStatus.pic_urls.count) { // 如果有微博相册
            self.retweetPhotosView.hidden = NO;
            self.retweetPhotosView.frame = statusFrame.retweetPhotosViewF;
            self.retweetPhotosView.photos = retweetedStatus.pic_urls;
        } else { // 没有微博配图
            self.retweetPhotosView.hidden = YES;
        }
        // 转发微博整体
        self.retweetView.frame = statusFrame.retweetViewF;

    } else { // 如果没有转发微博
        self.retweetView.hidden = YES;
    }

}

集成RegexKitLite框架

1. 添加RegexKitLite的库文件到项目:

2. 如果此时执行Command+B编译,Xcode会报错:

3. 错误的原因是RegexKitLite框架是非ARC的代码,因此我们需要在Xcode中指定RegexKitLite为非ARC

4. 完成上述操作后再次编译,发现还是报错,这是因为RegexKitLite依赖于libicucore.dylib这个动态库,因此我们在Xcode中添加这个库

5. 完成上述操作后,再次编译,同时在需要使用这个库的.m文件中导入RegexKitLite的头文件“RegexKitLite.h”,发现已经可以正常使用了

最终效果:

时间: 2024-10-08 20:50:27

新浪微博客户端(55)-高亮显示微博内容中的昵称,话题,超链接的相关文章

新浪微博客户端(56)-拼接微博内容中的昵称,超链接,表情图片

DJStatusPart.h #import <Foundation/Foundation.h> @interface DJStatusPart : NSObject /** 文本块内容 */ @property (nonatomic,copy) NSString *text; /** 文本块范围 */ @property (nonatomic,assign) NSRange range; /** 当前文本块是否是特殊文本(昵称,超链接,Emoji) */ @property (nonatom

Android新浪微博客户端(七)——ListView中的图片异步加载、缓存

原文出自:方杰|http://fangjie.sinaapp.com/?p=193转载请注明出处 最终效果演示:http://fangjie.sinaapp.com/?page_id=54该项目代码已经放到github:https://github.com/JayFang1993/SinaWeibo 一.ListView的图片异步加载 我们都知道对每一个Weibo Item都有用户头像,而且每一条微博还可能带有图片.如果在加载列表的同时加载图片,这样有几个缺点,第一很费事,界面卡住,用户体验很不

新浪微博客户端(22)-创建微博Cell

DJStatusCell.h #import <UIKit/UIKit.h> @class DJStatusCellFrame; @interface DJStatusCell : UITableViewCell /** DJStatusCell 的默认构造方法 */ + (instancetype)cellWithTableView:(UITableView *)tableView; @property (nonatomic,strong) DJStatusCellFrame *status

新浪微博客户端(58)-处理点击微博内容中的关键字

DJStatus.m // 创建一个用于包含特殊文本的集合 NSMutableArray *specialTextArray = [NSMutableArray array]; // 取出数组中的文本块进行拼接 for (DJStatusPart *part in statusParts) { NSAttributedString *subString = nil; if (part.isSpecial) { // 判断是否是特殊文本(若是特殊文本,则进行特殊处理,超链接:变色,表情文本:更换成

新浪微博客户端(30)-制作微博中的九宫格相册图片

DJStatusPhotosView.h #import <UIKit/UIKit.h> @interface DJStatusPhotosView : UIView @property (nonatomic,strong) NSArray *photos; /** 根据相册图片个数计算相册尺寸 */ + (CGSize)sizeWithCount:(NSUInteger)count; @end DJStatusPhotosView.m #import "DJStatusPhotos

零授权 抓取新浪微博任何用户的微博内容

一.微博API 使用微博API获取数据是最简单方便,同时数据完整性高的方式,缺点是微博开发平台对于API的调用次数做了严格的限制.具体使用过程参考http://open.weibo.com/,有详细的教程,对于API次数的限制,我们是通过注册多个开发者账号来绕过,对于某个IP调用API次数的限制,暂时没办法解决.微博API是通过httpclient发起请求,返回json形式的数据.对于数据重复获取方面,也有专门的接口通过参数控制获取增量数据.优点:简单,数据完整性高,增量简单.缺点:API次数有

新浪微博客户端(29)-格式化微博来源显示

DJStatus.m // 更新来源显示 - (void)setSource:(NSString *)source { NSRange range; range.location = [source rangeOfString:@">"].location + 1; range.length = [source rangeOfString:@"<" options:NSBackwardsSearch].location - range.location;

新浪微博客户端(25)-添加转发微博

DJStatusCell.m /* 转发微博部分 */ /** 转发微博整体 */ @property (nonatomic,weak) UIView *retweetView; /** 转发微博内容 */ @property (nonatomic,weak) UILabel *retweetContentLabel; /** 转发微博图片 */ @property (nonatomic,weak) UIImageView *retweetPhotoView; #pragma mark - 转发

[Python爬虫] Selenium爬取新浪微博客户端用户信息、热点话题及评论 (上)

一. 文章介绍 前一篇文章"[python爬虫] Selenium爬取新浪微博内容及用户信息"简单讲述了如何爬取新浪微博手机端用户信息和微博信息. 用户信息:包括用户ID.用户名.微博数.粉丝数.关注数等. 微博信息:包括转发或原创.点赞数.转发数.评论数.发布时间.微博内容等. 它主要通过从文本txt中读取用户id,通过"URL+用户ID" 访问个人网站,如柳岩: http://weibo.cn/guangxianliuya 因为手机端数据相对精简简单,所以采用输