Controller:
 //
// ViewController.m
// Weibo
//
// Created by hellovoidworld on 14/12/4.
// Copyright (c) 2014年 hellovoidworld. All rights reserved.
// #import "ViewController.h"
#import "Weibo.h"
#import "WeiboCell.h"
#import "WeiboFrame.h" @interface ViewController () /** 微博数组,类型是WeiboFrame,包含了数据和位置尺寸信息 */
@property(nonatomic, strong) NSArray *weibos; @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
} - (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
} // 屏蔽状态栏
- (BOOL)prefersStatusBarHidden {
return YES;
} #pragma mark - 数据源操作
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return self.weibos.count;
} - (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
// 传入tableView是为了使用cell缓存池
WeiboCell *cell = [WeiboCell cellWithTableView:self.tableView]; // 传入微博的数据和位置尺寸信息
cell.weiboFrame = self.weibos[indexPath.row]; return cell;
} #pragma mark - 加载数据
// 延迟加载plist文件中的数据为微博数组
- (NSArray *) weibos {
if (nil == _weibos) {
NSArray *dictArray = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"weibo.plist" ofType:nil]]; NSMutableArray *mdictArray = [NSMutableArray array];
for (NSDictionary *dict in dictArray) {
WeiboFrame *weiboFrame = [[WeiboFrame alloc] init];
Weibo *weibo = [Weibo weiboWithDictionary:dict]; // 传入weibo模型数据到frame模型,内部保存数据,计算各个控件的位置、尺寸
weiboFrame.weibo = weibo; [mdictArray addObject:weiboFrame];
} _weibos = mdictArray;
} return _weibos;
} #pragma mark - 代理操作
// 动态调整每个cell的高度
- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
WeiboFrame *weiboFrame = self.weibos[indexPath.row];
return weiboFrame.cellHeight;
} @end
 
View:
 //
// WeiboCell.h
// Weibo
//
// Created by hellovoidworld on 14/12/5.
// Copyright (c) 2014年 hellovoidworld. All rights reserved.
// // 用于装载每个TabelViewCell的model
#import <UIKit/UIKit.h> @class WeiboFrame;
@interface WeiboCell : UITableViewCell // 微博frame,内持有微博数据和尺寸、位置信息
@property(nonatomic, strong) WeiboFrame *weiboFrame; // 自定义带有父控件tableView初始化方法
+ (instancetype) cellWithTableView:(UITableView *) tableView; @end
 
 //
