版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/abc6368765/article/details/82730032
效果:项目地址
微博列表唯一需要注意的是每个条目的列表行高不一致,需要在UITableView的代理方法heightForRowAtIndexPath中动态设置行高
需要创建Module对象CZMicroBlogFrame来存储UITableCell的子View的Frame,然后在heightForRowAtIndexPath中设置行高
plist文件转换成名为CZMicroBlog的model对象:
#import <Foundation/Foundation.h>
@interface CZMicroBlog : NSObject
@property (nonatomic, copy) NSString *text;
@property (nonatomic, copy) NSString *icon;
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *picture;
@property (nonatomic, assign, getter = isVip) BOOL vip;
- (instancetype)initWithDic:(NSDictionary *)dic;
+ (instancetype)microBlogWithDic:(NSDictionary *)dic;
+ (NSArray *)microBlogsList;
@end
#import "CZMicroBlog.h"
@implementation CZMicroBlog
- (instancetype)initWithDic:(NSDictionary *)dic
{
if (self = [super init]) {
[self setValuesForKeysWithDictionary:dic];
}
return self;
}
+ (instancetype)microBlogWithDic:(NSDictionary *)dic
{
return [[self alloc] initWithDic:dic];
}
+ (NSArray *)microBlogsList
{
NSString *path = [[NSBundle mainBundle] pathForResource:@"microblog" ofType:@"plist"];
NSArray *dicArray = [NSArray arrayWithContentsOfFile:path];
NSMutableArray *microBlogs = [NSMutableArray array];
for (NSDictionary *dic in dicArray) {
CZMicroBlog *microBlog = [[CZMicroBlog alloc] initWithDic:dic];
[microBlogs addObject:microBlog];
}
return microBlogs;
}
@end
对model对象进行一层封装为CZMicroBlogFrame
#import <Foundation/Foundation.h>
#import <CoreGraphics/CoreGraphics.h>
#define CZNameFontSize 14
#define CZTextFontSize 15
@class CZMicroBlog;
@interface CZMicroBlogFrame : NSObject
@property (nonatomic, assign, readonly) CGRect iconF;
@property (nonatomic, assign, readonly) CGRect nameF;
@property (nonatomic, assign, readonly) CGRect vipF;
@property (nonatomic, assign, readonly) CGRect textF;
@property (nonatomic, assign, readonly) CGRect pictureF;
@property (nonatomic, assign, readonly) CGFloat rowHeight;
@property (nonatomic, strong) CZMicroBlog *microBlog;
@end
#import "CZMicroBlogFrame.h"
#import "CZMicroBlog.h"
#import <UIKit/UIKit.h>
@implementation CZMicroBlogFrame
- (CGSize)textSize:(NSString *)text maxSize:(CGSize)maxSize font:(UIFont *)font
{
CGSize size = [text boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:font} context:nil].size;
return size;
}
- (void)setMicroBlog:(CZMicroBlog *)microBlog
{
_microBlog = microBlog;
CGFloat margin = 10;
//头像
CGFloat iconW = 35;
CGFloat iconH = 35;
CGFloat iconX = margin;
CGFloat iconY = margin;
_iconF = CGRectMake(iconX, iconY, iconW, iconH);
//昵称
CGSize maxSize = CGSizeMake(MAXFLOAT, MAXFLOAT);
CGSize nameSize = [self textSize:microBlog.name maxSize:maxSize font:[UIFont systemFontOfSize:CZNameFontSize]];
CGFloat nameX = CGRectGetMaxX(_iconF) + margin;
CGFloat nameY = margin + (iconH - nameSize.height)/2;
_nameF = CGRectMake(nameX, nameY, nameSize.width, nameSize.height);
//会员
CGFloat vipW = 14;
CGFloat vipH = 14;
CGFloat vipX = CGRectGetMaxX(_nameF) + margin;
CGFloat vipY = nameY;
_vipF = CGRectMake(vipX, vipY, vipW, vipH);
//内容
CGSize textSize = [self textSize:self.microBlog.text maxSize:CGSizeMake(355, MAXFLOAT) font:[UIFont systemFontOfSize:CZTextFontSize]];
CGFloat textX = iconX;
CGFloat textY = CGRectGetMaxY(_iconF) + margin;
_textF = CGRectMake(textX, textY, textSize.width, textSize.height);
//图片
if (self.microBlog.picture) {
CGFloat pictureW = 100;
CGFloat pictureH = 100;
CGFloat pictureX = iconX;
CGFloat pictureY = CGRectGetMaxY(_textF) + margin;
_pictureF = CGRectMake(pictureX, pictureY, pictureW, pictureH);
_rowHeight = CGRectGetMaxY(_pictureF) + margin;
}else{
_rowHeight = CGRectGetMaxY(_textF) + margin;
}
}
@end
ViewController代码:
#import "ViewController.h"
#import "CZMicroBlog.h"
#import "CZMicroBlogCell.h"
#import "CZMicroBlogFrame.h"
@interface ViewController ()
@property (nonatomic, strong) NSArray *microBlogFrames;
@end
@implementation ViewController
//- (NSArray *)microBlogs
//{
// if (_microBlogs == nil) {
// _microBlogs = [CZMicroBlog microBlogsList];
// }
// return _microBlogs;
//}
- (NSArray *)microBlogFrames
{
if (_microBlogFrames == nil) {
NSArray *blogs = [CZMicroBlog microBlogsList];
NSMutableArray *tmpArray = [NSMutableArray array];
for (CZMicroBlog *blog in blogs) {
CZMicroBlogFrame *blogFrame = [[CZMicroBlogFrame alloc] init];
blogFrame.microBlog = blog;
[tmpArray addObject:blogFrame];
}
_microBlogFrames = tmpArray;
}
return _microBlogFrames;
}
- (void)viewDidLoad
{
[super viewDidLoad];
self.tableView.rowHeight = 200;
}
#pragma mark - 数据源方法
//- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
//{
// return 1;
//}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return self.microBlogFrames.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
//创建自定义cell
CZMicroBlogCell *cell = [CZMicroBlogCell microBlogCellWithTableView:tableView];
//设置属性
CZMicroBlogFrame *frame = self.microBlogFrames[indexPath.row];
cell.microBlogFrame = frame;
//return
return cell;
}
#pragma mark - tableView的代理方法
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
CZMicroBlogFrame *frame = self.microBlogFrames[indexPath.row];
return frame.rowHeight;
}
@end