2011-10-04 3 views
8

나는 며칠 동안이 질문에 좌절감을 나타 냈습니다. UITableViewCell에 UILabel을 추가하려고합니다. 나는 UILabel이 셀의 전체 너비에 걸쳐, 외모를 위해 오른쪽과 왼쪽 모두에서 5 또는 10을 빼기를 원합니다. 내 문제는 프로그래밍 방식으로 레이블을 배치 할 셀의 프레임 크기를 결정하는 것입니다. 어떤 UITableViewStyle을 사용하든 상관없이 cell.contentVew.frame.size.width 값은 셀 프레임 자체의 너비에 가깝지 않습니다.UITableViewCell 프레임 검색

CGRectMake(10, 12, 397, self.contentView.frame.size.height); 

그러나 그것의 :

예를 들어, 내가 건설하고있는 테이블에, 나는에 의해 (단지 시행 착오를 통해)있는 UITableViewCell을 서브 클래스 및 수동으로 결정 폭의 UILabel의를 만들어 내 원하는 결과를 얻을 수 있습니다 그 397 번호는 나를 괴롭 히고. 프로그래밍 방식으로 어떤 너비 테이블이나 스타일에 맞게 결정해야합니다. 이것은 셀의 전체 프레임 너비를 결정한 다음 UILabel의 가장자리가 실제로 셀의 가장자리에 닿지 않도록 10 또는 20을 뺀 간단한 프로세스 여야합니다. 나는 다음 시도 UITableViewStyleDefault에 tableViewStyle을 설정 한 경우

그러나 :

NSLog(@"Width: %f", self.contentView.frame.size.width); 

을 내가 다른 세 가지 스타일 중 하나에 스타일을 설정하면 내가 320를 얻을 반환 된 수는 심지어 320 302입니다 숫자는 셀 프레임의 너비에 가깝지 않습니다 (내 수동으로 결정된 397의 숫자와 마찬가지로).

액세스 할 필요가있는 값은 셀의 그리기 프레임의 전체 너비를 반환합니다. 나는 대부분의 어려움을 겪는 문제들과 마찬가지로 해결책이 나를 이마에 때 리고 싶어 할 것이지만, 지금 나는 그것을 준비하고있는 시점에 이르렀다.

편집 세부 정보 :

관심있는 사람에게 하나의 설명. 이 내 질문은 주로 그룹 스타일 테이블과 관련이 있습니다.

CGFloat cellWidth = [tableView rectForRowAtIndexPath:indexPath].size.width; 

의 I는 데 문제 rectForRowAtIndexPath 방법은 세포가있는 프레임의 폭을 반환한다는 것입니다 : 일반 스타일의 경우, 위의 제 질문에 대답하여 cellForRowAtIndexPath 방법으로 간단하게 측정 할 수 그 이유는 셀 너비가 프레임의 전체 너비이기 때문에 일반 스타일 테이블에서는 괜찮습니다. 그러나 그룹화 된 테이블에서 셀의 너비는 그릴 프레임의 너비보다 작으므로이 메서드는 셀 너비보다 약간 넓은 숫자를 반환합니다. 그룹화 된 표 스타일의 셀 너비가 표 프레임 너비보다 작은 고정 숫자 일 수 있으므로 문제를 해결하는 방법이 될 수 있습니다. 나는 그 사건을 조사 할 것이고 여기에 내 자신의 질문에 대답 할 것이다.

+0

위대한 질문 나는 똑같은 행동을 취하고 나를 괴롭힌다. 내 해결 방법은 프레임 크기를 고려하지 않고 하위 뷰 너비를 콘텐츠보기 크기의 백분율로 참조하는 것입니다.콘텐츠 뷰 프레임이 액세서리 (이동, 삭제, 공개 등) 용으로 예약 된 셀의 왼쪽과 오른쪽 영역을 제외하지만 셀 프레임이 항상 잘못된 크기를보고하는 이유에 대한 대답은 아직 확실하지 않습니다. . 희망을 갖고 누군가가 와서이 모든 것을 이해하게 될 것입니다. – Rog

+0

가로 모드입니까? –

+0

@Bartosz - 예를 들어 초상화에서 숫자를 얻습니다. – Chris

답변

8

나는 내 자신의 대답을 결정했으며, 같은 문제에 직면 한 사람을 돕기를 바랍니다. 그룹화 된 테이블의 여백 계산하기 내가 찾은보기 this StackOverflow answer.

이 코드는 셀의 두 가장자리 사이에 여백을두고 셀 내에 수직으로 가운데에 맞춘 레이블을 tableView 셀에 제공합니다.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{  
    static NSString *CellIdentifier = @"Cell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    UILabel *label; 
    CGFloat groupedStyleMarginWidth, tableViewWidth; 
    UIFont *labelFont = [UIFont boldSystemFontOfSize:17.0]; // Set to whatever you like 
    NSString *labelText = @"Test String"; 

    // Calculate the margin between the cell frame and the tableView 
    // frame in a grouped table view style. 
    tableViewWidth = tableView.frame.size.width; 
    if (tableView.style == UITableViewStyleGrouped) { 
     if (tableViewWidth > 20) 
      groupedStyleMarginWidth = (tableViewWidth < 400) ? 10 : MAX(31, MIN(45, tableViewWidth*0.06)); 
     else 
      groupedStyleMarginWidth = tableViewWidth - 10; 
    } 
    else 
     groupedStyleMarginWidth = 0.0; 

    if (cell == nil) { 
     CGRect tableViewRect; 
     CGRect labelRect; 
     CGFloat x, y, w, h, labelMargin; 

     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 

     // Retrieve the rect of the table view. 
     tableViewRect = [tableView rectForRowAtIndexPath:indexPath]; 

     // Set whatever margin around the label you prefer. 
     labelMargin = 10; 

     // Determine rect values for the label. 
     x = tableRect.origin.x + labelMargin; 

     // Calculate width of label 
     w = tableRect.size.width - (groupedStyleMargin * 2) - (labelMargin * 2); 

     // Calculate height of table based on font set earlier. 
     h = [labelText sizeWithFont:font].height; 

     // Calculate y position for the label text baseline to center 
     // vertically within the cell. 
     y = (tableRect.origin.y/2) - (h/4); 

     labelRect = CGRectMake(x, y, w, h); 

     label = [[UILabel alloc] initWithFrame:labelRect]; 
     label.text = labelText; 
     label.tag = 0; 
     [cell.contentView addSubview:stepLabel]; 
     [label release]; 
    } 
    else { 
     label = (UILabel *)[cell viewWithTag:0]; 
    } 
1

이 같은 소리는 요즘에는 자동 레이아웃 제약 조건에 의해 가장 잘 처리됩니다.