2014-04-22 216 views
0

根据文本长度,更改单元格高度时出现问题。我想使用此代码来计算单元格高度:根据文本长度更改单元格高度

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return [self dynamicHeightAtIndexPath:indexPath] + 32; 
} 

- (CGFloat)dynamicHeightAtIndexPath:(NSIndexPath *)indexPath 
{ 
    CGSize maximumSize = CGSizeMake(275, 9999); 
    UIFont *myFont = [UIFont fontWithName:@"Avenir-Light" size:15.0]; 
    CGSize stringsize = [[[self.userAdsArray objectAtIndex:indexPath.row] valueForKey:@"name"] 
         sizeWithFont:myFont 
         constrainedToSize:maximumSize 
         lineBreakMode:NSLineBreakByWordWrapping]; 
    return stringsize.height; 
} 

而且我已经得到了这些结果(从顶部5细胞被破坏):

enter image description here

+0

http://stackoverflow.com/questions/23077829/calculate-tableview-list-cell-height-to-fit-string/23080315#23080315 – Nick

回答

-1

请试试这个:

- (CGFloat)dynamicHeightAtIndexPath:(NSIndexPath *)indexPath 
{ 
    CGSize maximumSize = CGSizeMake(275, 9999); 
    UIFont *myFont = [UIFont fontWithName:@"Avenir-Light" size:15.0]; 

    NSString *text = [[self.userAdsArray objectAtIndex:indexPath.row] valueForKey:@"name"]; 
    CGFloat height = [text sizeWithFont:myFont constrainedToSize:maximumSize].height; 

    return height; 
} 
+0

sizeWithFont:constrainedToSize已弃用。 – Nick

+0

但它的工作原理。此外,它仅在iOS 7.0中被弃用。如果你需要支持iOS 6.0,我没有看到任何替代方案。 – Lebyrt

0

试试这个:

- (CGFloat)dynamicHeightAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSString *myText = [[self.userAdsArray objectAtIndex:indexPath.row] valueForKey:@"name"]; 
    CGRect textSize = [myText boundingRectWithSize:CGSizeMake(275.0f, CGFLOAT_MAX) 
         options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading 
         attributes:@{NSFontAttributeName: [UIFont fontWithName:@"Avenir-Light" size:15.0f]} 
         context:nil]; 
    return fabs(textSize.size.height); 
} 

不确定键@"name"的对象有什么类型,但上面的代码适用于NSString。因此该声明是为了清楚起见。

+0

不,这不能解决它。同样的问题正在发生。虽然谢谢! – lizbarrett

+0

然后检查你为Cell Label设置字体的位置,我怀疑你将它设置为[UIFont fontWithName:@“Avenir-Light”size:15.0]以外的东西;或者宽度可能不是275.0 – MDB983

+0

字体设置的唯一其他位置位于故事板上的动态原型单元格上。 – lizbarrett

0

我只是将文本高度计算函数包装为NSString的类别。

.h文件:

@interface NSString (Additions) 

- (CGSize)sizeWithFont:(UIFont *)font; 
- (CGSize)sizeWithFontSize:(float)fSize constrainedToSize:(CGSize)cSize; 
- (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)cSize; 

@end 

.m文件:

#import "NSString+Additions.h" 

#define kSystemVersion ([[UIDevice currentDevice] systemVersion].intValue) 

@implementation NSString (Additions) 

- (CGSize)sizeWithFont:(UIFont *)font 
{ 
    return [self sizeWithFont:font constrainedToSize:(CGSize) 
      {MAXFLOAT, MAXFLOAT}]; 
} 

- (CGSize)sizeWithFontSize:(float)fSize constrainedToSize:(CGSize)cSize 
{ 
    UIFont *font = [UIFont systemFontOfSize:fSize]; 
    return [self sizeWithFont:font constrainedToSize:cSize]; 
} 

- (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)cSize 
{ 
    if (kSystemVersion < 7) 
    { 
     CGSize size = [self sizeWithFont:font constrainedToSize:cSize 
         lineBreakMode:NSLineBreakByWordWrapping]; 
     return size; 
    } 
    else 
    { 
     NSDictionary *stringAttributes = @{NSFontAttributeName:font}; 
     CGRect rect = [self boundingRectWithSize:cSize 
         options:NSStringDrawingUsesLineFragmentOrigin | 
           NSStringDrawingUsesFontLeading 
         attributes:stringAttributes 
         context:nil]; 

     return rect.size; 
    } 
} 

@end 

然后,只需计算你想要的地方字符串的高度。如:

CGSize cSize = (CGSize){THE_LABEL_WIDTH_HERE, MAXFLOAT}; 
NSString *tmpString = @"Hello there. I'm junkor, and you can call me jun."; 

// will use the system font 
float height = [tmpString sizeWithFontSize:15 constrainedToSize:cSize].height; 

高度是你想要的。有时,当你计算文本的大小,你可以缓存大小为数据实体,如在tableView的委托功能:当你重新载入数据

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath; 

或滚动tableView,它总是计算,对高度(或大小)进行缓存。确保每个文本只计算一次,这样会更好。

相关问题