2014-04-22 107 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,它總是計算,對高度(或大小)進行緩存。確保每個文本只計算一次,這樣會更好。

相關問題