我想为我的单元格获得动态高度,有时会有一行,两行三行文本。问题是,这个函数(来自http://www.raywenderlich.com):
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
static UILabel* labelTitle;
if (!labelTitle) {
labelTitle = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, FLT_MAX, FLT_MAX)];
labelTitle.text = @"test";
}
labelTitle.font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline];
[labelTitle sizeToFit];
return labelTitle.frame.size.height * 1.7;
}
它获得适合所有细胞的静态高度。我想要一个动态高度取决于UILabels中的内容。以及如何使用UITableViewCellStyleSubtitle实现这一目标?
答案 0 :(得分:0)
要使sizeToFit正常工作,您必须将标签的行设置为0;
// width of the testlabel should be same for the label you are using to show in Cell
UILabel *testLabel = [[UILabel alloc]initWithFrame:CGRectMake(x,y,width,height)];
testLabel.numberOfLines = 0; // you need to do this
testLabel.text = @" Your text here ";
[testLabel sizeToFit];
现在您可以使用标签的高度。
CGFLoat height = testLabel.frame.size.height + margin; // add margin if you want a float value
还要确保在 - (UITableViewCell *)tableView中使用sizeToFit :( UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
希望这会对你有所帮助。 :)
答案 1 :(得分:0)
从文档中,较大的文本标签通过textLabel
属性访问,较小的文本标签通过detailTextLabel
属性访问。
所以可能是这样的:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
static UITableViewCell *cell;
static UILabel *label;
if (!cell) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"Your Identifier"];
cell.frame = CGRectMake(0, 0, tableView.bounds.size.width, 100);
label = cell.detailTextLabel;
}
CGSize size = [label sizeThatFits:CGSizeMake(label.bounds.size.width, CGFLOAT_MAX)];
return size.height;
}
或者,自己继承UITableViewCell,然后在那里绘制文本。 Cell代码将是这样的:
@interface YourCell : UITableViewCell
@property (nonatomic, strong) NSString *text;
+ (CGFloat) heightForCellWithText:(NSString *)text;
@end
单元格实施:
#import "YourCell.h"
@interface YourCell()
@end
static NSMutableParagraphStyle *textStyle;
static UIFont *textFont;
@implementation YourCell
+(void)initialize {
textStyle = [[NSMutableParagraphStyle defaultParagraphStyle] mutableCopy];
textStyle.lineBreakMode = NSLineBreakByWordWrapping;
textStyle.alignment = NSTextAlignmentLeft;
textFont = [UIFont systemFontOfSize:12];
}
-(void)setText:(NSString *)text {
_text = text;
[self setNeedsDisplay];
}
#define TEXT_ORIGIN_X 20
#define TEXT_ORIGIN_Y 20
#define TEXT_SIZE_WIDTH 200
#define CELL_MARGIN TEXT_ORIGIN_X * 2
+ (CGFloat) heightForCellWithText:(NSString *)text {
return [self heightForText:text] + CELL_MARGIN;
}
+ (CGFloat )heightForText:(NSString *)text {
NSStringDrawingContext *context = [[NSStringDrawingContext alloc] init];
context.minimumScaleFactor = 1;
return [text boundingRectWithSize:CGSizeMake(TEXT_ORIGIN_X, CGFLOAT_MAX)
options:NSStringDrawingUsesLineFragmentOrigin
attributes:@{
NSFontAttributeName: textFont, NSParagraphStyleAttributeName:textStyle
} context:context].size.height;
}
-(void)drawRect:(CGRect)rect {
[super drawRect:rect];
[self.text drawInRect:CGRectMake(TEXT_ORIGIN_X, TEXT_ORIGIN_Y, TEXT_SIZE_WIDTH, [self.class heightForText:self.text]) withAttributes:@{NSFontAttributeName:textFont, NSParagraphStyleAttributeName:textStyle}];
}
@end
您的细胞高度计算将
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
[YourCell heightForCellWithText:@"Test"];
}
答案 2 :(得分:0)
调整方法(sizeWithFont
,sizeToFit
)在iOS7
上非常容易出错。
我建议使用sizeThatFits
。当我使用它时,它并不完美,如果最后一行只有一个单词,它会切断最后一行:为了克服这个问题,你应该减少它的最大宽度参数,同时你的UI字段的框架保持不变。
答案 3 :(得分:0)
当为所述单元格调用layoutSubviews
时,每个单元格都会获得适当的大小。遗憾的是,在创建单元格时不会调用它。
您可以使用稍微延迟setNeedsLayout
的单元格来重新布局,这样您就可以获得合适的尺寸。