2013-03-27 2 views
0

각 필드의 텍스트 길이에 따라 동적으로 높이가 바뀌는 자막 스타일 UITableViewCell이 있습니다. 문제는 레이블에 여러 줄이 있으면 textLabel의 높이 (CGSize 크기)가 증가하지 않는다는 것입니다.NSString sizeWithFont : constrainedToSize : 잘못된 높이 계산

http://s10.postimg.org/6urher7s9/text_Label.png

이상한 제품은 detailTextLabel 높이가 정상적으로 (CGSize의 SIZE2)로 증가된다는 것이다. 두 높이를 계산하는 코드는 동일합니다.

cell.textLabel.numberOfLines = 0; 
cell.detailTextLabel.numberOfLines = 0; 

UPDATE : 덕분에 나는 또한 여러 줄을 지원하기 위해 cellForRowAtIndexPath에서 0 textLabel라는의 numberOfLines 속성을 모두 설정하고

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
    SETLISTFMNS0Song *song = [[[selectedSetlist.sets objectAtIndex:indexPath.section] songs]objectAtIndex:indexPath.row]; 
    CGSize size = [song.name sizeWithFont:[UIFont fontWithName:setlistFont size:labelFontSize] constrainedToSize:CGSizeMake(self.setsTable.bounds.size.width, CGFLOAT_MAX)]; 
    NSLog(@"Label: \"%@\" \tLabel Size: %f W %f H", song.name, size.width, size.height); 

    NSMutableString *detail; 
    if ([song cover]) { 
     detail = [[NSMutableString alloc] initWithFormat:@"(%@ cover)", [[song cover] name]]; 
    } 
    if ([song with]) { 
     if (!detail) { 
      detail = [[NSMutableString alloc] initWithFormat:@"(with %@)", [[song with] name]]; 
     } 
     else { 
      [detail appendFormat:@" (with %@)", [[song with] name]]; 
     } 
    } 
    if ([song info]) { 
     if (!detail) { 
      detail = [[NSMutableString alloc] initWithFormat:@"(%@)", [song info]]; 
     } 
     else { 
      [detail appendFormat:@" (%@)", [song info]]; 
     } 
    } 

    if (detail.length != 0) { 
     CGSize size2 = [detail sizeWithFont:[UIFont fontWithName:setlistFont size:detailFontSize] constrainedToSize:CGSizeMake(self.setsTable.bounds.size.width, CGFLOAT_MAX)]; 
     size.height += size2.height; 
     NSLog(@"Detail Label: \"%@\" \tDetail Label Size: %f W %f H", detail, size2.width, size2.height); 
    } 

    return size.height + 5; 
} 

: 여기

http://s21.postimg.org/m0af4gyw7/detail.png

내 기능입니다 @ josh에게 나는 왜 이것이 일어나고 있는지 이해합니다. 너비가 너무 넓은 UITableView 너비를 설정할 폭 제약이 있습니다. 누구든지 그것이 만들어지기 전에 UILabel의 너비를 찾는 방법을 알고 있습니까? 하아!

감사합니다.

+0

이미지 링크를 올리면 누군가가 당신을 대신해 돌봐 줄 것입니다. –

+0

@ A-Live 아이디어에 감사드립니다. 이미지가 업로드되었습니다. – AUSTOOO

답변

1

크기를 계산하는 문자열의 길이는 얼마나됩니까? 나는 당신이 sizeWithFont:constrainedToSize:이기 때문에 함수가 셀의 전체 너비를 제한하고 있기 때문에 물어 보지만 레이블은 아마도 셀의 전체 너비가 아닙니다.

내가 생각하는 바가 song.info은 줄이 셀의 전체 너비라면 한 줄에 들어갈 수있을만큼 짧으며 노래 detail은 길어서 올바른 줄 수를 계산할만큼 길다. 계산 된 높이를 초과 할만큼 길지는 않습니다.

모두 당신이해야 할 일은 너비가 textLabeldetailTextLabel인지 확인하고 그 값으로 제약 조건을 설정하는 것입니다.

업데이트 - 라벨을 계산하는 방법은 내부의 셀의 라벨의 폭 때문에

