Latest 1.3.5
Homepage https://github.com/anyunzhong/DFTimelineView
License Apache 2.0
Platforms ios 7.0, requires ARC
Dependencies DFCommon, AFNetworking, SDWebImage, FMDB, MBProgressHUD, MLLabel, MJRefresh, ODRefreshControl, MJPhotoBrowser, MMPopupView, TZImagePickerController
Authors

Version
License
Platform

仿微信朋友圈 仿微信朋友圈时间轴 支持发送图文 短视频 赞 评论 图片大图浏览 视频预览

Alt    Alt    Alt    Alt    Alt    Alt    Alt    Alt    Alt

Android版

https://github.com/anyunzhong/AndroidTimelineView

Installation

pod 'DFTimelineView'

Usage

#import "DFTimelineView.h"

主时间轴 直接继承 DFTimeLineViewController

添加图文
    DFTextImageLineItem *textImageItem = [[DFTextImageLineItem alloc] init];
    textImageItem.itemId = 10000000; //随便设置一个 待服务器生成
    textImageItem.userId = 10018;
    textImageItem.userAvatar = @"http://file-cdn.datafans.net/avatar/1.jpeg";
    textImageItem.userNick = @"富二代";
    textImageItem.title = @"发表了";
    textImageItem.text = text;

    NSMutableArray *srcImages = [NSMutableArray array];
    textImageItem.srcImages = srcImages; //大图 可以是本地路径 也可以是网络地址 会自动判断

    NSMutableArray *thumbImages = [NSMutableArray array];
    textImageItem.thumbImages = thumbImages; //小图 可以是本地路径 也可以是网络地址 会自动判断

    for (id img in images) {
        [srcImages addObject:img];
        [thumbImages addObject:img];
    }

    textImageItem.location = @"广州信息港";
    [self addItemTop:textImageItem];
添加小视频
    DFVideoLineItem *videoItem = [[DFVideoLineItem alloc] init];
    videoItem.itemId = 10000000; //随便设置一个 待服务器生成
    videoItem.userId = 10018;
    videoItem.userAvatar = @"http://file-cdn.datafans.net/avatar/1.jpeg";
    videoItem.userNick = @"富二代";
    videoItem.title = @"发表了";
    videoItem.text = @"新年过节 哈哈"; //这里需要present一个界面 用户填入文字后再发送 场景和发图片一样
    videoItem.location = @"广州";

    videoItem.localVideoPath = videoPath;
    videoItem.videoUrl = @""; //网络路径
    videoItem.thumbUrl = @"";
    videoItem.thumbImage = screenShot; //如果thumbImage存在 优先使用thumbImage

    [self addItemTop:videoItem];
发送图文后回调
-(void)onSendTextImage:(NSString *)text images:(NSArray *)images;
发送视频后回调
-(void)onSendTextImage:(NSString *)text images:(NSArray *)images;
插入到头部和尾部
//添加到末尾
-(void) addItem:(DFBaseLineItem *) item;

//添加到头部
-(void) addItemTop:(DFBaseLineItem *) item;
赞和评论
    DFLineLikeItem *likeItem1_1 = [[DFLineLikeItem alloc] init];
    likeItem1_1.userId = 10086;
    likeItem1_1.userNick = @"Allen";
    [textImageItem.likes addObject:likeItem1_1];

    DFLineLikeItem *likeItem1_2 = [[DFLineLikeItem alloc] init];
    likeItem1_2.userId = 10088;
    likeItem1_2.userNick = @"奥巴马";
    [textImageItem.likes addObject:likeItem1_2];

    DFLineCommentItem *commentItem1_1 = [[DFLineCommentItem alloc] init];
    commentItem1_1.commentId = 10001;
    commentItem1_1.userId = 10086;
    commentItem1_1.userNick = @"习大大";
    commentItem1_1.text = @"精彩 大家鼓掌";
    [textImageItem.comments addObject:commentItem1_1];

    DFLineCommentItem *commentItem1_2 = [[DFLineCommentItem alloc] init];
    commentItem1_2.commentId = 10002;
    commentItem1_2.userId = 10088;
    commentItem1_2.userNick = @"奥巴马";
    commentItem1_2.text = @"欢迎来到美利坚";
    commentItem1_2.replyUserId = 10086;
    commentItem1_2.replyUserNick = @"习大大";
    [textImageItem.comments addObject:commentItem1_2];

    DFLineCommentItem *commentItem1_3 = [[DFLineCommentItem alloc] init];
    commentItem1_3.commentId = 10003;
    commentItem1_3.userId = 10010;
    commentItem1_3.userNick = @"神雕侠侣";
    commentItem1_3.text = @"呵呵";
    [textImageItem.comments addObject:commentItem1_3];
下拉刷新和上拉更多
-(void) refresh
{
    //下来刷新 从服务器请求最新数据
    //请求完成后结束刷新
    [self endRefresh];
}

