UITableViewCell의 배경색을 사용자 정의하는 방법은 무엇입니까?


188

내 UITableView 내의 모든 UITableViewCells의 배경 (및 테두리도)을 사용자 정의하고 싶습니다. 지금 까지이 물건을 사용자 정의 할 수 없었으므로 기본값 인 흰색 배경 셀이 많이 있습니다.

iPhone SDK로 이것을 수행하는 방법이 있습니까?

답변:


193

셀 contentView의 backgroundColor를 색상으로 설정해야합니다. 액세서리 (공개 화살표 등)를 사용하는 경우 액세서리가 흰색으로 표시되므로 사용자 정의 버전을 롤해야 할 수 있습니다.


108
예 : myCell.contentView.backgroundColor = [UIColor greenColor];
JoBu1324

1
vlado.grigorov의 답변이 더 유연합니다-William Denniss의 답변 참조
JoBu1324

3
UITableViewCellAccessoryCheckmark예를 들어 자신의 롤링 방법에 대한 링크가 있습니까? 감사.
Dan Rosenstark

6
때때로 그것을 확인하려면 다음을 설정해야합니다.cell.textLabel.backgroundColor = [UIColor clearColor];
Evan Moran

205

다음은이 문제를 해결하기 위해 가장 효율적인 방법입니다. willDisplayCell 대리자 메서드를 사용하십시오 (cell.textLabel.text 및 / 또는 cell.detailTextLabel.text를 사용할 때 텍스트 레이블 배경의 흰색을 처리합니다) ) :

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { ... }

이 대리자 메서드를 호출하면 다음과 같이 셀 색상이 테이블 뷰가 아닌 셀을 통해 제어됩니다.

- (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath { ... }

따라서 셀 대리자 메서드의 본문 내에서 다음 코드를 추가하여 셀의 색상을 바꾸거나 함수 호출을 사용하여 테이블의 모든 셀을 동일한 색상으로 만듭니다.

if (indexPath.row % 2)
{
    [cell setBackgroundColor:[UIColor colorWithRed:.8 green:.8 blue:1 alpha:1]];
}
else [cell setBackgroundColor:[UIColor clearColor]];

이 솔루션은 내 환경에서 잘 작동했습니다 ...


이것은 더 깨끗한 솔루션입니다. 다른 솔루션의 대부분은 UITableViewCell을 서브 클래 싱해야합니다. vlado.grigorov의 솔루션이 작동하지 않습니다.
Ronnie Liew

실제로, 이것은 내가 본 다양한 WWDC 프레젠테이션에 따라 Apple이 권장하는 방법입니다.
Mike Weller

니스-목록 맨 위에 새 행을 추가해야하는 경우 제외 이 방법은 모든 추가를 동일한 색상으로 만듭니다. 새로 고침은 문제를 해결하지만 불필요한 시간이 걸립니다. 어제 알아 낸 ...
JOM

Core Data를 사용할 때를 제외하고는 잘 작동하는 것 같습니다. NSFetchedResultsController를 통해 추가 된 새 셀은 willDisplayCell을 올바르게 호출하지 않는 것 같습니다. 나는 그것을 잃어
버렸다

Swift 2.0에서 배경색을 설정하는 해당 줄 :cell.backgroundColor = UIColor.clearColor
kbpontius

104

OS 3.0은 willDisplayCell 메소드에서 셀의 배경색을 설정하기 때문에 이것은 매우 간단합니다. cellForRowAtIndexPath에서 색상을 설정하지 않아야합니다.

이것은 일반 스타일과 그룹화 스타일 모두에서 작동합니다.

암호:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    cell.backgroundColor = [UIColor redColor];
}

추신 : 여기 willDisplayCell에 대한 문서 추출 :

"테이블보기는 셀을 사용하여 행을 그리기 직전에이 메시지를 대리자에게 전송하므로 대리자가 셀 개체를 표시하기 전에 사용자 지정할 수 있습니다.이 방법을 사용하면 대리자가 이전에 설정 한 상태 기반 속성을 재정의 할 수 있습니다. 선택 및 배경색과 같은 테이블보기. 대리자가 반환 한 후 테이블보기는 알파 및 프레임 속성 만 설정 한 다음 행이 슬라이드 아웃 또는 슬라이드 아웃 될 때에 만 애니메이션을 적용 할 때만 설정합니다. "

이 게시물 에서이 정보 를 colionel에서 찾았습니다 . 감사합니다!


3
공개 정보가있는 경우 아무 것도 할 필요가
없으므로

1
테이블 뷰 배경과 다른 셀 배경색을 원하는 경우 작동하지 않습니다.
Chris

