Cell定製和Frame模型引入
一、xib定製cell
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
// 1.建立cell
MJStatusCell *cell = [MJStatusCell cellWithTableView:tableView];
// 2.在這個方法算好了cell的高度
cell.statusFrame = self.statusFrames[indexPath.row];
// 3.返回cell
return cell;
}
#import "MJTgCell.h"
+ (instancetype)cellWithTableView:(UITableView *)tableView
{
static NSString *ID = @"tg";
MJTgCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
if (cell == nil) {
// 從xib中載入cell
cell = [[[NSBundle mainBundle] loadNibNamed:@"MJTgCell" owner:nil options:nil] lastObject];
}
return cell;
}
二、程式碼定製cell
+ (instancetype)cellWithTableView:(UITableView *)tableView
{
static NSString *ID = @"status";
MJStatusCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
if (cell == nil) {
cell = [[MJStatusCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID];
}
return cell;
}
#import "MJStatusCell.h"
/**
* 構造方法(在初始化物件的時候會呼叫)
* 一般在這個方法中新增需要顯示的子控制元件
*/
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
// 1.頭像
UIImageView *iconView = [[UIImageView alloc] init];
[self.contentView addSubview:iconView];
self.iconView = iconView;
// 2.暱稱
UILabel *nameView = [[UILabel alloc] init];
nameView.font = MJNameFont;
[self.contentView addSubview:nameView];
self.nameView = nameView;
、、、
}
return self;
}
三、frame模型引入(自定義高度)
@interface MJStatus : NSObject
@property (nonatomic, copy) NSString *text; // 內容
@property (nonatomic, copy) NSString *icon; // 頭像
@property (nonatomic, copy) NSString *name; // 暱稱
@property (nonatomic, copy) NSString *picture; // 配圖
@property (nonatomic, assign) BOOL vip;
- (instancetype)initWithDict:(NSDictionary *)dict;
+ (instancetype)statusWithDict:(NSDictionary *)dict;
@implementation MJStatus
- (instancetype)initWithDict:(NSDictionary *)dict
{
if (self = [super init]) {
[self setValuesForKeysWithDictionary:dict];
}
return self;
}
+ (instancetype)statusWithDict:(NSDictionary *)dict
{
return [[self alloc] initWithDict:dict];
}
@class MJStatus;
@interface MJStatusFrame : NSObject
// 頭像的frame
@property (nonatomic, assign, readonly) CGRect iconF;
// 暱稱的frame
@property (nonatomic, assign, readonly) CGRect nameF;
// 會員圖示的frame
@property (nonatomic, assign, readonly) CGRect vipF;
// 正文的frame
@property (nonatomic, assign, readonly) CGRect textF;
// 配圖的frame
@property (nonatomic, assign, readonly) CGRect pictureF;
// cell的高度
@property (nonatomic, assign, readonly) CGFloat cellHeight;
@property (nonatomic, strong) MJStatus *status;
@end
@implementation MJStatusFrame
/**
* 計算文字尺寸
*
* @param text 需要計算尺寸的文字
* @param font 文字的字型
* @param maxSize 文字的最大尺寸
*/
- (CGSize)sizeWithText:(NSString *)text font:(UIFont *)font maxSize:(CGSize)maxSize
{
NSDictionary *attrs = @{NSFontAttributeName : font};
return [text boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:attrs context:nil].size;
}
- (void)setStatus:(MJStatus *)status
{
_status = status;
// 子控制元件之間的間距
CGFloat padding = 10;
// 1.頭像
CGFloat iconX = padding;
CGFloat iconY = padding;
CGFloat iconW = 30;
CGFloat iconH = 30;
_iconF = CGRectMake(iconX, iconY, iconW, iconH);
// 2.暱稱
// 文字的字型
CGSize nameSize = [self sizeWithText:self.status.name font:MJNameFont maxSize:CGSizeMake(MAXFLOAT, MAXFLOAT)];
CGFloat nameX = CGRectGetMaxX(_iconF) + padding;
CGFloat nameY = iconY + (iconH - nameSize.height) * 0.5;
_nameF = CGRectMake(nameX, nameY, nameSize.width, nameSize.height);
// 3.會員圖示
CGFloat vipX = CGRectGetMaxX(_nameF) + padding;
CGFloat vipY = nameY;
CGFloat vipW = 14;
CGFloat vipH = 14;
_vipF = CGRectMake(vipX, vipY, vipW, vipH);
// 4.正文
CGFloat textX = iconX;
CGFloat textY = CGRectGetMaxY(_iconF) + padding;
CGSize textSize = [self sizeWithText:self.status.text font:MJTextFont maxSize:CGSizeMake(300, MAXFLOAT)];
_textF = CGRectMake(textX, textY, textSize.width, textSize.height);
// 5.配圖
if (self.status.picture) {// 有配圖
CGFloat pictureX = textX;
CGFloat pictureY = CGRectGetMaxY(_textF) + padding;
CGFloat pictureW = 100;
CGFloat pictureH = 100;
_pictureF = CGRectMake(pictureX, pictureY, pictureW, pictureH);
_cellHeight = CGRectGetMaxY(_pictureF) + padding;
} else {
_cellHeight = CGRectGetMaxY(_textF) + padding;
}
}
#import "MJViewController.h"
for (NSDictionary *dict in dictArray) {
// 3.1.建立MJStatus模型物件
MJStatus *status = [MJStatus statusWithDict:dict];
// 3.2.建立MJStatusFrame模型物件
MJStatusFrame *statusFrame = [[MJStatusFrame alloc] init];
statusFrame.status = status;
}
#pragma mark - 實現資料來源方法
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return self.statusFrames.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
// 1.建立cell
MJStatusCell *cell = [MJStatusCell cellWithTableView:tableView];
// 2.在這個方法算好了cell的高度
cell.statusFrame = self.statusFrames[indexPath.row];
// 3.返回cell
return cell;
}
#pragma mark - 實現代理方法
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
// 取出這行對應的frame模型
MJStatusFrame *statusFrame = self.statusFrames[indexPath.row];
return statusFrame.cellHeight;
}
相關文章
- Swift iOS : 定製CellSwiftiOS
- iOS 重寫cell的FrameiOS
- 徹底學會element-ui按需引入和純淨主題定製UI
- nginx設定X-Frame-OptionsNginx
- iOS cell上的定時器iOS定時器
- tableView 組頭 和 cellView
- iOS坑:UIView的frame和transfromiOSUIView
- EasyExcel為單個Cell設定樣式Excel
- frame和bounds的區別(轉載)
- iOS 開發 frame和Bounds的不同iOS
- 人工智慧發展與模型定製化趨勢人工智慧模型
- 定製排序和比較器排序排序
- Amazon SageMaker新玩法——定製你的語音識別模型模型
- Python FramePython
- 已知UIScrollView放大後的Frame和放大之前的Frame計算放大的瞄點座標UIView
- 和免疫熒游標記說拜拜 | 谷歌Cell論文:深度學習模型預測熒光位置谷歌深度學習模型
- iOS 官方巨集定義 - “引入”、“廢棄”iOS
- vue引入bootstrap和fontawesomeVueboot
- iOS 實現多個可變 cell 複雜介面的製作iOS
- 深入解析和定製Oracle優化工具Oracle優化
- ChineseGLUE:為中文NLP模型定製的自然語言理解基準模型
- UITableView的Cell複用原理和原始碼分析UIView原始碼
- iOS 中 各種 Cell 和 HeaderView 複用iOSHeaderView
- iOS UITableView Cell和 SectionHeader 的呼叫順序iOSUIViewHeader
- Laravel & Eloquent 模型設定 created_at 和 updated_atLaravel模型
- C++模板的定製四:定製成員函式和預設類參 (轉)C++函式
- Android基礎動畫之Tween Animation和Frame AnimationAndroid動畫
- Tkinter (41) 定製和建立 ttk 主題和樣式
- 操作選中cell 所有cell操作相同情況下
- JDK 11 確定將引入 Shebang #! 符號JDK符號
- WebView,嘿嘿,懶人專用,直接複製貼上就能用,frame可調WebView
- Android定製ROM,內嵌su和xposedAndroid
- Xamarin iOS教程之新增和定製檢視iOS
- 定製ORACLE RAC GUARD——RAC GUARD概念和管理Oracle
- 定製Tinycore
- 基於React和A-Frame開發虛擬現實React
- Vue中引入TradingView製作K線圖VueView
- 使用HTTP響應頭X-Frame-Options防止網頁被FrameHTTP網頁