-(void) loadMore
{
    //加载更多 从服务器请求数据
    //请求完成后结束上拉更多
    [self endLoadMore];
}
设置封面 用户头像 昵称 签名
    NSString *coverUrl = [NSString stringWithFormat:@"http://file-cdn.datafans.net/temp/12.jpg_%dx%d.jpeg", (int)self.coverWidth, (int)self.coverHeight];
    [self setCover:coverUrl];

    NSString *avatarUrl = [NSString stringWithFormat:@"http://file-cdn.datafans.net/avatar/1.jpeg_%dx%d.jpeg", (int)self.userAvatarSize, (int)self.userAvatarSize];
    [self setUserAvatar:avatarUrl];

    [self setUserNick:@"Allen"];

    [self setUserSign:@"梦想还是要有的 万一实现了呢"];
用户评论和点赞后回调
-(void)onCommentCreate:(long long)commentId text:(NSString *)text itemId:(long long) itemId
{

    DFLineCommentItem *commentItem = [[DFLineCommentItem alloc] init];
    commentItem.commentId = [[NSDate date] timeIntervalSince1970];
    commentItem.userId = 10098;
    commentItem.userNick = @"金三胖";
    commentItem.text = text;
    [self addCommentItem:commentItem itemId:itemId replyCommentId:commentId];

    //接下来可以请求服务器操作数据 也可以先请求服务器后再刷新界面

}

-(void)onLike:(long long)itemId
{
    //点赞
    DFLineLikeItem *likeItem = [[DFLineLikeItem alloc] init];
    likeItem.userId = 10092;
    likeItem.userNick = @"琅琊榜";
    [self addLikeItem:likeItem itemId:itemId];

    //接下来可以请求服务器操作数据 也可以先请求服务器后再刷新界面

}
点击头像
-(void)onClickUser:(NSUInteger)userId
{
    //点击左边头像 或者 点击评论和赞的用户昵称
    //例如去到用户单独的时间轴 也可以自定义到其它地方
    UserViewController *controller = [[UserViewController alloc] init];
    [self.navigationController pushViewController:controller animated:YES];
}

-(void)onClickHeaderUserAvatar
{
    [self onClickUser:[当前用户ID]];
}

Extend

STEP1: 扩展新类型 继承 DFBaseLineItem 例如扩展一个分享文章的类型
@interface DFShareLineItem : DFBaseLineItem

@property (nonatomic, strong) NSString *title;
@property (nonatomic, strong) UIImage *digest;
...................
@end
STEP2: 扩展CELL 继承 DFBaseLineCell 例如扩展一个分享文章的CELL为例
@implementation DFShareLineCell

- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
       //初始化相关View

       UILabel *label = ......

       [self.bodyView addSubview:label]; 
       //bodyView只中间部分的容器 比如图文就是文字+九宫格图片部分 视频就是文字+视频区域
       //注意:不能把view直接加到cell的contentView上面
    }
    return self;
}

//更新数据 必需实现
-(void)updateWithItem:(DFShareLineItem *)item
{
    [super updateWithItem:item];

    //将数据更新到相关view上 同时计算出总的高度

    //最后更新父容器的高度
    [self updateBodyView:(计算出的高度)];

}

//通过数据计算出cell的高度
-(CGFloat)getCellHeight:(DFShareLineItem *)item
{

    CGFloat height = [super getCellHeight:item]; //父容器公共部分需要的高度

    return height + body部分的高度;
}
STEP3: 将实体和cell关联起来 加载数据的时候 通过实体去找对应的cell

注意: 需要在数据加载之前就注册好

 DFLineCellManager *manager = [DFLineCellManager sharedInstance];
 [manager registerCell:[DFShareLineItem class] cellClass:[DFShareLineCell class]];

TODO

  • 性能优化
  • 用户时间轴完善
  • 增加其它新的类型

ChangeLog

v1.3.0 重构cell管理模式 点击视频全屏播放

v1.2.9 增加发送图片 发送短视频

v1.2.8 加入pod

Latest podspec

{
    "name": "DFTimelineView",
    "version": "1.3.5",
    "summary": "u4effu5faeu4fe1u670bu53cbu5708u65f6u95f4u8f74 u652fu6301u53d1u9001u56feu6587 u77edu89c6u9891 u8d5e u8bc4u8bba u56feu7247u5927u56feu6d4fu89c8 u89c6u9891u9884u89c8",
    "homepage": "https://github.com/anyunzhong/DFTimelineView",
    "license": "Apache 2.0",
    "authors": {
        "Fast-Dev-Kit": "[email protected]"
    },
    "platforms": {
        "ios": "7.0"
    },
    "source": {
        "git": "https://github.com/anyunzhong/DFTimelineView.git",
        "tag": "1.3.5"
    },
    "source_files": "DFTimelineView/DFTimelineView/**/*.{h,m}",
    "resources": "DFTimelineView/DFTimelineView/Resource/*.png",
    "requires_arc": true,
    "dependencies": {
        "DFCommon": [],
        "AFNetworking": [
            "~> 3.0.0"
        ],
        "SDWebImage": [
            "~> 3.7.3"
        ],
        "FMDB": [
            "~> 2.5"
        ],
        "MBProgressHUD": [
            "~> 0.9.1"
        ],
        "MLLabel": [
            "~> 1.7"
        ],
        "MJRefresh": [
            "~> 3.1.0"
        ],
        "ODRefreshControl": [
            "~> 1.2"
        ],
        "MJPhotoBrowser": [
            "~> 1.0.2"
        ],
        "MMPopupView": [],
        "TZImagePickerController": []
    }
}

Pin It on Pinterest

Share This