亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS利用UITableView設置全屏分隔線的3種方法總結

2019-10-21 18:43:46
字體:
來源:轉載
供稿:網友

前言

本文主要給大家總結了iOS用UITableView設置全屏分隔線的3種方法,一般TableView設置全屏分隔線有下面三種方法:

1.自定義cell,手動添加分割線

隱藏自帶的

tableView.separatorStyle = UITableViewCellSeparatorStyleNone;

可以通過addSubview的方式添加一條分割線;也可以自繪分割線。

// 自繪分割線- (void)drawRect:(CGRect)rect{ CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSetFillColorWithColor(context, [UIColor whiteColor].CGColor); CGContextFillRect(context, rect); CGContextSetStrokeColorWithColor(context, [UIColor colorWithRed:0xE2/255.0f green:0xE2/255.0f blue:0xE2/255.0f alpha:1].CGColor); CGContextStrokeRect(context, CGRectMake(0, rect.size.height - 1, rect.size.width, 1));}

2.重寫cell的setFrame方法,高度-1,露出背景色

- (void)setFrame:(CGRect)frame{ frame.size.height -= 1; // 給cellframe賦值 [super setFrame:frame];}

取消系統的分割線

設置tableView背景色為分割線顏色

// 取消系統分割線self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;// 設置tableView背景色self.tableView.backgroundColor = [UIColor colorWithWhite:215 / 255.0 alpha:1];

3.利用系統屬性設置(separatorInset, layoutMargins)共需添加三句代碼:

對tableView的separatorInset, layoutMargins屬性的設置

-(void)viewDidLoad { [super viewDidLoad]; //1.調整(iOS7以上)表格分隔線邊距 if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) { self.tableView.separatorInset = UIEdgeInsetsZero; } //2.調整(iOS8以上)view邊距(或者在cell中設置preservesSuperviewLayoutMargins,二者等效) if ([self.tableView respondsToSelector:@selector(setLayoutMargins:)]) { self.tableView.layoutMargins = UIEdgeInsetsZero; }}

對cell的LayoutMargins屬性的設置

對cell的設置可以寫在cellForRowAtIndexPath里,也可以寫在willDisplayCell方法里

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ static NSString *ID = @"cell"; FSDiscoverSpecialCell *cell = [tableView dequeueReusableCellWithIdentifier:ID]; if (cell == nil) { cell = [[FSDiscoverSpecialCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID]; } //2.調整(iOS8以上)tableView邊距(與上面第2步等效,二選一即可) if ([cell respondsToSelector:@selector(setPreservesSuperviewLayoutMargins:)]) { cell.preservesSuperviewLayoutMargins = NO; } //3.調整(iOS8以上)view邊距 if ([cell respondsToSelector:@selector(setLayoutMargins:)]) { [cell setLayoutMargins:UIEdgeInsetsZero]; } return cell;}

三種方法優缺點比較:

方法1是比較好用的,但是有些情況下系統自帶的cell就足夠用了,僅僅為了分隔線卻還必須再自定義cell,添加一個view,設置背景顏色和frame,又顯得麻煩;

方法2比較取巧,但是也需要自定義cell,在某些情況下不允許改變tableView的背景色,使用場景有限;

方法3不需要自定義cell,對系統(iOS7,iOS8以上)做個簡單判斷即可.可惜網上很多文章寫的不對,很多人不會正確使用,有些會用的人也說不清楚原理,只管復制粘貼.

比如網上流傳的一般是這樣,需要四步,雖然真的管用,但多了一步[cell setSeparatorInset:UIEdgeInsetsZero];而且原理也沒講,估計是某大神寫的,根本不屑于過多解釋,讓我用起來很郁悶,網上流傳代碼:

首先在viewDidLoad方法中加上如下代碼:

-(void)viewDidLoad { [super viewDidLoad]; if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) { [self.tableView setSeparatorInset:UIEdgeInsetsZero]; } if ([self.tableView respondsToSelector:@selector(setLayoutMargins:)]) { [self.tableView setLayoutMargins:UIEdgeInsetsZero];}

然后在willDisplayCell方法中加入如下代碼:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{ if ([cell respondsToSelector:@selector(setSeparatorInset:)]) { [cell setSeparatorInset:UIEdgeInsetsZero]; } if ([cell respondsToSelector:@selector(setLayoutMargins:)]) { [cell setLayoutMargins:UIEdgeInsetsZero]; }}

其實關于分隔線不能全屏的原理,蘋果官方在文件中已經說明了,可以去看一下

在iOS7之前系統默認就是全屏的,iOS7時UITableView多了separatorInset屬性,可在UITableView的頭文件中查看,如下:

@property (nonatomic) UIEdgeInsets separatorInset NS_AVAILABLE_IOS(7_0) UI_APPEARANCE_SELECTOR; // allows customization of the frame of cell separators

iOS7時只要設置該屬性為UIEdgeInsetsZero就沒有問題了.

iOS8之后僅僅完成以上設置就不行了,仔細查看后發現iOS8的UIView的頭文件里又多了個layoutMargins屬性,并有官方注釋

@property (nonatomic) UIEdgeInsets layoutMargins NS_AVAILABLE_IOS(8_0);

/*
 -layoutMargins returns a set of insets from the edge of the view's bounds that denote a default spacing for laying out content.
 If preservesSuperviewLayoutMargins is YES, margins cascade down the view tree, adjusting for geometry offsets, so that setting the left value of layoutMargins on a superview will affect the left value of layoutMargins for subviews positioned close to the left edge of their superview's bounds
 If your view subclass uses layoutMargins in its layout or drawing, override -layoutMarginsDidChange in order to refresh your view if the margins change.
 */

大意是說:layoutMargins是view的bounds的邊距,用來調整內容默認邊距

如果preservesSuperviewLayoutMargins屬性是YES,那么設置父控件的layoutMargins邊距,就會影響所有子控件的相對于父控件bounds的layoutMargins邊距

如果你的view的子類在布局或者繪圖中使用了layoutMargins屬性,需要重寫-layoutMarginsDidChange 方法,以便當邊距改變時能刷新你的view

正是因為layoutMargins是UIView的新增屬性,tablet和cell作為UIView的子類都有這個屬性,所以相比較iOS7系統,iOS8之后就多了兩步,必須同時再對tableView和cell的layoutMargins屬性進行處理,才能讓分隔線真正全屏.

同時官方注釋中對preservesSuperviewLayoutMargins(意即:維持父控件的布局邊距)屬性的說明,也正好能說明網上另一種方法不設置self.tableView.layoutMargins = UIEdgeInsetsZero;而是設置cell.preservesSuperviewLayoutMargins = NO;為什么也能起作用

弄清楚了這些原理,就可以更好的記憶和使用這些方法,不用每次都去舊代碼查找或者去百度了.

說到了最后,不知道大家有沒有覺得影響分隔線全屏的元兇layoutMargins屬性 稍微有點眼熟呢?其實它在另一個地方也做了不少惡,就在storyboard中:

uitableview,分隔線,全屏,ios設置全屏

PS:附效果圖如下:

設置之前效果圖:

uitableview,分隔線,全屏,ios設置全屏

設置完第1步self.tableView.separatorInset = UIEdgeInsetsZero;后效果圖:

uitableview,分隔線,全屏,ios設置全屏

設置完第2步self.tableView.layoutMargins = UIEdgeInsetsZero;后效果圖:

uitableview,分隔線,全屏,ios設置全屏

設置完第3步cell.layoutMargins = UIEdgeInsetsZero;后效果圖:

uitableview,分隔線,全屏,ios設置全屏

附:設置UITableView的單元格分割線離屏幕左右的距離為0

在開發中,有時候為了界面的美觀,需要表示圖的分割線左右間距為0,即呈現下面的效果

有時候就直接取消顯示表視圖的分割線,然后在單元格內直接添加一條直線,這樣也能滿足要求,還有一種方法是改變表視圖內部的分割線的偏移量來實現,具體代碼如下:

uitableview,分隔線,全屏,ios設置全屏

if ([_tableView respondsToSelector:@selector(setSeparatorInset:)]) {     [_tableView setSeparatorInset:UIEdgeInsetsMake(0,0,0,0)];   }      if ([_tableView respondsToSelector:@selector(setLayoutMargins:)]) {     [_tableView setLayoutMargins:UIEdgeInsetsMake(0,0,0,0)];   } 
//代理方法 -(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {   if ([cell respondsToSelector:@selector(setSeparatorInset:)]) {     [cell setSeparatorInset:UIEdgeInsetsZero];   }      if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {     [cell setLayoutMargins:UIEdgeInsetsZero];   } } 

這樣,就實現了單元格分割線的滿格顯示了。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到IOS開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91沈先生在线观看| 影音先锋日韩有码| 日韩av电影国产| 亚洲国产婷婷香蕉久久久久久| 欧美精品久久久久| 成人精品一区二区三区电影免费| 成人在线视频网| 一区二区三区久久精品| 2019av中文字幕| 中文字幕亚洲在线| 成人在线免费观看视视频| 欧美一区深夜视频| 日韩乱码在线视频| 国产精品高清免费在线观看| 亚洲精品99久久久久| 亚洲天堂av在线免费观看| 亚洲欧美中文另类| 在线a欧美视频| 日韩av不卡在线| 亚洲一区二区中文| 亚洲人成网7777777国产| 亚洲性生活视频在线观看| 欧美大片在线免费观看| 国产一区二区三区四区福利| 国产成人jvid在线播放| 国产欧美在线播放| 国产亚洲福利一区| 91wwwcom在线观看| 久久综合久久88| 国产精品第1页| 国产精品吊钟奶在线| 日韩欧美极品在线观看| 久久久久久久97| 久久亚洲国产成人| 日韩大陆毛片av| 精品久久久久久中文字幕一区奶水| 国产区亚洲区欧美区| 伊人久久久久久久久久久| 韩剧1988免费观看全集| 久久精品国产欧美亚洲人人爽| 在线视频免费一区二区| 久久免费视频这里只有精品| 亚洲电影在线看| 久久视频在线播放| 欧美性20hd另类| 欧美制服第一页| 亚洲人成欧美中文字幕| 欧美激情视频免费观看| 中文字幕亚洲一区| 国产精品高潮视频| 两个人的视频www国产精品| 日韩av免费在线看| 国产美女精品免费电影| 一本一本久久a久久精品牛牛影视| 欧美国产激情18| 午夜精品久久久久久久男人的天堂| 国产噜噜噜噜久久久久久久久| 91在线|亚洲| 国产一区二区三区在线播放免费观看| 久久精品视频中文字幕| 亚洲新声在线观看| 国产精品av免费在线观看| 97精品国产97久久久久久免费| 亚洲成人激情小说| 美乳少妇欧美精品| 国产精品一区二区三区在线播放| 精品国偷自产在线| 成人国产精品色哟哟| 国产精品久久久久久久久免费看| 久久久久亚洲精品成人网小说| 欧美性猛交xxxx乱大交极品| 一区二区三区www| 精品久久久久人成| 国产精品嫩草影院久久久| 91在线视频免费| 中文字幕亚洲天堂| 久久夜色精品国产亚洲aⅴ| 亚洲精品日韩在线| 亚洲欧美精品中文字幕在线| 国产日韩中文字幕在线| 欧美性理论片在线观看片免费| 97色在线观看| 日韩欧美国产高清91| 欧美精品成人91久久久久久久| 欧美成人午夜激情在线| 精品成人69xx.xyz| 欧美日韩国产一区二区| 久久综合国产精品台湾中文娱乐网| 久久福利视频网| 欧美日韩国产一区在线| 国产精品日韩欧美综合| 欧美视频一二三| 亚洲第一偷拍网| 欧美不卡视频一区发布| 亚州国产精品久久久| 黑人巨大精品欧美一区二区一视频| 亚洲精品小视频| 永久免费精品影视网站| 色噜噜狠狠色综合网图区| 91wwwcom在线观看| 91精品久久久久久久久中文字幕| 亚洲另类激情图| 亚洲九九九在线观看| 最近2019中文免费高清视频观看www99| 日本一区二区三区在线播放| 亚洲天堂网站在线观看视频| 亚洲一区999| 亚洲国产精品成人精品| 亚洲欧美日韩精品久久奇米色影视| 国产福利视频一区二区| 538国产精品一区二区在线| 亚洲国产成人久久综合| 欧美三级欧美成人高清www| 欧美视频免费在线| 欧美噜噜久久久xxx| 欧美有码在线视频| 亚洲女同精品视频| 91产国在线观看动作片喷水| 97国产精品久久| 欧美视频专区一二在线观看| 亚洲剧情一区二区| 91免费观看网站| 欧美性xxxxx极品| 成人久久精品视频| 国产成人久久久| 7777kkkk成人观看| 亚洲伊人久久综合| 96pao国产成视频永久免费| 亚洲国产成人在线播放| 狠狠久久亚洲欧美专区| 97av在线视频免费播放| 91免费视频国产| 成人xvideos免费视频| 97碰在线观看| 亚洲欧美日本另类| 亚洲国产精彩中文乱码av| 久久精品小视频| 成人激情视频在线观看| 日韩视频免费观看| 日韩一区二区在线视频| 91chinesevideo永久地址| 久久久久久com| 美女999久久久精品视频| 亚洲欧美www| 成人高清视频观看www| 国产欧美 在线欧美| 欧美成人精品不卡视频在线观看| www.亚洲成人| 亚洲精品国产综合久久| 欧洲美女免费图片一区| 日韩最新中文字幕电影免费看| 欧美大肥婆大肥bbbbb| 亚洲第一av网站| 高清日韩电视剧大全免费播放在线观看| 日韩av在线直播| 国产精品6699| 国产亚洲精品激情久久| 怡红院精品视频| 日韩高清a**址| 国产精品日韩在线观看| 国产欧美精品日韩精品| 亚洲偷欧美偷国内偷| 久久久久久尹人网香蕉| 欧美中文在线观看|