TORoundedTableView
从iOS 13开始,苹果发布了名为UITableViewStyleInsetGrouped
的官方表格视图样式!太好了!尽管我将继续维护这个库,除非你需要向后兼容性,或需要某种形式的额外控制,从现在起,我强烈建议你采用官方的UITableView
API。
TORoundedTableView
是UIKit标准UITableView
类的子类。它回到了iOS 6的日子,它重写了标准分组UITableView
的外观和行为,以匹配自iOS 7以来每个iPad上设置应用中看到的无边框、圆角样式。
随着iOS设备屏幕的增加(如iPhone 6 Plus和原始iPad Pro),有许多UI设计案例中,标准的分组UITableView
的“边到边”样式并不合适,并且最终在超宽区域中看起来相当失真。
功能
- 与
UITableViewController
集成(由于tableView
属性是可变的!) - 相对独立运作,仅需要几额外API。
- 优化到极致,确保性能或动画损坏。
- 在紧凑的属性集合中回退到标准表格视图样式(就像在Settings.app中一样)
- 圆角图形是按程序生成的,并且可以即时自定义。
示例代码
TORoundedTableView
可以轻松集成到 UITableViewController
,你只需要在屏幕上显示之前,将控制器中 tableView
属性存储的 UITableView
对象替换即可。
TORoundedTableView
尽可能登录手,需要的额外 delegate
/ dataSource
代码尽可能少。然而,为了确保最大效率,需要几个额外的代码块。
在一个标准的 UITableViewController
实现中,使用 TORoundedTableView
,tableView:cellForRowAtIndexPath:
数据源方法看起来像这样。
- (UITableViewCell *)tableView:(TORoundedTableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
/*
Because the first and last cells in a section (dubbed the 'cap' cells) do a lot of extra work on account of the rounded corners,
for ultimate efficiency, it is recommended to create those ones separately from the ones in the middle of the section.
*/
// Create identifiers for standard cells and the cells that will show the rounded corners
static NSString *cellIdentifier = @"Cell";
static NSString *capCellIdentifier = @"CapCell";
// Work out if this cell needs the top or bottom corners rounded (Or if the section only has 1 row, both!)
BOOL isTop = (indexPath.row == 0);
BOOL isBottom = indexPath.row == ([tableView numberOfRowsInSection:indexPath.section] - 1);
// Create a common table cell instance we can configure
UITableViewCell *cell = nil;
// If it's a non-cap cell, dequeue one with the regular identifier
if (!isTop && !isBottom) {
TORoundedTableViewCell *normalCell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (normalCell == nil) {
normalCell = [[TORoundedTableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier];
}
cell = normalCell;
}
else {
// If the cell is indeed one that needs rounded corners, dequeue from the pool of cap cells
TORoundedTableViewCapCell *capCell = [tableView dequeueReusableCellWithIdentifier:capCellIdentifier];
if (capCell == nil) {
capCell = [[TORoundedTableViewCapCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:capCellIdentifier];
}
// Configure the cell to set the appropriate corners as rounded
capCell.topCornersRounded = isTop;
capCell.bottomCornersRounded = isBottom;
cell = capCell;
}
// Configure the cell's label
cell.textLabel.text = [NSString stringWithFormat:@"Cell %ld", indexPath.row+1];
// Since we know the background is white, set the label's background to also be white for performance optimizations
cell.textLabel.backgroundColor = [UIColor whiteColor];
cell.textLabel.opaque = YES;
// Return the cell
return cell;
}
安装
TORoundedTableView
支持 iOS 8 及以上版本。虽然是用 Objective-C 编写的,但也应该容易导入到 Swift 中。
手动安装
要手动在你的应用程序中安装此库,请简单 下载这个库的副本。下载完成后,将 TORoundedTableView
文件夹的内容复制到你的应用程序项目文件夹中,然后将其导入到你的 Xcode 项目中。
CocoaPods
要集成 TORoundedTableView
,只需在你的 podfile 中添加以下内容:
pod 'TORoundedTableView'
Carthage
要集成 TORoundedTableView
,只需在你的 Cartfile 中添加以下内容:
github "TimOliver/TORoundedTableView"
类
TORoundedTableView
由 4 个独立的类组成,它们协同工作以实现所需的功能。
TORoundedTableView
这是一个基本的 UITableView
子类包装器,它通过手动重新布局更窄列的所有内容视图来覆盖原始的“边到边”理念。它还创建和管理圆角图像资源,以便所有单元格可以有效地共享。
TORoundedTableViewCell
这是一个小的 UITableViewCell
包装器,它通过内部覆盖单元格的 frame
属性,将所有单元格约束到父 TORoundedTableView
的较窄列宽度。
TORoundedTableViewCapCell
它是 TORoundedTableViewCell
的一个子类,提供了管理绘制圆角所需的视图的额外逻辑,并覆盖了 UITableViewCell
的在节顶部和底部放置细框的行为。
TORoundedTableViewCellBackground
负责绘制章节顶部和底部单元格圆角视图的视图,实例被设置为每个 TORoundedTableViewCapCell
的 backgroundView
和 selectedBackgroundView
。绘图由3个填充视图的固态 CALayer
对象和4个绘制每个角落圆角图像的额外 CALayer
对象处理。
使用 CALayer
对象代替 UIView
以避免 UITableViewCell
在点击时使 backgroundView
子视图透明的隐性行为,并通过布局图层网格以确保只有角落中的元素需要进行alpha混合(出于性能考虑)。
贡献
此视图仍然处于初级阶段,很多功能还没在示例应用中进行测试。如果您有此视图的特定用例或改善它的想法,我很乐意听取。请提交问题,并如果您愿意提交PR,那将是非常棒的。
为什么构建此功能?
由于从2013年以来,类似于 UITableView
的样式已在iPad的Settings.app中普遍存在,我一直以为如果需要,修改表视图适应这种样式相对简单。
本周,当我需要为工作中的测试应用创建登录视图控制器时,我对这种假设进行了测试。结果证明假设是错误的,实际上覆盖 UITableView
的全边设计方案是非常困难的。
鉴于工作中的时间限制,我想出了一个“妥协”来按时交付代码,但同时也非常好奇是否可以“正确地”实现此类表视图样式。
所以我决定在过去的几晚花时间实现同一想法的更优雅版本。
事实证明,这并不容易。 UITableView
尝试在每次 layoutSubviews
的调用上重置其UI,并且 UITableViewCell
有很多破坏“盖子”背景视图的隐性行为。
无论如何,经过很多次的坚持,我很高兴终于实现了与Settings.app表视图无法区分的效果。这就是我在编程中绝对喜欢的那种激动人心的感觉。 :D
致谢
TORoundedTableView
由Tim Oliver创建,以作为可靠地破解 UITableView
的疯狂实验。
由Pixeden制作的iPhone XR设备原型。
许可协议
TORoundedTableView
遵循MIT许可协议。更多详情请参见LICENSE文件。