UITableViewCell은 흰색 배경을 표시하며 iOS7에서 수정할 수 없습니다


186

에서 상속하는 사용자 정의 테이블 뷰 셀 클래스를 구현했습니다 UITableViewCell. 테이블 뷰에는 배경 이미지가 포함되어 있으므로 셀의 배경을 투명하게 만들고 싶습니다. iOS7 이전에는 멋지게 보입니다.

그러나 iOS7에서는 셀이 항상 흰색 배경으로 표시됩니다.


Xcode7, 2015 에서도 스토리 보드에 버그 가 있습니다. 코드에서 셀의 배경색을 설정해야합니다.


속성 배경색에 액세스하여 셀의 배경색을 직접 변경할 수 있습니다. cell.backgroundColor = [UIColor clearColor];
ViruMax

답변:


384

Apple DOC가 말했듯이 ( UITableViewCell 클래스 참조 ) :

... iOS 7에서 셀은 기본적으로 흰색 배경을 갖습니다 . 이전 버전의 iOS에서는 셀이 둘러싸는 테이블보기의 배경색을 상속합니다. 셀의 배경색을 변경하려면 테이블 뷰 대리자 의 tableView : willDisplayCell : forRowAtIndexPath : 메서드에서 변경하십시오.

따라서 투명한 배경으로 셀을 표시하려면 아래처럼 테이블보기 컨트롤러에서 대리자 메서드를 구현하면됩니다.

- (void)tableView:(UITableView *)tableView
  willDisplayCell:(UITableViewCell *)cell
forRowAtIndexPath:(NSIndexPath *)indexPath
{
  [cell setBackgroundColor:[UIColor clearColor]];
}

참고 : @null이 말했듯이 "... 인터페이스 빌더에는 버그가있는 것 같습니다 ..."라고 버그가 있는지 완전히 확신하지 못하지만 그의 의견이 여러 번 투표를 한 것으로 보입니다. 따라서 IB를 사용하면 문제가있을 수 있습니다. :)


53
불행히도 사실이 아니므로 인터페이스 빌더에 버그가있는 것처럼 보이며 스토리 보드에서 내 사용자 정의 셀로 설정할 수 없습니다.
Tarek Hallak

1
@null, aha, iOS 7 SDK에는 여전히 많은 버그 수정이 필요한 것 같습니다. 나는 이미 일부를 만났지만 스토리 보드와 관련하여 나는 모른다. :)
Kjuly

4
tableView:cellForRowAtIndexPath:메소드 에서이 작업을 수행 할 수도 있습니다 .
bugloaf

1
@KendallHelmstetterGelner 확실합니까? 아직 눈치 채지 못했지만 여전히 저에게 효과적입니다. :)
Kjuly

1
bugloaf가 위에서 말했듯이 tableView : cellForRowAtIndexPath에서 수행하십시오.
amergin

66

나는 그것을 조금 조사하고 셀 backgroundColor가 Appearance 시스템에 의해 설정되어 있음을 알았습니다. 따라서 응용 프로그램의 모든 셀에 명확한 배경이 있으면 가장 쉬운 해결책은 다음과 같습니다.

[[UITableViewCell appearance] setBackgroundColor:[UIColor clearColor]];

배경이 다른 경우에도 기본 색상으로 선명한 색상이 가장 편리한 것 같습니다.


1
당신은 내 친구는 괴물입니다. 나는 내 서브 클래스를 모두 서브 클래스 화 UITableViewCell했으므로 BG 색상을로 설정하기 위해 이니셜 라이저를 슈퍼 클래스에 제공하는 것이 문제가되지 clearColor않았지만 무엇을 추측합니까? 그건 효과가 없었어 .. 왜 애플?
Mazyod

작동합니다. 그러나 흰색이 보이지 않습니다. 최상의 효과를 위해 최고 반응을 보였습니다 (팝핑 없음).
Carl Prehn

