JGScrollableTableViewCell 1.1

JGScrollableTableViewCell 1.1

测试已测试
语言语言 Obj-CObjective C
许可证 MIT
发布最后发布2014年12月

Jonas Gessner 维护。



© 2013-2014 Jonas Gessner


JGScrollableTableViewCell 是一个简单易用的 UITableViewCell 子类,它带有一个可滚动的视图内容,当滚动时将显示一个附件视图。该行为灵感来源于 iOS 7 邮件应用。

当前版本: 1.1

要求

• iOS 5 或更高版本
• 使用 ARC 构建(如果你的 Xcode 项目未使用 ARC,请设置编译标志 -fobjc-arc
• Foundation、UIKit 和 CoreGraphics 框架

开始使用

JGScrollableTableViewCell 的工作方式与任何其他的 UITableViewCell 相同:高亮显示、选择和 UITableViewDelegate 调用都像正常一样工作。唯一的区别是该单元格的 contentView 被一个 UIScrollView 覆盖,这基本上成为了一个新的内容视图 - 可以滚动。

可以将一个“选项视图”分配给单元格,该视图放置在滚动视图后面,使您能够通过滚动单元格来揭示其后面的选项视图。

注意:您应该始终使用自定义 JGScrollableTableViewCell 子类,其中添加了您自定义的内容到单元格(比如标签和图像视图)。

安装

CocoaPods
将它添加到你的 Podfile

pod 'JGScrollableTableViewCell', '1.1'

添加源文件
JGScrollableTableViewCell 文件夹 拖入你的项目中。

在你将 JGScrollableTableViewCell 添加到项目中后,只需 #import "JGScrollableTableViewCell.h" 即可使用!

文档

默认情况下,JGScrollableTableViewCell 具有一个空的滚动区域,没有选项视图。以下是对整个 JGScrollableTableViewCell 类的指南

滚动视图

- (UIScrollView *)scrollView;

返回单元格中使用的滚动视图。请不要向滚动视图添加任何子视图或修改其 frame、bounds、contentOffset 或 contentInset。

- (void)setScrollViewInsets:(UIEdgeInsets)scrollViewInsets;

将滚动视图内缩。有助于显示滚动区域的边框(当也设置 contentView.backgroundColor 时)

- (void)setScrollViewBackgroundColor:(UIColor *)scrollViewBackgroundColor;

设置滚动视图的背景颜色。等同于普通 UITableViewCell 上的 contentView.backgroundColor

- (BOOL)isScrolling;

如果用户正在拖动滚动视图或滚动视图正在减速,返回 YES

- (void)setGrabberView:(UIView *)grabberView;

设置一个视图作为滚动视图的抓取器。此视图是静态的,因此不会被单元格调整大小。如果此视图为 \c nil,则整个滚动视图区域都可滚动;如果设置了此视图,则只能在此视图中进行滚动。

选项视图

- (void)setOptionView:(UIView *)view ;

设置新的选项视图并删除旧的选项视图。选项视图将动态调整大小以适应单元格的大小和滚动视图的内边距。选项视图的 frame 中唯一不会改变的是宽度。应该在将视图传递给此方法之前设置宽度,并且之后不应该更改。

- (UIView *)optionView;

返回当前的选项视图。

- (void)setOptionViewVisible:(BOOL)optionViewVisible animated:(BOOL)animated;

以可选的 0.3 秒动画打开或关闭选项视图。

可滚动内容

- (void)addContentView:(UIView *)view;

您不应该在任何时候直接将视图添加到单元格或其 contentView。相反,将应显示在单元格中的视图传递给此方法。传递给此方法的视图将出现在单元格的可滚动区域。

委托

JGScrollableTableViewCell 拥有一个符合 JGScrollableTableViewCellDelegate 协议的委托。它用于处理滚动事件。

@property (nonatomic, weak) id <JGScrollableTableViewCellDelegate> scrollDelegate;



JGScrollableTableViewCellDelegate 协议声明了三个可选(自解释)的方法

- (void)cellDidBeginScrolling:(JGScrollableTableViewCell *)cell;
- (void)cellDidScroll:(JGScrollableTableViewCell *)cell;
- (void)cellDidEndScrolling:(JGScrollableTableViewCell *)cell;

理想情况下,您的 UITableViewDelegate 应该也是您的 JGScrollableTableViewCellDelegate

自定义触摸处理

在某些特殊情况下可能需要自定义触摸处理(参见 Advanced 例子项目)。有两个块可以用于自定义滚动行为。

 @property (nonatomic, copy) void (^scrollViewDidScrollBlock)(JGScrollableTableViewCell *cell, UIScrollView *scrollView);

当滚动视图滚动时调用此块。可以用来自定义滚动视图的行为。

高级用法

打开选项视图的管理

JGScrollableTableViewCellManager
+ (void)closeAllCellsWithExceptionOf:(JGScrollableTableViewCell *)cell stopAfterFirst:(BOOL)stop;

这关闭了包含 cell 的表格视图中的所有选项视图。stop 是一个标志,可以在找到并关闭第一个带有打开选项视图的单元格后停止枚举单元格,从而提高性能。当您设置了 JGScrollableTableViewCellDelegate 以一次仅允许打开一个选项视图时(如下例所示),请将此标志设置为 YES

使用此方法调用,我们可以设置我们的表格视图一次只允许打开一个选项视图

- (void)cellDidBeginScrolling:(JGScrollableTableViewCell *)cell {
    [JGScrollableTableViewCellManager closeAllCellsWithExceptionOf:cell stopAfterFirst:YES];
}

- (void)cellDidScroll:(JGScrollableTableViewCell *)cell {
    [JGScrollableTableViewCellManager closeAllCellsWithExceptionOf:cell stopAfterFirst:YES];
}

- (void)cellDidEndScrolling:(JGScrollableTableViewCell *)cell {
    [JGScrollableTableViewCellManager closeAllCellsWithExceptionOf:cell stopAfterFirst:YES];
}

Surviving UITableView 的单元格重用

因为 UITableView 会重用单元格,所以当 UITableViewDataSource 加载数据时,设置每个单元格的打开状态非常重要。要记住哪些单元格被打开,您可以修改 cellDidEndScrolling: 方法以注意当前具有打开选项视图的单元格

- (void)cellDidEndScrolling:(JGScrollableTableViewCell *)cell {
    if (cell.optionViewVisible) {
        _openedIndexPath = [self.tableView indexPathForCell:cell];
    }
    else {
        _openedIndexPath = nil;
    }

    [JGScrollableTableViewCellManager closeAllCellsWithExceptionOf:cell stopAfterFirst:YES];
}

(_openedIndexPath 是一个实例变量)

tableView:cellForRowAtIndexPath: 方法应包含此代码以更新每个单元格的 optionViewVisible 状态

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *const CellIdentifier = @"ScrollCell";

    JGScrollableTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    [cell setOptionViewVisible:[_openedIndexPath isEqual:indexPath]]; //this correctly sets the opened state of the cell's option view.

    return cell;
}



例子

Examples 文件夹中有两个示例项目。

致谢

由Jonas Gessner创建。©2013-2014

贡献

欢迎您通过Fork仓库,修改代码,并提交问题或拉取请求来为该项目做出贡献。

许可证

遵照MIT许可证。