一般情況下,我們使用tableview的時候從來沒有設置過cell的大小(w,h)、位置(x,y)等,而是系統直接給我們自動生成,但是有的時候我們可能會改動cell的大小及位置,比如:在適配ios6跟ios8的時候,需要把外觀做的一樣,但是ios6中cell中的contextview默認情況下是不占滿整個cell的,而是左右同時空出10個間距,所以這個時候我們需要在哪里進行操作呢。這個時候我們就用到了-(void)setFrame:(CGRect )frame;這個方法。
在此方法中截獲frame,這個tabelview傳遞過來的frame,我們在其基礎上進行一些操作來改變cell的位置和大小,然后再將我們生成的這個frame傳給父類方法,讓他進行具體的操作。
-(void)setFrame:(CGRect)frame
{
// 首先我們需要判斷是不是ios6之前的版本(含ios6)
if([[UIDevice currentDevice].systemVersion doubleValue]>=7.0) return;
frame.size.width +=20; // 因為左右都需要加10,所以我們將frame的寬度加20;
frame.origin.x =-10; // 因為默認x 為0 當我們給他的寬度增加20之后,系統將cell右邊拉伸,這個時候我們需要進行平移,而平移的大小剛好是10;
[super setFrame:frame]; // 將這里獲得的frame傳給父類,讓他進行具體操作。
}
另外需要注意的是,ios6中沒有分割線,所以我們需要設置cell的分割線,系統的cell的分割線是由一個UIView控件生成的,所以我們模仿其操作,這個view我們需要在cell初始化的時候給其添加一個view ,這是因為每一次cell的初始化都要生成一個分割線(每組的最后一個例外),所以我們需要在 -(id)initWithStayle:
@property (nonatomic,weak)UIView * fenGeLine;
(UITableViewCellStayle*)style resuseIdentifier:(NSString *)resuseIdentifier
{
if(self = [super initWithStayle:style resuseIdentifier:resuseIdentifier])
{
UIView *fenGeLine =[[UIView alloc]init];
fenGeLine.backgroundColor = [UIColor blackColor];
fenGeLine.alpha = 0.2;
[self.contentView addSubview:fenGeLine];
self.fenGeLine = fenGeLine;// 由於需要設置fenGeLine的frame,所以需要將fenGeLine變成成員變量。
}
}
// 子控件的frame 一般都在layoutSubviews中進行設置。
-(void)layoutSubviews
{
[self layoutSubviews];
CGFloat h = 1;
CGFloat w = [UIScreen mainScreen].bounds.size.width;
CGFloat x = 0;
CGFloat y = self.contentView.frame.size.height - h;
self.fenGeLine.frame = CGRectMake(x,y,w,h);
}
此時每組的最后一個是不需要設置分割線的,但是以上代碼是每一行都有分割線的,所以我們需要判斷當前行是不是最后一行,那么我們如何知道當前是不是最后一行呢,我們得通過
-(UITableViewCell *)tableView:(UITableVIew *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
//這個cell是我自定義好的
ZPTableViewCell *cell = [ZPTableViewCell cellWithTableView:tableView];
ZPSettingGroup *group = self.data[indexPath.section];
// cell.item = group.items[indexPath.row];
cell.lastRowInSection = group.items.count == indexPath.row +1; // 這里判斷依據就是group的總條目數 == 當強行+1就說明時最后一組了。YES or NO;
}
在自定義cell中重寫lastRowInSection的set方法
-(void)setLastRowInSection:(BOOL)lastRowInSection
{
_lastRowInSection = lastRowInSection;
self.fenGeLine.hidden = lastRowInSection;
}