@Anton Filimonov 이제 특정 viewController에서 Appdelegate의 테이블 뷰 셀 모양을 설정했습니다.이 시나리오에 어떻게 접근 할 수 있습니까? CellWillDisplay 대리자 메서드에서 다른 색상을 설정하려고했지만 효과가 없습니다. 이에 도움을 나를 기쁘게 할 수
피어 모하메드 Thabib

@PeerMohamedThabib 환경 (iPad / iPhone, iOS 버전)에 대해 좀 더 이야기하고 코드를 제공해주세요. 실제로 상황을 직접 조사 할 수 있습니다 .UITableViewCell의 하위 클래스를 만들고 setBackgroundColor : 메소드를 재정의하고 (내부에서 슈퍼 클래스 구현을 호출 함)이 메소드에 중단 점을두면 설정 후 셀 색상이 어떻게 바뀌는 지 볼 수 있습니다. inside tableView : willDisplayCellAtIndexPath :
Anton Filimonov

1
셀이 혼합되어 있어도 일부는 배경이 있고 일부는 (투명한) 것이 없습니다. 가장 쉬운 방법은 사용자 정의 클래스를 정의하고 동일한 코드를 작성하는 것입니다. 이런 식으로 모든 UITableViewCell 클래스는 모두 기본 상태로 유지되며 사용자 정의 클래스는 선명한 색상을 갖습니다. [[CustomTableCell 모양] setBackgroundColor : [UIColor clearColor]]; 이는 충분한 UITableViewCells에는 영향을 미치지 않으며 사용자 정의 셀에만 영향을 미칩니다.
Ansari

30

셀을 리턴하기 전에 cellForRowAtIndexPath 메소드에이를 작성하십시오.

cell.backgroundColor = [UIColor clearColor];

1
이것은 iPhone 5의 iOS 8에서 문제를 해결하는 데 도움이되었습니다.
Almo

13

UITableViewCelliOS 7에서 의 기본 배경색 은 흰색입니다.

backgroundColor코드 어딘가에 속성 을 설정 해야합니다. 예를 들어, 셀을 새로 만든 후에 설정하십시오.

cell.backgroundColor = [UIColor clearColor];

나는 시도했지만 그것은 효과가 없었다. 그것이 효과가 있습니까?
Matrosov Alexander

initWithCoder : aDecoder 메소드의 사용자 정의 테이블 뷰 셀에 적합합니다.
ftvs

13

실제로 UITableView의 배경색이 명확하게 설정되지 않았기 때문에 문제가 발생했습니다. UITableViewCell의 배경색을 지우고 여전히 흰색으로 표시되는 경우 UITableView의 배경색이 선명하게 (또는 원하는대로) 설정되어 있는지 확인하십시오.

[self.tableView setBackgroundView:nil];
[self.tableView setBackgroundColor:[UIColor clearColor]];

스위프트에서

tableView.backgroundView = nil
tableView.backgroundColor = UIColor.clearColor()

참고로 IB에서도 설정할 수 있습니다. 눈에 띄는 영향을 미치지 않는 '테이블 뷰'섹션뿐만 아니라 '뷰'섹션 내에서 배경색을 변경하십시오.
AndyDunn

1
이것도 저에게 효과적이었습니다. 나는 그것의 신속한 버전을 찾고있었습니다. 코드에서 나를 위해 일한 것을 추가했습니다 :)
Mugunthan Balakrishnan

10

이것은 분명히 iOS 버그입니다. iOS 8에서 배경색을 설정 Interface Builder하면 iPhone에서 잘 작동하지만 iPad에서는 항상 그렇습니다 whiteColor. 이를 수정하려면 cellForIndexPath데이터 소스 메시지에서 다음을 입력하십시오.

cell.backgroundColor = cell.backgroundColor

그리고 작동합니다. 이것이 바로 코드 자체가 거의 엉터리이기 때문에 버그라고 말한 이유입니다.하지만 작동합니다.


여전히 Xcode7 / iOS9의 경우입니다. 위에서 제안한대로 tableView : willDisplayCell : forRowAtIndexPath에 명시 적 코드를 추가했습니다.
Andrew Duncan