// WeiboCell.m
// Weibo
//
// Created by hellovoidworld on 14/12/5.
// Copyright (c) 2014年 hellovoidworld. All rights reserved.
// #import "WeiboCell.h"
#import "WeiboFrame.h"
#import "Weibo.h" // 昵称字体
#define NAME_FONT [UIFont systemFontOfSize:14]
// 博文字体
#define TEXT_FONT [UIFont systemFontOfSize:15] @interface WeiboCell() // 创建各个子控件的成员,用来分离数据赋值和尺寸、位置调整
/** 头像 */
@property(nonatomic, weak) UIImageView *iconView; /** 昵称 */
@property(nonatomic, weak) UILabel *nameView; /** vip标志 */
@property(nonatomic, weak) UIImageView *vipView; /** 博文 */
@property(nonatomic, weak) UILabel *textView; /** 配图 */
@property(nonatomic, weak) UIImageView *pictureView; @end @implementation WeiboCell - (void)awakeFromNib {
// Initialization code
} - (void)setSelected:(BOOL)selected animated:(BOOL)animated {
[super setSelected:selected animated:animated]; // Configure the view for the selected state
} #pragma mark - 初始化
// 自定义带有父控件tableView初始化方法
+ (instancetype) cellWithTableView:(UITableView *) tableView {
static NSString *ID = @"weibo"; // 从缓存池寻找
WeiboCell *cell = [tableView dequeueReusableCellWithIdentifier:ID]; // 使用重写的构造方法初始化
if (nil == cell) {
cell = [[WeiboCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID];
} return cell;
} // 重写缓存池初始化方法,加入各个子控件,可以设置静态数据,但是没有动态的数据和位置尺寸信息
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
// 1.头像
/**
由于self.iconView是weak类型,不能写成:
self.iconView = [[UIImageView alloc] init];
会被立即释放,不能正常赋值,下同
*/
UIImageView *iconView = [[UIImageView alloc] init];
[self.contentView addSubview:iconView];
self.iconView = iconView; // 2.昵称
UILabel *nameView = [[UILabel alloc] init];
// 指定字体用来计算占用的尺寸大小
nameView.font = NAME_FONT;
[self.contentView addSubview:nameView];
self.nameView = nameView; // 3.vip标志
UIImageView *vipView = [[UIImageView alloc] init];
vipView.image = [UIImage imageNamed:@"vip"];
[self.contentView addSubview:vipView];
self.vipView = vipView; // 4.博文
UILabel *textView = [[UILabel alloc] init];
textView.font = TEXT_FONT;
textView.numberOfLines = ;// 设置自动换行
[self.contentView addSubview:textView];
self.textView = textView; // 5.配图
UIImageView *pictureView = [[UIImageView alloc] init];
[self.contentView addSubview:pictureView];
self.pictureView = pictureView;
} return self;
} #pragma mark - 数据加载
// 加载数据的时候设置数据和尺寸、位置
- (void)setWeiboFrame:(WeiboFrame *)weiboFrame {
_weiboFrame = weiboFrame; // 1.设置数据
[self calWeiboData]; // 2.设置尺寸、位置
[self calWeiboFrame];
} // 设置数据
- (void) calWeiboData {
Weibo *weibo = self.weiboFrame.weibo; // 1.头像
self.iconView.image = [UIImage imageNamed:weibo.icon]; // 2.昵称
self.nameView.text = weibo.name; // 3.vip标志
if (weibo.vip) {
self.vipView.hidden = NO;
}
else {
self.vipView.hidden = YES;
} // 4.博文
self.textView.text = weibo.text; // 5.配图
if (weibo.picture) {
self.pictureView.hidden = NO;
self.pictureView.image = [UIImage imageNamed:weibo.picture];
}
else {
self.pictureView.hidden = YES;
self.pictureView.image = nil;
}
} // 设置位置、尺寸
- (void) calWeiboFrame {
// 1.头像
self.iconView.frame = self.weiboFrame.iconFrame; // 2.昵称
self.nameView.frame = self.weiboFrame.nameFrame; // 3.vip标志
self.vipView.frame = self.weiboFrame.vipFrame; // 4.博文
self.textView.frame = self.weiboFrame.textFrame; // 5.配图
if (self.weiboFrame.weibo.picture) {
self.pictureView.frame = self.weiboFrame.pictureFrame;
}
} @end
 
 
Model:
 //
// Weibo.h
// Weibo
//
// Created by hellovoidworld on 14/12/5.
// Copyright (c) 2014年 hellovoidworld. All rights reserved.
// // 装在微博数据的model
#import <Foundation/Foundation.h> @interface Weibo : NSObject #pragma mark - 成员变量
/** 头像 */
@property(nonatomic, copy) NSString *icon; /** 昵称 */
@property(nonatomic, copy) NSString *name; /** vip标志 */
@property(nonatomic, assign) BOOL vip; /** 博文 */
@property(nonatomic, copy) NSString *text; /** 配图 */
@property(nonatomic, copy) NSString *picture; #pragma mark - 自定义初始化方法
/** 使用字典赋值成员 */
- (instancetype) initWithDictionary:(NSDictionary *) dictionary; /** 使用字典赋值成员 */
+ (instancetype) weiboWithDictionary:(NSDictionary *) dictionary; /** 返回空的model */
+ (instancetype) weibo; @end
 
 //
// Weibo.m
// Weibo
//
// Created by hellovoidworld on 14/12/5.
// Copyright (c) 2014年 hellovoidworld. All rights reserved.
// #import "Weibo.h" @implementation Weibo /** 使用字典赋值成员 */
- (instancetype) initWithDictionary:(NSDictionary *) dictionary {
if (self = [super init]) {
[self setValuesForKeysWithDictionary:dictionary];
} return self;
} /** 使用字典赋值成员 */
+ (instancetype) weiboWithDictionary:(NSDictionary *) dictionary {
return [[self alloc] initWithDictionary:dictionary];
} /** 返回空的model */
+ (instancetype) weibo {
return [self weiboWithDictionary:nil];
} @end
 
 //
