gpt4 book ai didi

ios - 从 Storyboard 中检索自定义原型(prototype)单元高度?

转载 作者:IT王子 更新时间:2023-10-29 08:01:06 25 4
gpt4 key购买 nike

当使用“动态原型(prototype)”指定 Storyboard上的 UITableView 内容时,有一个“行高”属性可以设置为自定义。

实例化单元格时,不会考虑此自定义行高。这是有道理的,因为我使用哪个原型(prototype)单元是由我的应用程序代码在实例化单元时决定的。在计算布局时实例化所有单元会引入性能损失,所以我理解为什么不能这样做。

接下来的问题是,我能否以某种方式检索给定单元格重用标识符的高度,例如

[myTableView heightForCellWithReuseIdentifier:@"MyCellPrototype"];

或者类似的东西?或者我是否必须在我的应用程序代码中复制显式行高,随之而来的是维护负担?

在@TimothyMoose 的帮助下解决了:

高度存储在单元格本身中,这意味着获取高度的唯一方法是实例化原型(prototype)。这样做的一种方法是在正常的单元格回调方法之外预先将单元格出列。这是我的小型 POC,它有效:

#import "ViewController.h"

@interface ViewController () {
NSDictionary* heights;
}
@end

@implementation ViewController

- (NSString*) _reusableIdentifierForIndexPath:(NSIndexPath *)indexPath
{
return [NSString stringWithFormat:@"C%d", indexPath.row];
}

- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
if(!heights) {
NSMutableDictionary* hts = [NSMutableDictionary dictionary];
for(NSString* reusableIdentifier in [NSArray arrayWithObjects:@"C0", @"C1", @"C2", nil]) {
CGFloat height = [[tableView dequeueReusableCellWithIdentifier:reusableIdentifier] bounds].size.height;
hts[reusableIdentifier] = [NSNumber numberWithFloat:height];
}
heights = [hts copy];
}
NSString* prototype = [self _reusableIdentifierForIndexPath:indexPath];
return [heights[prototype] floatValue];
}

- (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return 3;
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}

- (UITableViewCell*) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString* prototype = [self _reusableIdentifierForIndexPath:indexPath];
UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:prototype];
return cell;
}

@end

最佳答案

对于静态(非数据驱动)高度,您只需将单元格出列一次并存储高度:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSNumber *height;
if (!height) {
UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"MyCustomCell"];
height = @(cell.bounds.size.height);
}
return [height floatValue];
}

对于动态(数据驱动)高度,可以在 View Controller 中存储一个原型(prototype)单元格,并在单元格的类中添加一个方法来计算高度,同时考虑到原型(prototype)实例的默认内容,例如 subview 放置、字体等:

- (MyCustomCell *)prototypeCell
{
if (!_prototypeCell) {
_prototypeCell = [self.tableView dequeueReusableCellWithIdentifier:@"MyCustomCell"];
}
return _prototypeCell;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
// Data for the cell, e.g. text for label
id myData = [self myDataForIndexPath:indexPath];

// Prototype knows how to calculate its height for the given data
return [self.prototypeCell myHeightForData:myData];
}

当然,如果您使用自定义高度,您可能有多个单元格原型(prototype),因此您可以将它们存储在字典或其他东西中。

据我所知, TableView 不会尝试重用原型(prototype),大概是因为它在 cellForRowAtIndexPath: 之外出队。这种方法对我们非常有效,因为它允许设计人员修改 Storyboard中的单元格布局,而无需更改任何代码。

修改:阐明示例代码的含义并添加静态高度的示例。

关于ios - 从 Storyboard 中检索自定义原型(prototype)单元高度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13660004/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com