그룹 세포의 경우, cellForRow에 설정할 수 있습니다
Sharen Eayrs

58

지금까지 찾은 가장 좋은 방법은 셀의 배경보기를 설정하고 셀 하위보기의 명확한 배경을 설정하는 것입니다. 물론 이것은 액세서리의 유무에 관계없이 색인 스타일 만있는 테이블에서 멋지게 보입니다.

다음은 셀의 배경이 노란색으로 패닝 된 샘플입니다.

UIView* backgroundView = [ [ [ UIView alloc ] initWithFrame:CGRectZero ] autorelease ];
backgroundView.backgroundColor = [ UIColor yellowColor ];
cell.backgroundView = backgroundView;
for ( UIView* view in cell.contentView.subviews ) 
{
    view.backgroundColor = [ UIColor clearColor ];
}

1
이렇게하면 opaque 속성도 NO로 설정해야합니다.
릴리 발라드

11
투명 셀 컨트롤을 사용하는 것은 실제로 권장되지 않습니다. 스크롤 성능은 많은 영향을 받기 때문에 Apple은 항상 불투명 컨트롤을 사용한다고 말합니다.
Mike Weller

3
iOS 4.2 이상에서는 루프가 더 이상 필요하지 않은 것처럼 보입니다.
Frank Schmitt

아주 좋아요 액세서리 뷰를 사용할 때 완벽하게 작동합니다 !!
RyanG

19

이것을 UITableView 델리게이트 클래스 파일 (.m)에 넣으십시오.

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell  forRowAtIndexPath:(NSIndexPath *)indexPath 
{
    UIColor *color = ((indexPath.row % 2) == 0) ? [UIColor colorWithRed:255.0/255 green:255.0/255 blue:145.0/255 alpha:1] : [UIColor clearColor];
    cell.backgroundColor = color;
}

7

Seba와 동의하며 rowForIndexPath 대리자 메소드에서 대체 행 색상을 설정하려고했지만 3.2와 4.2 사이의 결과가 일치하지 않았습니다. 다음은 저에게 효과적이었습니다.

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {

    if ((indexPath.row % 2) == 1) {
        cell.backgroundColor = UIColorFromRGB(0xEDEDED);
        cell.textLabel.backgroundColor = UIColorFromRGB(0xEDEDED);
        cell.selectionStyle = UITableViewCellSelectionStyleGray;
    }
    else
    {
        cell.backgroundColor = [UIColor whiteColor];
        cell.selectionStyle = UITableViewCellSelectionStyleGray;
    }

}

1
willDisplayCell에서 설정하는 것이 왜 다른지 여전히 이해하지 못합니다. 어쨌든 우리가 올바르게 구현했는지 여부를 불렀습니까?
공유 Eayrs

6

다른 모든 솔루션을 시도한 후 다음 방법이 가장 우아합니다. 다음 델리게이트 방법에서 색상을 변경하십시오.

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (...){
        cell.backgroundColor = [UIColor blueColor];
    } else {
        cell.backgroundColor = [UIColor whiteColor];
    }
}

4

vlado.grigorov는 좋은 조언을 가지고 있습니다. 가장 좋은 방법은 backgroundView를 만들고 색상을 지정하여 다른 모든 것을 clearColor로 설정하는 것입니다. 또한 그 방법이 색상을 올바르게 지우는 유일한 방법이라고 생각합니다 (샘플을 시도하지만 'yellowColor'대신 'clearColor'를 설정하십시오).


이 방법의 장점은 Interface Builder에서 색상을 디자인 타임 속성으로 유지할 수 있다는 것입니다. 개발자 상호 작용이 필요한 하나의 적은 디자인 문제.
whitneyland

1
cell.backgroundView = [[[UIView alloc] initWithFrame : cell.bounds] 자동 릴리스]; cell.backgroundView.backgroundColor = [UIColor redColor];
Brian

3

테이블 뷰 셀의 배경을 사용자 정의하면 결국 "전부 또는 전무"방식이됩니다. 내용 셀의 배경에 사용되는 색상이나 이미지를 이상하게 보이지 않게 변경하는 것은 매우 어렵습니다.

그 이유는 셀이 실제로 뷰의 너비에 걸쳐 있기 때문입니다. 둥근 모서리는 그리기 스타일의 일부이며 컨텐츠 뷰는이 영역에 있습니다.

내용 셀의 색상을 변경하면 모서리에 흰색 비트가 표시됩니다. 전체 셀의 색상을 변경하면보기 너비에 걸쳐 색상 블록이 생깁니다.

셀을 사용자 정의 할 수는 있지만 처음에 생각하는 것만 큼 쉽지는 않습니다.