XCode 7.0.1에서 범용 앱을 컴파일하면 iOS 7,8,9를 실행하는 iPhone의 경우 검은 색 배경, iOS 9.0.2를 실행하는 iPad의 경우 흰색 배경 (및 아마도 확인할 수는 없음)이 표시됩니다. 위의 코드는 그것을 수정했습니다.
ScottyB

정적 tableView의 경우 cell.backgroundColor = UIColor.clearColor ()로 willDisplayCell을 재정의합니다. IB에서 색상 설정을 다시 할당해도 효과가 없었습니다.
Viktor Kucera

4

기본적으로 UITableViewCell이 선택되어있을 수 있습니다. Xcode 6s의 새로운 시각적 디버거를 사용하여이를 확인할 수 있습니다 (또는이 화이트 셀이 나타나는 원인을 정확히 알 수 있음).

여기에 이미지 설명을 입력하십시오

흥미롭게도 이것을 알고 난 후에 .. 선택한 셀의 배경색을 지워도 여전히 작동하지 않습니다. 더 많은 연구를 수행하면이 사용자 정의 셀을 만들 때 선택 스타일을 수정해야한다는 것이 밝혀졌습니다.

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        // do customization here
    }
    self.selectionStyle = UITableViewCellSelectionStyleNone;
    [self setBackgroundColor:[UIColor clearColor]];
    return self;
}

비주얼 디버거에 대한 링크
끊기

3

위의 어느 것도 XCode 5.1.1, iOS 7.1에서 작동하지 않는다는 것을 알았습니다.

프로토 타입 셀과 함께 인터페이스 빌더를 사용하는 경우 프로토 타입 셀을 선택한 다음보기 섹션의 속성 선택기에서 배경 양식 기본값을 선명한 색상으로 변경하십시오.

여기에 이미지 설명을 입력하십시오

이것은 잘 작동하는 것 같습니다. 위의 코드 변경은 필요하지 않습니다. 순수한 IB 솔루션입니다.


2

수락 된 답변으로 문제가 해결되지 않았습니다. 나는 이것을해야했다.

  1. 인터페이스 빌더에서 테이블보기를 선택하십시오. 그런 다음 속성 관리자의 보기 섹션에서 배경 을 투명 (0 % 불투명도)으로 설정합니다.

여기에 이미지 설명을 입력하십시오

  1. 테이블의 데이터 소스 클래스 cellForRowAtIndexPath 메소드에서 다음을 수행하십시오.

    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
        reuseIdentifier:CellIdentifier];
    cell.backgroundColor = [UIColor clearColor]; //Make cell transparent

글쎄, 당신은 인터페이스 빌더 .. @null이 내 답변 아래에 언급 한 것처럼“인터페이스 빌더에는 버그가있는 것 같습니다 ...” , 버그가 있는지 확실하지 않지만 그 원인은 다음과 같습니다. 의견이 여러 표를 얻었습니다. ;)
Kjuly

투명 셀 배경과 관련하여 iOS7의 무언가는 분명히 버그가 있습니다. 내 대답이 나와 비슷한 상황에 처한 다른 사람들을 도울 수 있기를 바랍니다.
RajV

