IOS开发学习笔记十六 使用UITableView控件实现微博列表效果

版权声明:本文为博主原创文章,未经博主允许不得转载。 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

猜你喜欢

转载自blog.csdn.net/abc6368765/article/details/82730032
今日推荐