DFTimelineView

by anyunzhong

anyunzhong /DFTimelineView

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

443 Stars 154 Forks Last release: Not found Apache License 2.0 65 Commits 22 Releases

Available items

No Items, yet!

The developer of this repository has not created any items for sale yet. Need a bug fixed? Help with integration? A different license? Create a request here:

DFTimelineView

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

注意: 需要在数据加载之前就注册好 ```obj-c DFLineCellManager *manager = [DFLineCellManager sharedInstance]; [manager registerCell:[DFShareLineItem class] cellClass:[DFShareLineCell class]];

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

ChangeLog

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

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

v1.2.8 加入pod

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.