특히 인터페이스 빌더 / 스토리 보드를 사용하는 경우 테이블 뷰에 대한 셀을 작성하는 올바른 방법이 아닙니다. 코드 스 니펫에서는 대리인이 요청할 때마다 새 셀을 만들고 있습니다. 이는 재사용이 아닙니다! 셀 재사용의 성능 이점을 얻으려면을 사용해야합니다 cell = [tableView dequeueReusableCellWithIdentifier:<#Reuse ID#> forIndexPath:indexPath]. 이전 버전에서는 indexPath 인수를 삭제 한 다음 nil을 테스트 initWithStyle:reuseIdentifier하여 nil의 경우 코드 스 니펫에 따라 인스턴스화 합니다.
ikuramedia

ikuramedia : 재사용 코드를 내 게시물에서 제외했습니다. 물론 세포를 재사용합니다. 그것은이 포스트의 요점이 아닙니다.
RajV

2

내가 설정 cell.backgroundColor = cell.contentView.backgroundColor; 에 하나 tableView:willDisplayCell:forRowAtIndexPath:또는 tableView:cell:forRowAtIndexPath:그 일을했다.

Interface Builder에서 contentView의 배경색을 원하는대로 설정했기 때문입니다.


1

셀에 UI 객체를 추가 할 때 Xcode 5 / IOS 7은 셀에있는 모든 요소의 슈퍼 뷰가 될 새로운 "컨텐츠 뷰"를 추가합니다. 셀의 배경색을 설정하려면이 컨텐츠 뷰의 배경색을 설정하십시오. 위의 솔루션은 저에게 효과가 없었지만이 솔루션은 저에게 효과적이었습니다.


컨텐츠 뷰는 이전 SDK 버전에서도 사용 가능하며 셀의 백그라운드 뷰를 포함하는 컨텐츠 뷰의 배경색 만 설정하면됩니다.
Kjuly

xcode 5 이전의 인터페이스 빌더에서는 자동으로 팝업되지 않습니다. 요점이 정확히 무엇입니까?
DrBug

내 질문이 아닌 다른 문제에 대한 귀하의 답변에 대해 논의했습니다. 셀의 배경색을 설정하고 싶습니까? 따라서 iOS 7에서 기본적으로 셀의 배경이 흰색인지 여부에 관계없이 항상 내용보기의 색상을 설정하여 구현할 수 있으며 내용보기가 셀의 배경보기 위에 놓입니다. 말이 되나요? ;)
Kjuly

1

스위프트 1.2 솔루션 :

다음과 같이 셀의 배경색에 대한 명시 적 정의를 추가하십시오.

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    // Configure the cell...
    cell.backgroundColor = UIColor.clearColor()

    return cell
}

죄송합니다. 내 잘못이야 효과가있다. 다른 설정을 놓쳤습니다.
Sung Kim

1

비슷한 문제가 있었어요

  1. selectionStyle로 파란색을 설정하고
  2. 이것을 코드에 추가하여 수정하십시오.

    override func tableView(tableView: UITableView, shouldHighlightRowAtIndexPath indexPath: NSIndexPath) -> Bool {
    
      var bgColorView: UIView = UIView()
      bgColorView.backgroundColor = UIColor(red: (76.0 / 255.0), green: (161.0 / 255.0), blue: (255.0 / 255.0), alpha: 1.0)
      bgColorView.layer.masksToBounds = true
      tableView.cellForRowAtIndexPath(indexPath)!.selectedBackgroundView = bgColorView
      return true
    }

0

UITableView 셀을 유리하게 만들기 위해 색상 코드를 사용할 수도 있습니다.

[cell setBackgroundColor:[self colorWithHexString:@"1fbbff"]];

다음은 색상 코드 방법을 적용하는 코드입니다.

-(UIColor*)colorWithHexString:(NSString*)hex
{
    NSString *cString = [[hex stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] uppercaseString];


    if ([cString length] < 6) return [UIColor grayColor];

    if ([cString hasPrefix:@"0X"]) cString = [cString substringFromIndex:2];

    if ([cString length] != 6) return  [UIColor grayColor];

    NSRange range;
    range.location = 0;
    range.length = 2;
    NSString *rString = [cString substringWithRange:range];

    range.location = 2;
    NSString *gString = [cString substringWithRange:range];

    range.location = 4;
    NSString *bString = [cString substringWithRange:range];

    unsigned int r, g, b;
    [[NSScanner scannerWithString:rString] scanHexInt:&r];
    [[NSScanner scannerWithString:gString] scanHexInt:&g];
    [[NSScanner scannerWithString:bString] scanHexInt:&b];

    return [UIColor colorWithRed:((float) r / 255.0f)
                         green:((float) g / 255.0f)
                          blue:((float) b / 255.0f)
                         alpha:1.0f];
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.