1
이것은 그룹화 된 테이블의 셀에 대해서는 사실이지만 일반 테이블은 걱정할 필요가 없습니다. 액세서리가없는 독창적 인 셀은 잘 보입니다.
벤 고 틀 리프

벤-좋은 지적입니다. 나는 주로 그룹화 된 테이블을 사용하지만 일반 테이블을 언급 할 때 이러한 문제로 고통받지 않습니다.
앤드류 그랜트

3

보기를 작성하고이를 셀의 배경보기로 설정하십시오.

UIView *lab = [[UIView alloc] initWithFrame:cell.frame];
            [lab setBackgroundColor:[UIColor grayColor]];
            cell.backgroundView = lab;
            [lab release];

3

N.Berendt의 답변을 확장하려면-실제 셀 데이터 객체의 일부 상태를 기반으로 셀 색상을 설정하려는 경우 일반적으로 테이블 셀에 대한 나머지 정보를 구성 할 때 cellForRowAtIndexPath 메서드를 사용하면 willDisplayCell 메서드를 재정 의하여 내용보기 배경색에서 셀 배경색을 설정 하여이 작업을 수행 할 수 있습니다. 공개 버튼 배경 등의 문제가 발생하지 않지만 cellForRowAtIndexPath 메서드에서 색상을 제어 할 수 있습니다 다른 모든 셀 커스터마이제이션을 수행하는 곳.

따라서 :이 방법을 테이블 뷰 대리자에 추가하면 :

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    cell.backgroundColor = cell.contentView.backgroundColor;
}

그런 다음 cellForRowAtIndexPath 메소드에서 다음을 수행 할 수 있습니다.

if (myCellDataObject.hasSomeStateThatMeansItShouldShowAsBlue) {
    cell.contentView.backgroundColor = [UIColor blueColor];
}

이렇게하면 willDisplayCell 메소드에서 데이터 오브젝트를 다시 검색하지 않아도되며 테이블 셀의 조정 / 사용자 정의를 수행하는 두 곳의 위치도 저장됩니다. 모든 사용자 정의는 cellForRowAtIndexPath 메소드에서 수행 할 수 있습니다.


3

Photoshop 또는 gimp에서 배경으로 사용할 이미지를 만들어 myimage로 이름을 지정하십시오. 그런 다음이 메소드를 tableViewController 클래스에 추가하십시오.

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    UIImage *cellImage = [UIImage imageNamed:@"myimage.png"];//myimage is a 20x50 px with  gradient  color created with gimp
    UIImageView *cellView = [[UIImageView alloc] initWithImage:cellImage];
    cellView.contentMode = UIContentViewModeScaleToFill;
    cell.backgroundView = cellView;
    //set the background label to clear
    cell.titleLabel.backgroundColor= [UIColor clearColor];
}

속성 관리자에서 UITableView를 custom으로 설정 한 경우에도 작동합니다.


2

내 해결책은 cellForRowAtIndexPath 이벤트에 다음 코드를 추가하는 것입니다.

UIView *solidColor = [cell viewWithTag:100];
if (!solidColor) {

    solidColor = [[UIView alloc] initWithFrame:cell.bounds];
    solidColor.tag = 100; //Big tag to access the view afterwards
    [cell addSubview:solidColor];
    [cell sendSubviewToBack:solidColor];
    [solidColor release];
}
solidColor.backgroundColor = [UIColor colorWithRed:254.0/255.0
                                             green:233.0/255.0
                                              blue:233.0/255.0
                                             alpha:1.0];

공개 버튼으로도 모든 상황에서 작동하며 cellWillShow 이벤트보다 cellForRowAtIndexPath의 셀 색상 상태에서 논리가 더 잘 작동합니다.


1

UITableViewCell을 서브 클래스로 구현에 추가하십시오 :

-(void)layoutSubviews
{
    [super layoutSubviews];
    self.backgroundColor = [UIColor blueColor];
}

1
    UIView *bg = [[UIView alloc] initWithFrame:cell.frame];
    bg.backgroundColor = [UIColor colorWithRed:175.0/255.0 green:220.0/255.0 blue:186.0/255.0 alpha:1]; 
    cell.backgroundView = bg;
    [bg release];

1

이것은 최신 Xcode에서 작동합니다.

-(UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath {
    cell.backgroundColor = [UIColor grayColor];
}

0

이 시도:

- (void)tableView:(UITableView *)tableView1 willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    [cell setBackgroundColor:[UIColor clearColor]];
    tableView1.backgroundColor = [UIColor colorWithPatternImage: [UIImage imageNamed: @"Cream.jpg"]];
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.