我搜索并搜索了无数的博客和文章,了解如何确定自定义UITableViewCell的动态高度及其详细文本。我真的很难找到任何关于此的好文档。
我需要做的是让细胞根据里面的文字生长,但绝不要低于70的高度。
我已经在StackOverflow上尝试了这类问题的几个答案,但没有一个能够工作。我的整个应用程序即将完成,但我确实需要在发布之前完成这项工作并且很麻烦。
这是我正在尝试的但我只是得到一堆细胞相互重叠。根据我的阅读,我需要找到框架,如果单元格中的自定义单元格或textview,但我不知道如何做到这一点或将它们混合在一起以返回一个高度。
非常感谢任何帮助谢谢!
- (CGFloat) tableView: (UITableView *) tableView heightForRowAtIndexPath: (NSIndexPath
*) indexPath
{
CGSize aSize;
aSize = [[(Tweet*)[tweets objectAtIndex:indexPath.row]tweet] sizeWithFont:[UIFont
systemFontOfSize:14]
constrainedToSize:CGSizeMake(300.0, 1000.0)
lineBreakMode:UILineBreakModeTailTruncation];
return aSize.height;
}
答案 0 :(得分:18)
我有一段时间有类似的问题,这对我帮助很大。
#define PADDING 10.0f
- (CGFloat)tableView:(UITableView *)t heightForRowAtIndexPath:(NSIndexPath *)indexPath {
NSString *text = [self.items objectAtIndex:indexPath.row];
CGSize textSize = [text sizeWithFont:[UIFont systemFontOfSize:14.0f] constrainedToSize:CGSizeMake(self.tableView.frame.size.width - PADDING * 3, 1000.0f)];
return textSize.height + PADDING * 3;
}
答案 1 :(得分:3)
嘿,所以你需要在NSArray中存储字符串列表,然后你需要使用sizeWithFont来计算nsstring的高度:constrainedToSize:文档在这里http://developer.apple.com/library/ios/#documentation/UIKit/Reference/NSString_UIKit_Additions/Reference/Reference.html < / p>
所以你的tableView方法看起来应该像
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSDictionary *stringAttributes = [NSDictionary dictionaryWithObject:[UIFont fontWithName:"Helvetica" size:9] forKey: NSFontAttributeName];
CGSize cell_size = [string boundingRectWithSize:CGSizeMake(300,999)
options:NSStringDrawingTruncatesLastVisibleLine|NSStringDrawingUsesLineFragmentOrigin
attributes:stringAttributes context:nil].size;
if (cell_size.height > 70)
{
return cell_size.height;
}
else
{
return 70;
}
}
编辑:这已针对iOS 7进行了更新
答案 2 :(得分:0)
我刚刚写了这个问题以及我最终决定如何解决它。您可以在此处阅读:Dynamic UITableView Cell Height Based on Contents
基本上,我创建了一个UITableView子类,它可以自动处理和计算默认和自定义单元格的动态单元格高度。它不是一个银弹,可能需要扩展和调整,但我已经在几个应用程序中使用它,结果很好。
您可以在此处获取代码:https://github.com/danielsaidi/AutoSizeTableView
希望它有所帮助!
(......如果没有,我很想知道为什么不这样做)
答案 3 :(得分:0)
我尝试了很多解决方案,但有一个解决方案就是这个,由朋友建议:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
int height = [StringUtils findHeightForText:yourLabel havingWidth:yourWidth andFont:[UIFont systemFontOfSize:17.0f]];
height += [StringUtils findHeightForText:yourOtherLabel havingWidth:yourWidth andFont:[UIFont systemFontOfSize:14.0f]];
return height + CELL_SIZE_WITHOUT_LABELS; //important to know the size of your custom cell without the height of the variable labels
}
StringUtils.h类:
#import <Foundation/Foundation.h>
@interface StringUtils : NSObject
+ (CGFloat)findHeightForText:(NSString *)text havingWidth:(CGFloat)widthValue andFont:(UIFont *)font;
@end
StringUtils.m class:
#import "StringUtils.h"
@implementation StringUtils
+ (CGFloat)findHeightForText:(NSString *)text havingWidth:(CGFloat)widthValue andFont:(UIFont *)font {
CGFloat result = font.pointSize+4;
if (text) {
CGSize size;
CGRect frame = [text boundingRectWithSize:CGSizeMake(widthValue, CGFLOAT_MAX)
options:NSStringDrawingUsesLineFragmentOrigin
attributes:@{NSFontAttributeName:font}
context:nil];
size = CGSizeMake(frame.size.width, frame.size.height+1);
result = MAX(size.height, result); //At least one row
}
return result;
}
@end
它对我来说很完美。我有一个自定义单元格,其中包含3个固定尺寸的图像,2个固定尺寸的标签和2个可变标签。工作就像一个魅力。希望它也适合你。
最好的问候,亚历山大。
答案 4 :(得分:0)
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section
{
NSString *text = @"Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello HelloHello HelloHello HelloHello HelloHello HelloHello Hello";
CGRect rect = [text boundingRectWithSize:CGSizeMake(280.0f, CGFLOAT_MAX) options:NSStringDrawingTruncatesLastVisibleLine|NSStringDrawingUsesLineFragmentOrigin attributes:@{
NSFontAttributeName: [UIFont fontWithName:@"Hellvetica" size:14.0f]
} context:nil];
return CGSizeMake(320.0f, ceil(rect.size.height) + 10.0f);
}
答案 5 :(得分:-4)
使用UITableViewDelegate方法:
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
// here you need to get height of your textlabel in your custom cell.
MyCustomCell *myCell = (MyCustomCell *)[tableView cellForRowAtIndexPath:indexPath];
return myCell.myTextLabel.frame.size.height + 20;
}
像这样的东西