我正在尝试计算UITableViewCell的高度,所以我定义了一个类似于此的类方法
+ (CGFloat)heightWithText:(NSString *)text
{
SizingLabel.text = text;
[SizingLabel sizeThatFits:CGSizeMake(LABEL_WIDTH, CGFLOAT_MAX)];
return (TOP_MARGIN + SizingLabel.frame.size.height + BOTTOM_MARGIN);
}
我已经像这样定义了SizingLabel:
+ (void)initialize
{
SizingLabel = [[UILabel alloc] initWithFrame:CGRectZero];
SizingLabel.numberOfLines = 0;
SizingLabel.lineBreakMode = NSLineBreakByWordWrapping;
}
但是,如果我在-heightWithText:方法中粘贴一个断点,我注意到SizingLabel的尺寸永远不会改变,因此我得到一个不正确的值。那是为什么?
答案 0 :(得分:6)
如上所述,sizeThatFits:
(以及sizeToFit
)与UILabel
个对象不兼容。
您最好使用首选的textRectForBounds:limitedToNumberOfLines:
方法:
+ (CGFloat)heightWithText:(NSString *)text
{
resizingLabel.text = text;
CGSize labelSize = [resizingLabel textRectForBounds:CGRectMake(0.0, 0.0, LABEL_WIDTH, CGFLOAT_MAX)
limitedToNumberOfLines:0].size; // No limit
return (TOP_MARGIN + labelSize.height + BOTTOM_MARGIN);
}
答案 1 :(得分:4)
+ (CGFloat)heightWithText:(NSString *)text
{
SizingLabel.text = text;
CGSize labelSize = [SizingLabel sizeThatFits:CGSizeMake(LABEL_WIDTH, CGFLOAT_MAX)];
return (TOP_MARGIN + labelSize.height + BOTTOM_MARGIN);
}
答案 2 :(得分:3)
在自定义单元格类中执行此操作:
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
// Initialization code
//Message Label
lbl_name = [[UILabel alloc]initWithFrame:CGRectMake(10, 10, 300, 25)];
[lbl_name setFont:[UIFont fontWithName:@"Helvetica" size:16.0f]];
lbl_name.lineBreakMode = UILineBreakModeWordWrap;
lbl_name.numberOfLines = 0;
[lbl_name sizeToFit];
[self.contentView addSubview:lbl_name];
//Time
}
return self;
}
-(void)resizeNameLabel:(NSString *)text
{
CGSize constraint = CGSizeMake(300 , 20000.0f);
CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:16.0f] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap];
[lbl_name setFrame:CGRectMake(10, 5, 300, MAX(size.height, 25.0f))];//300 Label Width
[lbl_name setText:text];
}
在主要课程中这样做..
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
if (cell == nil)
{
cell = (CustomCell *)[[CustomCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"cell"];
}
[((CustomCell *)cell) resizeNameLabel:text];
return cell;
}
就这样做......
答案 3 :(得分:0)
下面的代码是计算动态文本长度的矩形(ios7版本)
- (CGRect)labelFrameWithText:(NSString *)text
{
CGRect rect;
// the font of your text
UIFont *font = [UIFont systemFontOfSize:15.0];
NSDictionary *attributes = @{NSFontAttributeName: font};
// the first parametric CGSize is the max size that the rect's size can be
CGRect boundingRect = [text boundingRectWithSize:CGSizeMake(youImageWidth, 100.0)
options:NSStringDrawingUsesLineFragmentOrigin
attributes:attributes
context:nil];
//the rect of the UILabel
//This method returns fractional sizes (in the size component of the returned CGRect); to use a returned size to size views, you must use raise its value to the nearest higher integer using the ceil function.
rect = CGRectMake(yourLabelOriginX,
yourLabelOriginY,
ceil(boundingRect.size.width),
ceil(boundingRect.size.height));
return rect;
}
在你得到矩形之后,用它来计算你的细胞大小
----------------旧版本-------------------
CGSize contentSize = [content sizeWithFont:font
constrainedToSize:CGSizeMake(maxWidth, maxHeight)
lineBreakMode: NSLineBreakByWordWrapping];
答案 4 :(得分:0)
对于已归因于文本的UILabel的简单大小,我将此类别添加到UILabel。
@implementation UILabel (PAUtils)
- (CGSize)jb_attributedSizeThatFits:(CGSize)size
{
CGRect textRect = [self.attributedText boundingRectWithSize:size options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading) context:nil];
return textRect.size;
}
@end
有两点需要注意:
attributedText
(而只是使用text
),则此方法不会考虑numberOfLines
属性。boundingRectWithSize
返回分数。如果您使用此方法返回的值进行布局,则宽度和高度可能应为ceilf
。