Iphone UITableView-由单元本身控制的动态单元高度
我有以下设置:带有自定义UITableViewCell实现的UITableView。在每个单元格中,我都有一个UILabel和一个UIButton。第一次显示表格时,在每个单元格中,UILabel的行数设置为1,所有单元格的高度固定(在我的示例中为60 px)。当点击单元格中的按钮时,UILabel的行数设置为0,并打开换行,从而有效地扩展表格单元格 现在的问题是,只有UITableViewCell的实现才知道标签是否展开,从而知道单元格高度应该是多少。但是,所有者文件是表的数据源 我不知道梅该怎么做。欢迎提出任何意见 更新以下是我的代码摘录 在自定义UITableViewCell实现中:Iphone UITableView-由单元本身控制的动态单元高度,iphone,dynamic,uitableview,height,Iphone,Dynamic,Uitableview,Height,我有以下设置:带有自定义UITableViewCell实现的UITableView。在每个单元格中,我都有一个UILabel和一个UIButton。第一次显示表格时,在每个单元格中,UILabel的行数设置为1,所有单元格的高度固定(在我的示例中为60 px)。当点击单元格中的按钮时,UILabel的行数设置为0,并打开换行,从而有效地扩展表格单元格 现在的问题是,只有UITableViewCell的实现才知道标签是否展开,从而知道单元格高度应该是多少。但是,所有者文件是表的数据源 我不知道梅该
- (float)requiredHeight
{
if(isFull)
{
CGSize labelSize = [LblTitle.text sizeWithFont: [LblContent font]
constrainedToSize: CGSizeMake(300.0f, 300.0f)
lineBreakMode: UILineBreakModeTailTruncation];
return 42.0f + labelSize.height;
}
else
{
return 60.0f;
}
}
- (CGFloat)requiredHeight
{
if(isFull)
{
CGSize labelSize = [LblTitle.text sizeWithFont: [LblContent font]
constrainedToSize: CGSizeMake(300.0f, 300.0f)
lineBreakMode: UILineBreakModeTailTruncation];
return 42.0f + labelSize.height;
}
else
{
return 60.0f;
}
}
在所有者文件(UITableViewDelegate)中:
但是,这会随机导致无限循环或坏访问异常。在表委托中实现该方法。如果要基于每个单元格定义高度,可以通过在tableView:HeightForRowatineXpath中调用自己的tableView:CellForRowatineXpath:method将此调用“转发”到单元格的类
更新:在代码中实现。错误是由调用tableView:CellForRowatineXpath的委托中的不正确方法签名引起的
在自定义UITableViewCell实现中:
- (float)requiredHeight
{
if(isFull)
{
CGSize labelSize = [LblTitle.text sizeWithFont: [LblContent font]
constrainedToSize: CGSizeMake(300.0f, 300.0f)
lineBreakMode: UILineBreakModeTailTruncation];
return 42.0f + labelSize.height;
}
else
{
return 60.0f;
}
}
- (CGFloat)requiredHeight
{
if(isFull)
{
CGSize labelSize = [LblTitle.text sizeWithFont: [LblContent font]
constrainedToSize: CGSizeMake(300.0f, 300.0f)
lineBreakMode: UILineBreakModeTailTruncation];
return 42.0f + labelSize.height;
}
else
{
return 60.0f;
}
}
在所有者文件(UITableViewDelegate)中:
好吧,经过一番挣扎后,我得到了这样的结果,哪种方法有效
高度
在我的控制器(也是表视图的委托)中,我将数据保存为指向类型为CommentInfo
的对象的指针的NSMutableArray
在cellforrowatinexpath
中,我获取相应的指针,并在构建期间将其传递给自定义单元格实现,并将其存储在其中。我还将self
设置为单元格的委托
在自定义单元格实现中,当需要展开/更改高度时,我会更新CommentInfo
对象中的height
属性,并调用代理中的方法来更新显示
调用此updateDisplay
方法时,我只需执行以下操作:
在heightforrowatinexpath
方法中,我检索指向CommentInfo
的相应指针,并读取Height
属性。由于控制器和单元格之间的指针相同,因此对该属性的任何更改都将在这两个类中可见
工作完成。我想我没有遵循你的逻辑。我已经定义了HeightForRowatineXpath
,在其中我试图获取indexpath处的单元格,然后调用其中的一个方法来返回所需的路径,但是这会导致错误的\u访问\u异常。本质上,表是通过方法tableView:HeightForRowatineXpath:“X行应该有多高?”来询问UITableViewDelegate。您应该返回所需高度(以像素为单位)的CGFloat,而不是索引路径。@JacobJinnings:您似乎误读了我的代码。对于“X行应该有多高”,我试图获取X行并询问它应该有多高,然后返回该值。请仔细查看代码。我在UITableViewCell中使用UIWebView,因此调用heightForRowAtIndexPath时它无法判断高度。我要做的是将单元格设置为UIWebView的委托,并在webViewDidFinishLoad方法中调用[webView sizeToFit];webView.hidden=否;[tableViewController setRowHeight:webView.bounds.size.height for RowId:id];在UITableViewController的setRowHeight方法中,我调用您提供的两个方法:[tableView BeginUpdate];[tableView EndUpdate];它是有效的。
@interface CommentInfo : NSObject
{
int ID;
NSString *Name;
NSString *Date;
NSString *Content;
BOOL IsFull;
float Height;
}
@property (readonly) int ID;
@property (readonly) NSString *Name;
@property (readonly) NSString *Date;
@property (readonly) NSString *Content;
@property (readwrite, assign) float Height;
@property (readwrite, assign) BOOL IsFull;
- (id)initWithID:(int)_id withName:(NSString *)_name withDate:(NSString *)_date withText:(NSString *)_text;
@end
[CommentsTable beginUpdates];
[CommentsTable endUpdates];