IOS第八天(5:UITableViewController新浪微博, 计算行高)

在 4 的 基础上重写 以下的方法 control

#pragma mark - 代理方法
/** 计算单元格行高 */
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    /**
     计算行高的方法,会在加载表格数据时,有多少行计算多少次 contentSize

     问题:此方法执行的时候,cell还没有被实例化!
     但是:行高计算是在实例化cell时,通过设置status属性,计算的=>有了status模型,就可以知道行高!

     问题:如何在cell实例化之前,获得行高?
     解决方法:通过status可以计算得到行高!=》再建立一个模型,专门计算所有控件的位置
     */
    HMStatusFrame *statusFrame = [[HMStatusFrame alloc] init];
    statusFrame.status = self.statuses[indexPath.row];

    return statusFrame.cellHeight;
}

HMStatusFrame.h文件

#import <Foundation/Foundation.h>
@class HMStatus;

/** 专门计算所有控件位置 */
@interface HMStatusFrame : 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;

@end

m文件

#import "HMStatusFrame.h"
#import "HMStatus.h"

/** 姓名字体 */
#define kNameFont   [UIFont systemFontOfSize:14]
/** 正文字体 */
#define kTextFont   [UIFont systemFontOfSize:16]

@implementation HMStatusFrame

- (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;

    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;
    }
}

@end
时间: 2024-10-06 23:24:16

IOS第八天(5:UITableViewController新浪微博, 计算行高)的相关文章

IOS第八天(7:UITableViewController新浪微博,cell 复用的简单写法优化和cell高度从模型中获取)

*********** #import "HMViewController.h" #import "HMStatus.h" #import "HMStatusCell.h" #import "HMStatusFrame.h" @interface HMViewController () /** 保存statusFrame模型的数组 */ @property (nonatomic, strong) NSArray *status

IOS第八天(6:UITableViewController新浪微博, 模型和 控件位置封装一起statusFrame)

*****HMViewController #import "HMViewController.h" #import "HMStatus.h" #import "HMStatusCell.h" #import "HMStatusFrame.h" @interface HMViewController () /** 保存statusFrame模型的数组 */ @property (nonatomic, strong) NSArr

UITableView!别再用代码计算行高了(一)

你还在用代码去计算行高吗?你不感觉那种方式很low吗?从今天起,试着做些改变吧! 别给我讲你喜欢写代码的感觉,你就是要用代码去计算行高,那我这篇文章不适合你. 在讲解复杂内容之前,还是先学习简单的内容,本篇就是讲解一些基本的内容. 一.纯文字Cell 一般我们用的都是UILabel控件,这个控件配合Autolayout简直是完美,废话不多说. 我们首先创建一个简单的工程,工程中我们创建一个UITableViewController子类,这里命名为LabelViewController,下图是一些

iOS 动态计算行高,宽等

UILabel有两个计算文字大小的方法: 1.针对对富文本计算NSAttributedString - (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options attributes:(nullable NSDictionary*)attributes context:(nullable NSStringDrawingContext *)context NS_AVAILABLE(10_11,

IOS第八天(1:UITableViewController团购,点击底部,xib加载更多, 代理模式)

******* HMViewController.h #import "HMViewController.h" #import "HMTg.h" #import "HMTgCell.h" #import "HMTgFooterView.h" @interface HMViewController () <HMTgFooterViewDelegate> @property (nonatomic, strong) NS

IOS第八天(1:UITableViewController团购, 点击底部代码调整)

****代理者的方法中 // 通知页脚视图调整视图显示状态 [footerView endRefresh]; //发送代理通知的类中 /** 视图控制器刷新完成调用方法 */ - (void)endRefresh { // 4. 加载完成数据 self.loadMoreButton.hidden = NO; self.tipsView.hidden = YES; }

lable计算行高

_introduce.text=status.introduce; //设置行间距 NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc]initWithString:_introduce.text];; NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc]init]; [paragraphSty

动态的计算行高 加载数据源 有多少显示多少 tableView 包含 colloctionView 显示复杂的界面写法

有时候,我们经常碰到这样的需求 先遵守代理 @interface PublishCollectionCell ()<UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout> 创建 _layout = [[UICollectionViewFlowLayout alloc] init]; //        layout.scrollDirection = UICollecti

ios开发日记11 对tableView三种计算动态行高方法的分析

tableView是一个神奇的东西,可以这么说,就算是一个初学者如果能把tableView玩的很6,那编一般的iOS的需求都问题不大了.tableView是日常开发中用烂了的控件,但是关于tableView中的自定义cell的动态行高,还是有一些玄机的. AD: tableView是一个神奇的东西,可以这么说,就算是一个初学者如果能把tableView玩的很6,那编一般的iOS的需求都问题不大了.tableView是日常开发中用烂了的控件,但是关于tableView中的自定义cell的动态行高,