// WeiboFrame.h
// Weibo
//
// Created by hellovoidworld on 14/12/5.
// Copyright (c) 2014年 hellovoidworld. All rights reserved.
// // 装在了每个cell的位置、尺寸和微博数据的model @class Weibo;
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h> // CGRect需要引入UIKit @interface WeiboFrame : NSObject // 微博数据
@property(nonatomic, strong) Weibo *weibo; /** 头像 */
@property(nonatomic, assign, readonly) CGRect iconFrame; /** 昵称 */
@property(nonatomic, assign, readonly) CGRect nameFrame; /** vip标志 */
@property(nonatomic, assign, readonly) CGRect vipFrame; /** 博文 */
@property(nonatomic, assign, readonly) CGRect textFrame; /** 配图 */
@property(nonatomic, assign, readonly) CGRect pictureFrame; /** 一条微博cell的高度 */
@property(nonatomic, assign, readonly) CGFloat cellHeight; @end
 //
// WeiboFrame.m
// Weibo
//
// Created by hellovoidworld on 14/12/5.
// Copyright (c) 2014年 hellovoidworld. All rights reserved.
// #import "WeiboFrame.h"
#import "Weibo.h" // 昵称字体
#define NAME_FONT [UIFont systemFontOfSize:14]
// 博文字体
#define TEXT_FONT [UIFont systemFontOfSize:15] @implementation WeiboFrame #pragma mark - 加载数据
// 加载数据,用以计算各个控件的位置、尺寸
- (void)setWeibo:(Weibo *)weibo {
_weibo = weibo; // 间隙参数
CGFloat padding = ; // 1.头像
CGFloat iconWidth = ;
CGFloat iconHeight = ;
CGFloat iconX = padding;
CGFloat iconY = padding;
_iconFrame = CGRectMake(iconX, iconY, iconWidth, iconHeight); // 2.昵称
// 计算昵称占用的size
CGSize nameSize = [self calTextSizeWithText:self.weibo.name font:TEXT_FONT maxSize:CGSizeMake(MAXFLOAT, MAXFLOAT)]; CGFloat nameX = CGRectGetMaxX(_iconFrame) + padding;
CGFloat nameY = iconY + (iconHeight - nameSize.height) / ;// 居中
_nameFrame.size = nameSize;
_nameFrame.origin = CGPointMake(nameX, nameY); // 3.vip标志
CGFloat vipWith = ;
CGFloat vipHeight = ;
CGFloat vipX = CGRectGetMaxX(_nameFrame) + padding;
CGFloat vipY = nameY;
_vipFrame = CGRectMake(vipX, vipY, vipWith, vipHeight); // 4.博文
CGSize textSize = [self calTextSizeWithText:self.weibo.text font:TEXT_FONT maxSize:CGSizeMake(, MAXFLOAT)];
CGFloat textX = padding;
CGFloat textY = CGRectGetMaxY(_iconFrame) + padding;
_textFrame = CGRectMake(textX, textY, textSize.width, textSize.height); // 5.配图
if (self.weibo.picture) {
CGFloat pictureWidth = ;
CGFloat pictureHeight = ;
CGFloat pictureX = padding;
CGFloat pictureY = CGRectGetMaxY(_textFrame) + padding;
_pictureFrame = CGRectMake(pictureX, pictureY, pictureWidth, pictureHeight); _cellHeight = CGRectGetMaxY(_pictureFrame) + padding; //计算cell高度
}
else {
_cellHeight = CGRectGetMaxY(_textFrame) + padding;
}
} // 使用自带方法计算一段文字占用的size
- (CGSize) calTextSizeWithText:(NSString *) text font:(UIFont *) font maxSize:(CGSize) maxSize {
NSDictionary *attrs = @{NSFontAttributeName : font}; return [text boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:attrs context:nil].size;
} @end
 
weibo.plist:
 
images:
 
 
 
 
 
 

