TORoundedTableView 0.2.1

TORoundedTableView 0.2.1

测试已测试
语言语言 Obj-CObjective C
许可协议 MIT
发布上次发布2020年3月

Tim Oliver维护。



  • 作者
  • Tim Oliver

TORoundedTableView

TORoundedTableView

Build Status Version Carthage compatible GitHub license Platform Beerpay PayPal Twitch

从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 实现中,使用 TORoundedTableViewtableView: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

负责绘制章节顶部和底部单元格圆角视图的视图,实例被设置为每个 TORoundedTableViewCapCellbackgroundViewselectedBackgroundView。绘图由3个填充视图的固态 CALayer 对象和4个绘制每个角落圆角图像的额外 CALayer 对象处理。

使用 CALayer 对象代替 UIView 以避免 UITableViewCell 在点击时使 backgroundView 子视图透明的隐性行为,并通过布局图层网格以确保只有角落中的元素需要进行alpha混合(出于性能考虑)。

贡献

此视图仍然处于初级阶段,很多功能还没在示例应用中进行测试。如果您有此视图的特定用例或改善它的想法,我很乐意听取。请提交问题,并如果您愿意提交PR,那将是非常棒的。

为什么构建此功能?

由于从2013年以来,类似于 UITableView 的样式已在iPad的Settings.app中普遍存在,我一直以为如果需要,修改表视图适应这种样式相对简单。

本周,当我需要为工作中的测试应用创建登录视图控制器时,我对这种假设进行了测试。结果证明假设是错误的,实际上覆盖 UITableView 的全边设计方案是非常困难的。

鉴于工作中的时间限制,我想出了一个“妥协”来按时交付代码,但同时也非常好奇是否可以“正确地”实现此类表视图样式。

所以我决定在过去的几晚花时间实现同一想法的更优雅版本。

事实证明,这并不容易。 UITableView 尝试在每次 layoutSubviews 的调用上重置其UI,并且 UITableViewCell 有很多破坏“盖子”背景视图的隐性行为。

无论如何,经过很多次的坚持,我很高兴终于实现了与Settings.app表视图无法区分的效果。这就是我在编程中绝对喜欢的那种激动人心的感觉。 :D

致谢

TORoundedTableViewTim Oliver创建,以作为可靠地破解 UITableView 的疯狂实验。

Pixeden制作的iPhone XR设备原型。

许可协议

TORoundedTableView遵循MIT许可协议。更多详情请参见LICENSE文件。analytics