iOS開發 --UITableviewCell的自訂與計算frame

來源:互聯網
上載者:User

標籤:

一、UITableViewCell簡介

UITableView上的每一行的內容都是UITableViewCell來顯示的,通過 UITableViewDataSource的協議方法:tableView:cellForRowAtIndexPath:來初始化要顯示的內容。而 UITableViewCell則是通過它內建的contentView來顯示,每個Cell都預設有個子視圖contentView,所以每個cell 上顯示的內容都是加在這個視圖上。

系統的UITableViewCell有四種類型   

  UITableViewCellStyleDefault,  
    UITableViewCellStyleValue1,     
    UITableViewCellStyleValue2,       
    UITableViewCellStyleSubtitle  

這四種類型自己嘗試一下看看有什麼不同,開發一般很少會用的到,因為系統的滿足不了我們的需求,所以我們經常會自訂UITableViewCell

UITableView的一些屬於:

有時候我們會發現很多UITableViewCell右側可以顯示不同的表徵圖,在iOS中稱之為訪問器,點擊可以觸發不同的事件,例如iPhone系統的設定

要設定這些表徵圖只需要設定UITableViewCell的accesoryType屬性,accesoryType是一個枚舉類型,有以下幾種類型:

typedef NS_ENUM(NSInteger, UITableViewCellAccessoryType) {    UITableViewCellAccessoryNone,                   // 不顯示任何表徵圖    UITableViewCellAccessoryDisclosureIndicator,    // 跳轉指示表徵圖    UITableViewCellAccessoryDetailDisclosureButton, // 內容詳情表徵圖和跳轉指示表徵圖    UITableViewCellAccessoryCheckmark,              // 勾選表徵圖    UITableViewCellAccessoryDetailButton NS_ENUM_AVAILABLE_IOS(7_0) // 內容詳情表徵圖};

但是,你會發現沒有第一個cell的accesoryType沒有這種類型,其實只要設定UITableViewCell的accessoryView就可以讓你的cell顯示你想要的控制項,只要是一個UIView都能支援

二、如何自訂UITableViewCell

1.首先要知道你想要顯示怎麼樣的cell

2.將你需要顯示的控制項都定義成屬性

3.因為開發的時候給cell賦值時一般都是有對應的model,所以最好寫一個方法專門給cell賦值

4.因為我們自訂cell的時候可能會有很多控制項,可以寫一個類來計算這些控制項的frame,然後寫一個方法來給這些控制項設定frame,最後可以在調用給cell賦值方法的時候一起調用這個方法

 

這裡我簡單的模仿一下QQ社交動向更新的frame的計算

#import <Foundation/Foundation.h>@interface MZQQModel : NSObject@property (nonatomic,copy) NSString *text;@property (nonatomic,copy) NSString *icon;@property (nonatomic,copy) NSString *name;@property (nonatomic,copy) NSString *picture;@property (nonatomic,copy) NSString *time;@property (nonatomic,copy) NSString *expert;@end#import <UIKit/UIKit.h>@class MZQQModel;@interface MZQQFrame : NSObject@property (nonatomic, strong) MZQQModel *qqModel;@property (nonatomic, assign, readonly) CGRect iconFrame; // 頭像的frame@property (nonatomic, assign, readonly) CGRect nameFrame; // 暱稱的frame@property (nonatomic, assign, readonly) CGRect timeFrame; // 時間的frame@property (nonatomic, assign, readonly) CGRect expertFrame; // QQ達人的Frame@property (nonatomic, assign, readonly) CGRect textFrame; // 本文的Frame@property (nonatomic, assign, readonly) CGRect pictureFrame; // 圖片的Frame@property (nonatomic, assign, readonly) CGFloat rowHeight; // 總得高度@end#import "MZQQFrame.h"#import "MZQQModel.h"#define MZNameFont 15 // 暱稱字型的大小#define MZTextFont 14 // 內容字型的大小#define kScreenWidth [UIScreen mainScreen].bounds.size.width@implementation MZQQFrame//計算文字的大小- (CGSize)sizeWithText:(NSString *)text maxSize:(CGSize)maxSize fontSize:(CGFloat)fontSize{    //計算文本的大小    CGSize nameSize = [text boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:fontSize]} context:nil].size;    return nameSize;}- (void)setQqModel:(MZQQModel *)qqModel{        _qqModel = qqModel;        CGFloat margin = 10;    //頭像    CGFloat iconW = 40;    CGFloat iconH = 40;    CGFloat iconX = margin;    CGFloat iconY = margin;    _iconFrame = CGRectMake(iconX, iconY, iconW, iconH);    //暱稱    CGSize nameSize = [self sizeWithText:self.qqModel.name maxSize:CGSizeMake(MAXFLOAT, MAXFLOAT) fontSize:MZNameFont];    CGFloat nameX = CGRectGetMaxX(_iconFrame) + margin;    CGFloat nameY = iconY;    _nameFrame = CGRectMake(nameX, nameY, nameSize.width, nameSize.height);    //時間    CGSize timeSize = [self sizeWithText:self.qqModel.time maxSize:CGSizeMake(kScreenWidth - CGRectGetMidX(_pictureFrame), MAXFLOAT) fontSize:12];    CGFloat timeX = nameX;    CGFloat timeY = CGRectGetMaxY(_nameFrame) + margin;    _timeFrame = CGRectMake(timeX, timeY, timeSize.width, timeSize.height);    //達人    CGFloat expertW = 14;    CGFloat expertH = 14;    CGFloat expertY = nameY;    CGFloat expertX = CGRectGetMaxX(_nameFrame) + margin;    _expertFrame = CGRectMake(expertX, expertY, expertW, expertH);    //QQ內容    CGSize textSize = [self sizeWithText:self.qqModel.text maxSize:CGSizeMake(kScreenWidth - 2 * margin, MAXFLOAT) fontSize:MZTextFont];    CGFloat textX = iconX;    CGFloat textY = CGRectGetMaxY(_iconFrame) + margin;    _textFrame = CGRectMake(textX, textY, textSize.width, textSize.height);        //QQ圖片 (這裡的圖片大小給定了100,實際根據自己需求調整)    if (self.qqModel.picture) {        CGFloat pictureW = 100;        CGFloat pictureH = 100;        CGFloat pictureX = iconX;        CGFloat pictureY = CGRectGetMaxY(_textFrame) + margin;        _pictureFrame = (CGRect){{pictureX,pictureY},{pictureW,pictureH}};                _rowHeight = CGRectGetMaxY(_pictureFrame) + margin;    }else{        _rowHeight = CGRectGetMaxY(_textFrame) + margin;    }    }@end#import <UIKit/UIKit.h>@class MZQQFrame;@interface MZQQCell : UITableViewCell@property (nonatomic, strong) MZQQFrame *qqFrame;@end#import "MZQQCell.h"#import "MZQQFrame.h"#import "MZQQModel.h"@interface MZQQCell ()@property (nonatomic, strong) UIImageView *iconView; // 頭像@property (nonatomic, strong) UILabel *nameView; // 暱稱@property (nonatomic, strong) UILabel *timeView; // 時間@property (nonatomic, strong) UIImageView *expertView; // 達人@property (nonatomic, strong) UILabel *textView; // 本文@property (nonatomic, strong) UIImageView *pictureView; // 圖片@end@implementation MZQQCell- (UIImageView *)iconView{    if (!_iconView) {        _iconView = [[UIImageView alloc] init];    }    return _iconView;}- (UILabel *)nameView{    if (!_nameView) {        _nameView = [[UILabel alloc] init];    }    return _nameView;}- (UILabel *)timeView{    if (!_timeView) {        _timeView = [[UILabel alloc] init];    }    return _timeView;}- (UIImageView *)expertView{    if (!_expertView) {        _expertView = [[UIImageView alloc] init];    }    return _expertView;}- (UILabel *)textView{    if (!_textView) {        _textView = [[UILabel alloc] init];    }    return _textView;}- (UIImageView *)pictureView{    if (!_pictureView) {        _pictureView = [[UIImageView alloc] init];    }    return _pictureView;}- (void)setQqFrame:(MZQQFrame *)qqFrame{        _qqFrame = qqFrame;    //設定子控制項顯示的內容    [self setSubViewsContent];    //設定子控制項的frame    [self setSubViewsFrame];    }- (void)setSubViewsContent{        MZQQModel *qqModel = self.qqFrame.qqModel;    self.iconView.image = [UIImage imageNamed:qqModel.icon];    self.nameView.text = qqModel.name;    self.timeView.text = qqModel.time;        // 如果qqModel.expert有值給圖片    if (qqModel.expert) {        self.expertView.hidden = NO;        self.expertView.image = [UIImage imageNamed:qqModel.expert];    }else{        self.expertView.hidden = YES;    }    if (_pictureView) {        self.pictureView.image = [UIImage imageNamed:qqModel.picture];    }}- (void)setSubViewsFrame{        self.iconView.frame = self.qqFrame.iconFrame;    self.nameView.frame = self.qqFrame.nameFrame;    self.timeView.frame = self.qqFrame.timeFrame;    self.expertView.frame = self.qqFrame.expertFrame;    self.textView.frame = self.qqFrame.textFrame;    self.pictureView.frame = self.qqFrame.pictureFrame;    }

上面都是一些計算frame的方法

 

其實計算frame並不是很難,只要你確定第一個控制項的位置,你就可以根據第一個控制項將其它控制項的frame一一計算出來

 

當然,cell還有很多屬性和方法,有興趣的可以自己去研究研究

 

iOS開發 --UITableviewCell的自訂與計算frame

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.