를 폭은 셀의 폭에 따라, 그리고 세포의이 시간 heightForRowAtIndexPath:에서 생성되지 않기 때문에라고 , 너비가 설정되기 전에 레이블의 너비를 알 수있는 방법을 찾아야합니다. 이렇게하는 유일한 방법은 너비를 직접 설정하는 것입니다. 여기에 내가 그것을 할 것입니다 방법은 다음과 같습니다

MyCell.h

#import <UIKit/UIKit.h> 

@interface MyCell : UITableViewCell 

+ (CGFloat)textLabelWidthForCellOfWidth:(CGFloat)cellWidth; 

@end 

MyCell.m

#import "MyCell.h" 

@implementation MyCell 

- (void)layoutSubviews { 
    [super layoutSubviews]; 

    CGRect frame = self.textLabel.frame; 
    frame.size.width = [MyCell textLabelWidthForCellOfWidth:self.frame.size.width]; 
    self.textLabel.frame = frame; 
} 

+ (CGFloat)textLabelWidthForCellOfWidth:(CGFloat)cellWidth { 
    // This calculation can be as complex as necessary to account for all elements that affect the label 
    return cellWidth - 20; 
} 

@end 

그런 다음 heightForRowAtIndexPath: 구현에 같은 클래스 메소드 호출 할 수 있습니다

:

CGFloat labelWidth = [MyCell textLabelWidthForCellOfWidth:self.tableView.frame.size.width]; // Since non-grouped cells are the full width of the tableView 
CGSize size2 = [detail sizeWithFont:[UIFont fontWithName:setlistFont size:detailFontSize] constrainedToSize:CGSizeMake(labelWidth, CGFLOAT_MAX)]; 

참조해야하는 각 레이블에 대해 별도의 클래스 메서드 (+)를 만듭니다.

+0

textLabel의 문자열은 노래 제목이기 때문에 길지 않습니다. 그러나 textLabel의 글꼴 크기는 현재 26.0이므로 크게 보입니다. 제약 폭을 textLabel의 너비로 변경했지만, textLabel이 생성되기 전에 (런타임 오류를 생성하기 위해) heightForRowAtIndexpath가 호출되어 하드 코딩하지 않고 너비에 액세스하는 방법이 있다고 생각하지 않습니까? 제안이 없다면? – AUSTOOO

+0

불행히도 당신이 옳습니다. 값을 하드 코딩하는 것이 가장 간단한 방법입니다. 당신은'UITableViewCell'을 서브 클래스 화하고 적절한 폭을 반환하는 클래스 메소드를 생성 한 다음'heightForRowAtIndexPath :'와'cellForRowAtIndexPath :'(또는 서브 클래스의'layoutSubviews' 메소드)에서 클래스 메소드를 사용할 수 있습니다. 당신이 원하는 것을하기 위해 필요한 것보다 일하는 것. 하드 코딩부터 시작하여 거기에서 성장할 것입니다. –

+0

당신의 초기 이론이 맞다고 생각합니다. 꽤 긴 노래 제목이있는 경우 올바르게 크기가 조정 된 것처럼 보입니다. textLabel의 너비에 액세스하는 방법을 찾으려고 노력할 것입니다. uitableviewcell을 서브 클래 싱하지 않고 잘하면. – AUSTOOO

0

코드를 보면 "lineBreakMode"를 정의 할 수 없다는 것을 알았습니다.

CGSize theSize = [song.name sizeWithFont:[UIFont fontWithName:setlistFont size:labelFontSize] constrainedToSize:CGSizeMake(self.setsTable.bounds.size.width, CGFLOAT_MAX) lineBreakMode:UILineBreakModeWordWrap]; 

코드를 업데이트하십시오. 나는 그것이 당신의 문제를 해결할 수 있기를 바랍니다. 행운을 빌어 요.

+0

답변 해 주셔서 감사합니다. 나는 또한 이전에 아무런 성공도 시도하지 않았다. – AUSTOOO

+0

UILable에 대해 lineBreakMode를 설정 했습니까? –

+0

특히 UILabel을 원하십니까? 아닙니다.이 메서드를 호출 할 때 아직 레이블이 만들어지지 않았습니다. – AUSTOOO

관련 문제