[iOS基础控件 - 6.7.1] 微博展示 代码的更多相关文章

  1. [iOS基础控件 - 6.4] 汽车品牌展示 Model嵌套/KVC/TableView索引

    A.需求 1.使用汽车品牌名称头字母为一个Model,汽车品牌为一个Model,头字母Model嵌套品牌Model 2.使用KVC进行Model封装赋值 3.展示头字母标题 4.展示索引(使用KVC代 ...

  2. [iOS基础控件 - 5.5] 代理设计模式 (基于”APP列表"练习)

    A.概述      在"[iOS基础控件 - 4.4] APP列表 进一步封装,初见MVC模式”上进一步改进,给“下载”按钮加上效果.功能      1.按钮点击后,显示为“已下载”,并且不 ...

  3. [iOS基础控件 - 6.7] 微博展示 使用代码自定义TableCell(动态尺寸)

    A.需求 1.类似于微博内容的展示 2.头像 3.名字 4.会员标志 5.内容 6.分割线 7.配图(可选,可有可无)   code source: https://github.com/hellov ...

  4. iOS 基础控件(下)

    上篇介绍了UIButton.UILabel.UIImageView和UITextField,这篇就简短一点介绍UIScrollView和UIAlertView. UIScrollView 顾名思义也知 ...

  5. [iOS基础控件 - 6.9] 聊天界面Demo

    A.需求 做出一个类似于QQ.微信的聊天界面 1.每个cell包含发送时间.发送人(头像).发送信息 2.使用对方头像放在左边,我方头像在右边 3.对方信息使用白色背景对话框,我方信息使用蓝色背景对话 ...

  6. [iOS基础控件 - 7.0] UIWebView

    A.基本使用 1.概念 iOS内置的浏览器控件 Safari浏览器就是通过UIWebView实现的   2.用途:制作简易浏览器 (1)基本请求 创建请求 加载请求 (2)代理监听webView加载, ...

  7. [iOS基础控件 - 6.11.3] 私人通讯录Demo 控制器的数据传递、存储

    A.需求 1.搭建一个"私人通讯录"Demo 2.模拟登陆界面 账号 密码 记住密码开关 自动登陆开关 登陆按钮 3.退出注销 4.增删改查 5.恢复数据(取消修改)   这个代码 ...

  8. [iOS基础控件 - 6.10.2] PickerView 自定义row内容 国家选择Demo

    A.需求 1.自定义一个UIView和xib,包含国家名和国旗显示 2.学习row的重用   B.实现步骤 1.准备plist文件和国旗图片     2.创建模型 // // Flag.h // Co ...

  9. iOS基础 - 控件属性

    一.控件的属性 1.CGRect frame 1> 表示控件的位置和尺寸(以父控件的左上角为坐标原点(0, 0)) 2> 修改这个属性,可以调整控件的位置和尺寸 2.CGPoint cen ...

随机推荐

  1. ABC: Always Be Coding——程序员面试必

    本文作者@guitardave24 ">David Byttow 是一名程序员,曾在 Google 和 Square 等公司工作过. 在正文之前,先让我们回答几个简单的问题:第一,你面 ...

  2. Cinema 4D R16安装教程

    CINEMA 4D_百度百科 http://baike.baidu.com/view/49453.htm?fr=aladdin 转自百度贴吧 [教程]Cinema 4D R16新功能介绍及安装教程_c ...

  3. profile工具

    gprof callgrind vtune(待使用) ----time命令(待学习) ps -u <username> -H -opid,cmd strace

  4. [企业级linux安全管理]- 安全管理基础(1)

    1. 操作条件:  (1)装有 Cent OS Linux 操作系统的虚拟机一台 2. 背景: 某企业有一台服务器,其信息如下: (1)  该服务器上存在管理员 root,密码为 root,另存有一些 ...

  5. P125、面试题19:二叉树的镜像

    题目:请完成一个函数,输入一个二叉树,该函数输出它的镜像二叉树结点的定义如下:struct BinaryTreeNode{       int     m_nValue;       BinaryTr ...

  6. Windows平台下的session0创建进程的问题与解决办法

    很多博客都有记载如何在session0下创建进程的办法,也就是使用CreateProcessAsUser.但是这个要求服务的进程有SE_INCREASE_QUOTA_NAME和SE_ASSIGNPRI ...

  7. python学习笔记三--字典

    一.字典: 1. 不是序列,是一种映射, 键 :值的映射关系. 2. 没有顺序和位置的概念,只是把值存到对应的键里面. 3. 通过健而不是通过偏移量来读取 4. 任意对象的无序集合 5. 可变长,异构 ...

  8. 1019.Line Painting(线段树 离散化)

    1019 离散化都忘记怎么写了 注意两个端点 离散化后用线段树更新区间 混色为-1  黑为2  白为1  因为N不大 最后直接循环标记这一段的颜色查找 #include <iostream> ...

  9. hibernate实体的几种状态:

    hibernate实体的几种状态: 实体的生命周期中,实体主要经过瞬时(Transient),托管(Attatched或Managed),游离(Detached)和销毁(Removed)四个状态. 瞬 ...

  10. freemarker跳出循环

    break语句跳出当前循环,如下: <#list table.columns as c>             <#if c.isPK>                 &l ...