KSPAutomaticHeightCalculationTableCellView 1.3.0

KSPAutomaticHeightCalculationTableCellView 1.3.0

测试已测试
Lang语言 Obj-CObjective C
许可证 MIT
发布最后发布2015年10月

Konstantin Pavlikhin维护。



一个用于基于视图的 NSTableView 单元的自定义单元的超类。

使用方法

您自定义的单元类应该继承自 KSPAutomaticHeightCalculationTableCellView

以下是使用 Objective-C 的样子

#import <KSPAutomaticHeightCalculationTableCellView+Private.h>

@interface MyLovelyCell : KSPAutomaticHeightCalculationTableCellView@end

将您的单元放入单独的 XIB 中,并让 KSPAutomaticHeightCalculationTableCellView 知道如何在运行时找到它

将单元放入单独的 XIB 中通常是一个好主意,但使用 KSPAutomaticHeightCalculationTableCellView 使得这成为强制性的。

默认情况下,KSPAutomaticHeightCalculationTableCellView 将在一个主要包中寻找与你单元子类完全相同的 nib 文件。

也就是说,如果你调用你的单元类 MyLovelyCell,你必须命名你的 XIB 为 MyLovelyCell.xib。这个 xib 应该包含一个且仅包含 MyLovelyCell 类的一个根视图。尽管如此,XIB 中仍然可以有任意数量的其他对象。

您可以通过重写以下类方法来自定义行为

+ (nonnull NSString*) correspondingNibName
{
  return @"SomethingDifferent";
}
+ (nonnull NSBundle*) correspondingBundle
{
  return [NSBundle bundle...];
}

决定您的自定义表单元是否应该有可变高度

单元有可变高度 == 单元的高度取决于表示的对象值 OR 单元的高度取决于单元的宽度

默认情况下,KSPAutomaticHeightCalculationTableCellView 假设您的单元具有可变高度,因为这是您在项目中使用此类的基本原因。

重写 +hasFixedHeight 并返回 YES 如果您的单元的高度确实是固定的。

+ (BOOL) hasFixedHeight
{
  return YES;
}

在这种情况下,KSPAutomaticHeightCalculationTableCellView 将在第一次计算后缓存高度。后续调用 +heightWithRepresentedObject:width: 将返回存储的值。

使用自动布局布局单元

此步骤也是必需的。只有在启用了自动布局的模式下,KSPAutomaticHeightCalculationTableCellView才能正常工作。如果您执行手动框架计算,使用此类将毫无意义。

注意,这部分内容非常重要:
在添加布局约束后,您单元格的高度应该是“明确的”!这意味着,高度必须直接(通过显式高度约束,这将使KSPAutomaticHeightCalculationTableCellView的使用显得尤为无意义,因为您已经知道高度值)或者以派生方式(在此方式中,单元格的高度以某种方式依赖于子视图的几何形状,而几何形状反过来又依赖于内容)进行约束。

请记住这一点,因为如果您将单元格视图的高度搞得模糊不清,您最终会在具有零高度的表格行中结束。

实现一个NSTableViewDelegate方法-tableView:heightOfRow:

- (CGFloat) tableView: (NSTableView*) tableView heightOfRow: (NSInteger) row
{
  // Get the width of a column in which the cell should reside.
  CGFloat columnWidth = [tableView tableColumnWithIdentifier: @“MainColumn”].width;

  // Let the KSPAutomaticHeightCalculationTableCellView to calculate the preffered cell height for you.
  return [MyLovelyCell heightWithRepresentedObject: #<a model object for this row> width: columnWidth];
}

此时,KSPAutomaticHeightCalculationTableCellView将创建一个原型单元格实例,将其objectValue属性设置为传入的值,将其宽度约束为columnWidth,并计算最小所需高度。

确保您在单元格视图原型中不要进行不必要的操作

KSPAutomaticHeightCalculationTableCellView为测量目的实例化一个单元格时,会将它的布尔prototype属性设置为YES。如果您在单元格视图的子类中执行了重负载操作,例如,在objectValue更改时进行昂贵的计算,请避免这样做,如果该计算结果不影响布局的话。

if(!self.prototype)
{
  // Do some fancy visual effects pre-calculation (image caching, data detection and so on...).
}
else
{
  // This cell is a prototype that is being reused for a row height calculation (possibly hundreds times per second).
}

就是这样!