测试已测试 | ✗ |
Lang语言 | Obj-CObjective C |
许可证 | MIT |
发布最后发布 | 2015年10月 |
一个用于基于视图的 NSTableView
单元的自定义单元的超类。
KSPAutomaticHeightCalculationTableCellView
以下是使用 Objective-C 的样子
#import <KSPAutomaticHeightCalculationTableCellView+Private.h>
@interface MyLovelyCell : KSPAutomaticHeightCalculationTableCellView
…
@end
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).
}
就是这样!