一. 基礎(chǔ)屬性
-
tableView style 只能在初始化中設(shè)置
@property(nonatomic, readonly) UITableViewStyle style typedef NS_ENUM(NSInteger, UITableViewStyle) { UITableViewStylePlain, // regular table view UITableViewStyleGrouped // preferences style table view };
-
設(shè)置分割線style(枚舉):
@property(nonatomic) UITableViewCellSeparatorStyle separatorStyle typedef NS_ENUM(NSInteger, UITableViewCellSeparatorStyle) { UITableViewCellSeparatorStyleNone, // 不顯示分割線 UITableViewCellSeparatorStyleSingleLine, // 一條風(fēng)分割線 UITableViewCellSeparatorStyleSingleLineEtched // 與None 看起來(lái)相同 = = } __TVOS_PROHIBITED;
-
設(shè)置分割線顏色
@property(nonatomic, retain) UIColor *separatorColor
-
設(shè)置分割線效果(IOS8之后可用) 具體實(shí)現(xiàn)效果未發(fā)現(xiàn)愚隧,有待考證
@property(nonatomic, copy) UIVisualEffect *separatorEffect ableView.separatorEffect = [UIVibrancyEffect effectForBlurEffect: [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight]]; //枚舉 typedef NS_ENUM(NSInteger, UIBlurEffectStyle) { UIBlurEffectStyleExtraLight, UIBlurEffectStyleLight, UIBlurEffectStyleDark } NS_ENUM_AVAILABLE_IOS(8_0);
tableView backgroundView 與 backgroundColor
區(qū)別 :backgroundView 是處于TableView父視圖與cell層之間的一層View,在滑動(dòng)時(shí)顯示出來(lái)的就是backgroundView魏铅,而backgroundColor是整個(gè)tableView的顏色谭梗。
而backgroundColor會(huì)影響分割線的顏色,backgroundView只會(huì)在tableView滑到極限的時(shí)候能看到旅赢。另外齿桃,backgroundView只有設(shè)置一個(gè)View的時(shí)候,設(shè)置顏色才會(huì)生效(筆者嘗試添加一個(gè) ImageView 顯示圖片煮盼,并不能顯示)短纵。
二.進(jìn)階屬性與方法
- 頭視圖與尾視圖 (Accessing Header and Footer Views)
- tableView頭尾視圖(注:不同于Session的頭尾視圖)
需要實(shí)例化一個(gè)UIView對(duì)象,頭尾視圖指針指向這個(gè)UIView對(duì)象,與Session的重用機(jī)制不同僵控,tableView的頭尾不需要考慮重用池香到,一般建議輪播圖寫(xiě)在此處。
@property(nonatomic, retain) UIView *tableHeaderView
@property(nonatomic, retain) UIView *tableFooterView
Session 頭尾高度
雖然此方法可以設(shè)置分區(qū)的頭尾高度报破,但是不建議使用悠就,建議使用代理方法設(shè)置(詳見(jiàn)下文)。使用此方法有可能第一個(gè)分區(qū)的高度還是系統(tǒng)默認(rèn)高度
@property(nonatomic) CGFloat sectionHeaderHeight
@property(nonatomic) CGFloat sectionFooterHeightSession 頭尾注冊(cè)與使用
// 注冊(cè)
- (void)registerClass:(Class nullable)aClass forHeaderFooterViewReuseIdentifier:
(NSString * nonnull)identifier
// 當(dāng)使用xib創(chuàng)建視圖的時(shí)候 使用此方法 需要初始化UINib?
- (void)registerNib:(UINib * nullable)nib forHeaderFooterViewReuseIdentifier:
(NSString * nonnull)identifier
// 從重用池調(diào)用
- (_kindofUITableViewHeaderFooterView * nullable)
dequeueReusableHeaderFooterViewWithIdentifier:(NSString * nonnull)identifier-
獲取指定Session頭尾視圖
// section 為指定分區(qū)
- (UITableViewHeaderFooterView * nullable)headerViewForSection:(NSInteger)section- (UITableViewHeaderFooterView * nullable)footerViewForSection:(NSInteger)section
-
返回cell位置相關(guān)(Accessing Cells and Sections)
-
返回指定位置NSIndexPath
// 給定cell 返回NSIndexPath - (NSIndexPath * nullable)indexPathForCell:(UITableViewCell * nonnull)cell // 返回給定坐標(biāo)處的cell充易,此坐標(biāo)是相對(duì)于整個(gè)tableView梗脾,而不是當(dāng)前屏幕 - (NSIndexPath * nullable)indexPathForRowAtPoint:(CGPoint)point // 與上面一個(gè)類(lèi)似,給一個(gè)范圍蔽氨,返回指定范圍內(nèi)所有cell的NSIndexPath 數(shù)組 // (當(dāng)tableView類(lèi)型為Plain時(shí) 因?yàn)橛蟹謪^(qū)藐唠,所以數(shù)組內(nèi)將包括下一分區(qū)聶內(nèi)容) - (NSArray<NSIndexPath *> * nullable)indexPathsForRowsInRect:(CGRect)rect // 返回當(dāng)前屏幕所有cell 的NSIndexPath @property(nonatomic, readonly) NSArray<NSIndexPath *> indexPathsForVisibleRows
-
-
返回cell本身
// 根據(jù)NSIndexPath 返回對(duì)應(yīng)cell - (UITableViewCell * nullable)cellForRowAtIndexPath:(NSIndexPath * nonnull)indexPath // 返回當(dāng)前屏幕所有cell @property(nonatomic, readonly) NSArray<__kindof UITableViewCell *> visibleCells
-
滾動(dòng)到指定位置(Scrolling the Table View)
跳轉(zhuǎn)到指定的Index- (void)scrollToRowAtIndexPath:(NSIndexPath *)indexPath atScrollPosition: (UITableViewScrollPosition)scrollPosition animated:(BOOL)animated // 其中 scrollPosition 為枚舉值 typedef enum { UITableViewScrollPositionNone, UITableViewScrollPositionTop, UITableViewScrollPositionMiddle, UITableViewScrollPositionBottom } UITableViewScrollPosition; // 其中indexPath 為tableViewCell 的位置 可自己定義 NSIndexPath *index = [NSIndexPath indexPathForRow:0 inSection:0];
-
模糊計(jì)算cell高度
此方法在不同iOS版本上功效不一樣,模糊計(jì)算效果很差鹉究。cell自適應(yīng)高度一直是很讓人困擾的地方宇立,此處貼出CSDN中比較好的解決方法(具體內(nèi)容待筆者研究后在分享) http://www.csdn.net/article/2015-05-19/2824709-cell-height-calculation@property(nonatomic) CGFloat estimatedRowHeight
選擇cell的相關(guān)設(shè)置(Inserting, Deleting, and Moving Rows and Sections)
- 是否允許選擇Cell (編輯狀態(tài)的設(shè)置下文會(huì)提到)
@property(nonatomic) BOOL allowsSelection // 非編輯狀態(tài)
@property(nonatomic) BOOL allowsSelectionDuringEditing// 編輯狀態(tài)
是否允許選擇多個(gè)行進(jìn)行編輯
@property(nonatomic) BOOL allowsMultipleSelection // 非編輯狀態(tài)是否允許被選中
@property(nonatomic) BOOL allowsMultipleSelectionDuringEditing //編輯狀態(tài)是否允許被選
默認(rèn)為NO, 當(dāng)設(shè)置為YES的時(shí)候自赔,若沒(méi)有去除點(diǎn)擊的灰色效果會(huì)發(fā)現(xiàn)可以有多個(gè)Cell變成點(diǎn)擊的樣子妈嘹,再次點(diǎn)擊取消,此過(guò)程會(huì)調(diào)用回調(diào)方法绍妨。反之润脸,只能有一個(gè)cell為點(diǎn)擊狀態(tài)
配合回調(diào)方法使用()
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath
-
返回當(dāng)前選中cell的NSIndexPath
// 返回當(dāng)前選中的cell的IndexPath - (NSIndexPath *)indexPathForSelectedRow // 返回當(dāng)前選中的cell的IndexPath,此方法返回值為一個(gè)數(shù)組 他去。 // 使用在allowsMultipleSelection = YES 的時(shí)候 - (NSArray *)indexPathsForSelectedRows
設(shè)置cell選中和取消選中狀態(tài)
- (void)selectRowAtIndexPath:(NSIndexPath *)indexPath animated: (BOOL)animated
scrollPosition:(UITableViewScrollPosition)scrollPosition
// UITableViewScrollPosition Cell選中后的位置
- (void)deselectRowAtIndexPath:(NSIndexPath *)indexPath
animated:(BOOL)animated
-
Cell的編輯狀態(tài)設(shè)置(Managing the Editing of Table Cells)
//當(dāng)要對(duì)cell編輯的時(shí)候毙驯,要將此屬性設(shè)為YES,此屬性不可以直接賦值灾测,需要調(diào)用下面的set方法
@property(nonatomic, getter=isEditing) BOOL editing- (void)setEditing:(BOOL)editing animated:(BOOL)animate
-
編輯(Inserting, Deleting, and Moving Rows and Sections)
// 當(dāng)tableview需要同時(shí)執(zhí)行多個(gè)動(dòng)畫(huà)時(shí)爆价,才會(huì)用到beginUpdates函數(shù),它的本質(zhì)就是建立了CATransaction這個(gè)事務(wù)。 // 如果你僅僅更改了UITableView的cell的樣式铭段,那么應(yīng)該試試能否通過(guò)調(diào)用beginUpdates 和 reloadRowsAtIndexPaths // 來(lái)實(shí)現(xiàn)效果骤宣,而不是調(diào)用tableview的reloadData方法去重新加載全部的cell - (void)beginUpdates - (void)endUpdates // CELL的增加、刪除和移動(dòng) - (void)insertRowsAtIndexPaths:(NSArray<NSIndexPath *> * nonnull)indexPaths withRowAnimation:(UITableViewRowAnimation)animation - (void)deleteRowsAtIndexPaths:(NSArray<NSIndexPath *> * nonnull)indexPaths withRowAnimation:(UITableViewRowAnimation)animation - (void)moveRowAtIndexPath:(NSIndexPath * nonnull)indexPath*toIndexPath:(NSIndexPath * nonnull)newIndexPath // 分區(qū)頭的增加序愚、刪除和移動(dòng) - (void)insertSections:(NSIndexSet * nonnull)sections*withRowAnimation:(UITableViewRowAnimation)animation - (void)deleteSections:(NSIndexSet * nonnull)sections*withRowAnimation:(UITableViewRowAnimation)animation - (void)moveSection:(NSInteger)section toSection:(NSInteger)newSection
刷新TableView (Reloading the Table View)
// 刷新 整個(gè)tableView
- (void)reloadData
// 刷新某一個(gè)Cell
- (void)reloadRowsAtIndexPaths:(NSArray<NSIndexPath *> * nonnull)indexPaths
withRowAnimation:(UITableViewRowAnimation)animation
// 刷新某一個(gè)分區(qū)
- (void)reloadSections:(NSIndexSet * nonnull)sections withRowAnimation:(UITableViewRowAnimation)animation
// 刷新分區(qū)的標(biāo)題
- (void)reloadSectionIndexTitles索引相關(guān)(Configuring the Table Index)
// 當(dāng)設(shè)置的數(shù)值大于cell的個(gè)數(shù)則不顯示索引
@property(nonatomic) NSInteger sectionIndexMinimumDisplayRowCount
// 索引顏色
@property(nonatomic, retain) UIColor *sectionIndexColor
// 索引的背景色
@property(nonatomic, retain) UIColor *sectionIndexBackgroundColor
// 點(diǎn)擊索引時(shí)的顏色
@property(nonatomic, retain) UIColor *sectionIndexTrackingBackgroundColor