zoukankan      html  css  js  c++  java
  • ios-新浪微博

    导入素材 plist 和图片

    status 封装数据 statuscell 构造cell模块 statusframe 来计算cell的高度 同时也可以把一部分 数据封装和 计算位置 写进去

    //
    //  HMStatus.h
    //  新浪微博
    //
    //  Created by YaguangZhu on 15/8/26.
    //  Copyright (c) 2015年 YaguangZhu. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    
    @interface HMStatus : NSObject
    
    @property(nonatomic,copy) NSString *name;
    @property(nonatomic,copy) NSString *icon;
    @property(nonatomic,copy) NSString *text;
    @property(nonatomic,copy) NSString *picture;
    @property(nonatomic,assign) BOOL vip;
    
    - (instancetype)initWithDict:(NSDictionary *)dict;
    + (instancetype)statusWithDict:(NSDictionary *)dict;
    + (NSArray *)statuses;
    
    
    @end
    //
    //  HMStatus.m
    //  新浪微博
    //
    //  Created by YaguangZhu on 15/8/26.
    //  Copyright (c) 2015年 YaguangZhu. All rights reserved.
    //
    
    #import "HMStatus.h"
    
    @implementation HMStatus
    
    - (instancetype)initWithDict:(NSDictionary *)dict
    {
        self = [super init];
        if (self) {
            [self setValuesForKeysWithDictionary:dict];
        }
        return self;
    }
    
    + (instancetype)statusWithDict:(NSDictionary *)dict
    {
        return [[self alloc] initWithDict:dict];
    }
    
    + (NSArray *)statuses
    {
        NSArray *array = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"statuses.plist" ofType:nil]];
        NSMutableArray *arrayM = [NSMutableArray array];
        for (NSDictionary *dict in array) {
            [arrayM addObject:[self statusWithDict:dict]];
        }
        
        return arrayM;
    }
     
    @end
    //
    //  HMStatusCell.h
    //  新浪微博
    //
    //  Created by YaguangZhu on 15/8/26.
    //  Copyright (c) 2015年 YaguangZhu. All rights reserved.
    //
    
    #import <UIKit/UIKit.h>
    @class HMStatus;
    @interface HMStatusCell : UITableViewCell
    
    @property (nonatomic, strong) HMStatus *status;
    
    @end
    //
    //  HMStatusCell.m
    //  新浪微博
    //
    //  Created by YaguangZhu on 15/8/26.
    //  Copyright (c) 2015年 YaguangZhu. All rights reserved.
    //
    
    #import "HMStatusCell.h"
    #import "HMStatus.h"
    /** 姓名字体 */
    #define kNameFont   [UIFont systemFontOfSize:14]
    /** 正文字体 */
    #define kTextFont   [UIFont systemFontOfSize:16]
    
    @interface HMStatusCell()
    
    @property (nonatomic, strong) UIImageView *iconView;
    @property (nonatomic, strong) UILabel *nameView;
    @property (nonatomic, strong) UIImageView *vipView;
    @property (nonatomic, strong) UILabel *textView;
    @property (nonatomic, strong) UIImageView *pictureView;
    
    @end
    
    @implementation HMStatusCell
    
    
    - (UIImageView *)iconView
    {
        if (_iconView == nil) {
            _iconView = [[UIImageView alloc] init];
            [self.contentView addSubview:_iconView];
        }
        return _iconView;
    }
    
    - (UILabel *)nameView
    {
        if (_nameView == nil) {
            _nameView = [[UILabel alloc] init];
            // 默认字体是17号
            _nameView.font = kNameFont;
            [self.contentView addSubview:_nameView];
        }
        return _nameView;
    }
    
    - (UIImageView *)vipView
    {
        if (_vipView == nil) {
            _vipView = [[UIImageView alloc] init];
            _vipView.image = [UIImage imageNamed:@"vip"];
            _vipView.hidden = YES;
            
            [self.contentView addSubview:_vipView];
        }
        return _vipView;
    }
    
    - (UILabel *)textView
    {
        if (_textView == nil) {
            _textView = [[UILabel alloc] init];
            _textView.font = kTextFont;
            _textView.numberOfLines = 0;
            
            [self.contentView addSubview:_textView];
        }
        return _textView;
    }
    
    - (UIImageView *)pictureView
    {
        if (_pictureView == nil) {
            _pictureView = [[UIImageView alloc] init];
            [self.contentView addSubview:_pictureView];
        }
        return _pictureView;
    }
    
    
    - (void)setStatus:(HMStatus *)status
    {
        _status = status;
        
        // 1> 设置数据
        [self settingData];
        
        // 2> 设置位置
        [self settingFrame];
    }
    
    - (void)settingData
    {
        // 头像
        self.iconView.image = [UIImage imageNamed:self.status.icon];
        // 姓名
        self.nameView.text = self.status.name;
        // vip(可选的)
        if (self.status.vip) {
            self.vipView.hidden = NO;
            self.nameView.textColor = [UIColor redColor];
        } else {
            self.vipView.hidden = YES;
            self.nameView.textColor = [UIColor blackColor];
        }
        
        // 正文
        self.textView.text = self.status.text;
        
        // 配图(可选参数)
        // imageNamed:nil CUICatalog: Invalid asset name supplied: (null), or invalid scale factor: 2.000000
        if (self.status.picture.length > 0) {
            self.pictureView.hidden = NO;
            self.pictureView.image = [UIImage imageNamed:self.status.picture];
        } else {
            self.pictureView.hidden = YES;
        }
    }
    
    - (void)settingFrame
    {
        // 0. 定义间距
        CGFloat padding = 10;
        
        // 1. 头像
        CGFloat iconX = padding;
        CGFloat iconY = padding;
        CGFloat iconW = 30;
        CGFloat iconH = 30;
        self.iconView.frame = CGRectMake(iconX, iconY, iconW, iconH);
        
        // 2. 姓名大小由文字的长度来决定
        // boundingRectWithSize计算给定文本字符串所占的区域
        // 返回值是一个x,y = 0的CGRect,w,h是计算好的宽高
        //
        // 如果要计算多行的准确高度,需要传入NSStringDrawingUsesLineFragmentOrigin选项
        // dict用于指定字体的相关属性的字典,UIKit框架中的第一个头文件
        // context: nil
        NSDictionary *nameDict = @{NSFontAttributeName: kNameFont};
        CGRect nameFrame = [self.status.name boundingRectWithSize:CGSizeMake(MAXFLOAT, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:nameDict context:nil];
        nameFrame.origin.x = CGRectGetMaxX(self.iconView.frame) + padding;
        nameFrame.origin.y = padding + (self.iconView.bounds.size.height - nameFrame.size.height) * 0.5;
        self.nameView.frame = nameFrame;
        
        // vip图标
        CGFloat vipX = CGRectGetMaxX(self.nameView.frame) + padding;
        CGFloat vipY = self.nameView.frame.origin.y;
        CGFloat vipW = 14;
        CGFloat vipH = 14;
        self.vipView.frame = CGRectMake(vipX, vipY, vipW, vipH);
        
        // 正文
        NSDictionary *textDict = @{NSFontAttributeName: kTextFont};
        CGRect textFrame = [self.status.text boundingRectWithSize:CGSizeMake(300, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:textDict context:nil];
        textFrame.origin.x = padding;
        textFrame.origin.y = CGRectGetMaxY(self.iconView.frame) + padding;
        self.textView.frame = textFrame;
        
        CGFloat cellHeight;
        
        if (self.status.picture.length > 0) {
            // 配图
            CGFloat pictureX = padding;
            CGFloat pictureY = CGRectGetMaxY(textFrame) + padding;
            CGFloat pictureW = 100;
            CGFloat pictureH = 100;
            self.pictureView.frame = CGRectMake(pictureX, pictureY, pictureW, pictureH);
            
            cellHeight = CGRectGetMaxY(self.pictureView.frame) + padding;
        } else {
            cellHeight = CGRectGetMaxY(self.textView.frame) + padding;
        }
    }
    
    - (void)awakeFromNib {
        // Initialization code
    }
    
    - (void)setSelected:(BOOL)selected animated:(BOOL)animated {
        [super setSelected:selected animated:animated];
    
        // Configure the view for the selected state
    }
    
    @end
    //
    //  StatusFrame.h
    //  新浪微博
    //
    //  Created by YaguangZhu on 15/8/26.
    //  Copyright (c) 2015年 YaguangZhu. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    #import <UIKit/UIKit.h>
    @class HMStatus;
    
    
    @interface StatusFrame : NSObject
    
    @property (nonatomic, assign) CGRect iconf;
    @property (nonatomic, assign) CGRect namef;
    @property (nonatomic, assign) CGRect vipf;
    @property (nonatomic, assign) CGRect textf;
    @property (nonatomic, assign) CGRect picturef;
    
    /** 行高 */
    @property (nonatomic, assign) CGFloat cellHeight;
    
    /** 所有控件的尺寸都可以通过Status来计算得出 */
    @property (nonatomic, strong) HMStatus *status;
    
    /** 所有的statusFrame数据数组 */
    + (NSArray *)statusFrames;
    
    @end
    //
    //  StatusFrame.m
    //  新浪微博
    //
    //  Created by YaguangZhu on 15/8/26.
    //  Copyright (c) 2015年 YaguangZhu. All rights reserved.
    //
    
    #import "StatusFrame.h"
    #import "HMStatus.h"
    
    /** 姓名字体 */
    #define kNameFont   [UIFont systemFontOfSize:14]
    /** 正文字体 */
    #define kTextFont   [UIFont systemFontOfSize:16]
    @implementation StatusFrame
    
    -(void)setStatus:(HMStatus *)status
    {
        _status = status;
        
        // 0. 定义间距
        CGFloat padding = 10;
        
        // 1. 头像
        CGFloat iconX = padding;
        CGFloat iconY = padding;
        CGFloat iconW = 30;
        CGFloat iconH = 30;
        self.iconf = CGRectMake(iconX, iconY, iconW, iconH);
        
        // 2. 姓名大小由文字的长度来决定
        // boundingRectWithSize计算给定文本字符串所占的区域
        // 返回值是一个x,y = 0的CGRect,w,h是计算好的宽高
        //
        // 如果要计算多行的准确高度,需要传入NSStringDrawingUsesLineFragmentOrigin选项
        // dict用于指定字体的相关属性的字典,UIKit框架中的第一个头文件
        // context: nil
        NSDictionary *nameDict = @{NSFontAttributeName: kNameFont};
        CGRect nameFrame = [self.status.name boundingRectWithSize:CGSizeMake(MAXFLOAT, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:nameDict context:nil];
        nameFrame.origin.x = CGRectGetMaxX(self.iconf) + padding;
        nameFrame.origin.y = padding + (self.iconf.size.height - nameFrame.size.height) * 0.5;
        self.namef = nameFrame;
        
        // vip图标
        CGFloat vipX = CGRectGetMaxX(self.namef) + padding;
        CGFloat vipY = self.namef.origin.y;
        CGFloat vipW = 14;
        CGFloat vipH = 14;
        self.vipf = CGRectMake(vipX, vipY, vipW, vipH);
        
        // 正文
        NSDictionary *textDict = @{NSFontAttributeName: kTextFont};
        CGRect textFrame = [self.status.text boundingRectWithSize:CGSizeMake(300, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:textDict context:nil];
        textFrame.origin.x = padding;
        textFrame.origin.y = CGRectGetMaxY(self.iconf) + padding;
        self.textf = textFrame;
        
        //CGFloat cellHeight;
        
        if (self.status.picture.length > 0) {
            // 配图
            CGFloat pictureX = padding;
            CGFloat pictureY = CGRectGetMaxY(textFrame) + padding;
            CGFloat pictureW = 100;
            CGFloat pictureH = 100;
            self.picturef = CGRectMake(pictureX, pictureY, pictureW, pictureH);
            
            self.cellHeight = CGRectGetMaxY(self.picturef) + padding;
        } else {
            self.cellHeight = CGRectGetMaxY(self.textf) + padding;
        }
    
    }
    
    + (NSArray *)statusFrames
    {
        NSArray *array = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"statuses.plist" ofType:nil]];
        
        NSMutableArray *arrayM = [NSMutableArray array];
        for (NSDictionary *dict in array) {
            // 要添加statusFrame对象
            StatusFrame *statusFrame = [[StatusFrame alloc] init];
            
            // 实例化一个新的Status模型
            HMStatus *status = [HMStatus statusWithDict:dict];
            
            // 调用自己的setter方法,保存status数据模型,同时计算出所有控件的位置
            statusFrame.status = status;
            
            // 将statusFrame添加到数组
            [arrayM addObject:statusFrame];
        }
        
        return arrayM;
    }
    
    
    @end
    //
    //  ViewController.h
    //  新浪微博
    //
    //  Created by YaguangZhu on 15/8/26.
    //  Copyright (c) 2015年 YaguangZhu. All rights reserved.
    //
    
    #import <UIKit/UIKit.h>
    
    @interface ViewController : UITableViewController
    
    
    @end
    //
    //  ViewController.m
    //  新浪微博
    //
    //  Created by YaguangZhu on 15/8/26.
    //  Copyright (c) 2015年 YaguangZhu. All rights reserved.
    //
    
    #import "ViewController.h"
    #import "HMStatus.h"
    #import "HMStatusCell.h"
    #import "StatusFrame.h"
    
    @interface ViewController ()
    @property(nonatomic,strong) NSArray *statuseFrames;
    @property(nonatomic,strong) NSArray *statuses;
    @end
    
    @implementation ViewController
    
    //- (NSArray *)statusFrames
    //{
    //    if (_statuseFrames ==nil) {
    //        _statuseFrames = [StatusFrame statusFrames];
    //    }
    //    return _statuseFrames;
    //}
    
    - (NSArray *)statuses
    {
        if (_statuses ==nil) {
            _statuses = [HMStatus statuses];
        }
        return _statuses;
    }
    
    
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
        //return self.statuseFrames.count;
        return self.statuses.count;
    }
    
    -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        static NSString *ID =@"cell";
        
       // UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
    //    if (cell ==nil) {
    //        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID];
    //    }
        HMStatusCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
        
       if (cell ==nil) {
        cell = [[HMStatusCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID];
             }
        
    //    HMStatus *status = self.statuses[indexPath.row];
    //    cell.textLabel.text =status.name;
        
        
        cell.status = self.statuses[indexPath.row];
        
    //    StatusFrame *statusFrame = self.statuseFrames[indexPath.row];
    //    cell.status = statusFrame.status;
        return cell;
    }
    
    #pragma mark - 代理方法
    /** 计算单元格行高 */
    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        /**
         计算行高的方法,会在加载表格数据时,有多少行计算多少次 contentSize
         
         问题:此方法执行的时候,cell还没有被实例化!
         但是:行高计算是在实例化cell时,通过设置status属性,计算的=>有了status模型,就可以知道行高!
         
         问题:如何在cell实例化之前,获得行高?
         解决方法:通过status可以计算得到行高!=》再建立一个模型,专门计算所有控件的位置
         */
        
        StatusFrame *statusFrame = [[StatusFrame alloc] init];
        statusFrame.status =self.statuses[indexPath.row];
        return statusFrame.cellHeight;
        
        
        //return 400;
    }
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
        self.tableView.rowHeight = 400;
    }
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    @end
  • 相关阅读:
    PCB工作台
    A/D转换
    gerber文件生成与PCB3D视图
    软考考前冲刺第十四、十五章算法设计与面向对象程序设计
    数据库之范式
    Java第九天
    软考考前冲刺第十三章UML建模
    软考错题合集之16-05-AM
    Java第八天
    Java第七天
  • 原文地址:https://www.cnblogs.com/zhuyaguang/p/4760400.html
Copyright © 2011-2022 走看看