UITableViewCell pokazuje białe tło i nie można go modyfikować na iOS7

186

Zaimplementowałem niestandardową klasę komórek widoku tabeli, która dziedziczy UITableViewCell. Widok tabeli zawiera obraz tła, więc chcę, aby tło komórki było przezroczyste. Wygląda świetnie przed iOS7.

Jednak w iOS7 komórka jest zawsze wyświetlana z białym tłem.


Nawet w Xcode7, 2015 jest błąd w scenorysie : musisz ustawić kolor tła komórki w kodzie.

Kjuly
źródło
możesz bezpośrednio zmienić kolor tła komórki, uzyskując dostęp do jej koloru tła właściwości. cell.backgroundColor = [UIColor clearColor];
ViruMax,

Odpowiedzi:

384

Jak powiedział Apple DOC ( odniesienie do klasy UITableViewCell ):

... W iOS 7 komórki mają domyślnie białe tło ; we wcześniejszych wersjach iOS komórki dziedziczą kolor tła widoku otaczającej tabeli. Jeśli chcesz zmienić kolor tła komórki, zrób to w tableView: willDisplayCell: forRowAtIndexPath: metoda delegata widoku tabeli.

Więc w moim przypadku, aby wyświetlić komórki z przezroczystym tłem, wystarczy zaimplementować metodę delegowania w kontrolerze widoku tabeli, jak poniżej:

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

Uwaga : Jak powiedział @null: „... wydaje się, że w narzędziu do tworzenia interfejsów jest błąd ...” , nie jestem do końca pewien, czy zawiera błąd, ale wydaje się, że jego komentarz otrzymał kilka głosów. Więc może być coś nie tak, jeśli użyjesz IB. :)

Kjuly
źródło
53
Niestety nie jest prawdą, wydaje się, że w narzędziu do tworzenia interfejsów jest błąd i nie mogłem ustawić go w mojej komórce niestandardowej z scenorysu.
Tarek Hallak
1
@ null, aha, wygląda na to, że iOS 7 SDK wciąż ma wiele błędów, które wymagają naprawy. Niektóre już spotkałem, ale w przypadku Storyboard nie mam pojęcia. :)
Kjuly
4
Możesz to również zrobić w tableView:cellForRowAtIndexPath:metodzie.
bugloaf
1
@KendallHelmstetterGelner na pewno? Jeszcze tego nie zauważyłem, wydaje się, że nadal działa dla mnie. :)
Kjuly
1
Jak mówi bugloaf - zrób to w tableView: cellForRowAtIndexPath:
amergin
66

Zbadałem go trochę i odkryłem, że kolor tła komórki jest ustawiany przez system Wygląd. Jeśli więc wszystkie komórki w aplikacji mają czyste tło, najprostszym rozwiązaniem byłoby:

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

I nawet jeśli mają inne tło, wyraźny kolor wydaje się najwygodniejszy jako domyślny.

Anton Filimonov
źródło
1
Ty mój przyjacielu jesteś potworem. Podklasuję wszystkie moje UITableViewCell, więc nie było dla mnie problemem zapewnienie superklasy z inicjatorem, aby ustawić kolor BG clearColor, ale zgadnij co? To nie działało ... Mam na myśli, DLACZEGO APPLE?
Mazyod
To działa. Jednak biały kolor pojawia się poza polem widzenia. Poszedł z najlepszą reakcją na najlepszy efekt (bez popping).
Carl Prehn
@Anton Filimonov Ustawiłem wygląd komórki widoku tabeli w mojej Appdelegate teraz w konkretnym widoku Sterownik Chcę mieć inny kolor dla komórki jak mogę podejść do tego scenariusza? Próbowałem ustawić inny kolor w metodzie delegowania CellWillDisplay, ale bez efektu. Czy mógłbyś mi pomóc w tej sprawie
Peer Mohamed Thabib
@PeerMohamedThabib, powiedz więcej o środowisku (iPad / iPhone, wersja iOS) i podaj kod. I faktycznie możesz sam zbadać sytuację - po prostu stwórz podklasę UITableViewCell, ponownie zdefiniuj metodę setBackgroundColor: (po prostu wywołaj implementację superklasy wewnątrz) i umieść punkt przerwania dla tej metody, a zobaczysz, co zmienia kolor komórki po ustawieniu inside tableView: willDisplayCellAtIndexPath:
Anton Filimonov
1
Nawet jeśli masz mieszane komórki, niektóre z tłem, a niektóre bez (przezroczyste). Najłatwiejszym sposobem jest zdefiniowanie niestandardowej klasy i napisanie tego samego kodu. W ten sposób wszystkie klasy UITableViewCell pozostaną domyślne, a klasy niestandardowe będą miały wyraźny kolor. [[Wygląd CustomTableCell] setBackgroundColor: [UIColor clearColor]]; Nie wpłynie to na odrażające komórki UITableViewCell i wpłynie tylko na niestandardowe komórki.
Ansari
30

Napisz to w metodzie cellForRowAtIndexPath przed komórką zwrotną;

cell.backgroundColor = [UIColor clearColor];
Sanjana
źródło
1
Pomogło mi to z problemem w iOS 8 na iPhonie 5.
Almo
13

Domyślny kolor tła UITableViewCellw iOS 7 to biały.

Musisz ustawić backgroundColorwłaściwość gdzieś w swoim kodzie. Na przykład ustaw go po utworzeniu komórki.

cell.backgroundColor = [UIColor clearColor];
Yiming Tang
źródło
Próbowałem, ale to nie zadziałało. Jesteś pewien, że to działa?
Matrosov Alexander
Działa dla mnie dla niestandardowej komórki widoku tabeli w metodzie initWithCoder: aDecoder.
ftvs,
13

W rzeczywistości stwierdziłem, że problem powstał z powodu braku ustawienia tła koloru UITableView. Jeśli zmienisz kolor tła UITableViewCell na czysty i nadal widzisz biały, upewnij się, że kolor tła UITableView jest ustawiony na czysty (lub cokolwiek chcesz).

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

W Swift

tableView.backgroundView = nil
tableView.backgroundColor = UIColor.clearColor()
Endama
źródło
Tylko do Twojej wiadomości możesz to ustawić w IB. Upewnij się tylko, że zmieniłeś kolor tła w sekcji „Widok”, a nie tylko w sekcji „Widok tabeli”, która najwyraźniej nie ma zauważalnego wpływu.
AndyDunn,
1
to również działało dla mnie, szukałem szybkiej wersji. Dodano, co działało dla mnie w kodzie :)
Mugunthan Balakrishnan,
10

To zdecydowanie błąd w systemie iOS. W iOS 8 ustawienie koloru tła Interface Builderdziała dobrze na iPhonie, ale na iPadzie zawsze tak jest whiteColor. Aby to naprawić, w cellForIndexPathkomunikacie źródła danych wstaw to:

cell.backgroundColor = cell.backgroundColor

I to zadziała. Właśnie dlatego powiedziałem, że to błąd, ponieważ sam kod jest w zasadzie bzdurą * t, ale działa.

superarts.org
źródło
Nadal sprawa dla Xcode7 / iOS9. Dodałem jawny kod w tableView: willDisplayCell: forRowAtIndexPath jak sugerowano powyżej.
Andrew Duncan,
W XCode 7.0.1 kompilacja uniwersalna aplikacja pokazała czarne tło na iPhonie z systemem iOS 7,8,9, ale białe tło na iPadzie z systemem iOS 9.0.2 (i prawdopodobnie inne, ale nie mogą tego zweryfikować). Powyższy kod to naprawił.
ScottyB,
W przypadku statycznego tableView zastąpienie willDisplayCell z cell.backgroundColor = UIColor.clearColor (). Ponowne przypisanie ustawień kolorów w IB nie działało dla mnie.
Viktor Kucera,
4

Możliwe, że domyślnie wybrana jest twoja UITableViewCell. Możesz to potwierdzić za pomocą nowego wizualnego debuggera Xcode 6 (lub dowiedzieć się dokładnie, który widok powoduje wyświetlenie białej komórki).

wprowadź opis zdjęcia tutaj

Co ciekawe, po zapoznaniu się z tym ... ustawienie koloru tła wybranej komórki do wyczyszczenia nadal nie działało .. po przeprowadzeniu dalszych badań okazuje się, że musiałem zmodyfikować styl zaznaczania podczas tworzenia tej niestandardowej komórki:

- (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;
}
abbood
źródło
uszkodzony link do wizualnego debuggera
Suragch
3

Odkryłem, że żadne z powyższych nie działało w XCode 5.1.1, iOS 7.1.

Jeśli używasz Konstruktora interfejsów z komórkami prototypowymi, wybierz komórkę prototypową, a następnie w selektorze atrybutów w sekcji Widok zmień domyślną formę tła na Wyczyść kolor:

wprowadź opis zdjęcia tutaj

To wydaje się działać dobrze. Żadna z powyższych zmian kodu również nie jest potrzebna - jest to czyste rozwiązanie IB.

Mikrofon
źródło
2

Przyjęta odpowiedź nie rozwiązała problemu. Musiałem to zrobić:

  1. W kreatorze interfejsów wybierz widok tabeli. Następnie z poziomu inspektora atrybutów w sekcji Widok ustaw Tło na przezroczyste (0% krycia).

wprowadź opis zdjęcia tutaj

  1. Z klasy źródła danych tabeli metoda cellForRowAtIndexPath:

    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
        reuseIdentifier:CellIdentifier];
    cell.backgroundColor = [UIColor clearColor]; //Make cell transparent
RajV
źródło
Cóż, używasz Konstruktora interfejsów ... jak @null skomentował poniżej mojej odpowiedzi: „... wydaje się, że w konstruktorze interfejsów jest błąd…” , nie jestem do końca pewien, czy zawiera on błąd, ale wydaje się tak przyczyną, że komentarz otrzymał kilka głosów. ;)
Kwietnia
Coś w iOS7 jest zdecydowanie wadliwe, jeśli chodzi o przezroczyste tło komórki. Mam nadzieję, że moja odpowiedź pomoże innym, którzy stoją w podobnej sytuacji jak ja.
RajV
To nie jest właściwy sposób tworzenia komórek dla widoku tabeli, szczególnie jeśli używasz Konstruktora interfejsów / Storyboardów. We fragmencie kodu tworzysz nową komórkę za każdym razem, gdy twój delegat zostanie o nią poproszony, nie jest to ponowne użycie! Aby uzyskać korzyści wydajnościowe wynikające z ponownego wykorzystania komórek, należy użyć cell = [tableView dequeueReusableCellWithIdentifier:<#Reuse ID#> forIndexPath:indexPath]. We wcześniejszych wersjach upuszczasz argument indexPath, a następnie testujesz na zero, tworząc instancję initWithStyle:reuseIdentifierzgodnie z fragmentem kodu w przypadku zerowym.
ikuramedia,
ikuramedia: Zostawiłem kod ponownego użycia w swoim poście. Oczywiście ponownie wykorzystuję komórki. Nie o to chodzi w tym poście.
RajV
2

Dla mnie ustawienie cell.backgroundColor = cell.contentView.backgroundColor; albo w tableView:willDisplayCell:forRowAtIndexPath:lub tableView:cell:forRowAtIndexPath:na pracę.

Jest tak, ponieważ ustawiłem kolor tła contentView w Konstruktorze interfejsów zgodnie z potrzebami.

mllm
źródło
1

Podczas dodawania obiektów interfejsu użytkownika do komórki Xcode 5 / IOS 7 dodaje nowy „Widok treści”, który będzie nadzorem wszystkich elementów w komórce. Aby ustawić kolor tła komórki, ustaw kolor tła tego widoku treści. Powyższe rozwiązania nie działały dla mnie, ale to działało dla mnie dobrze.

DrBug
źródło
Widok zawartości jest dostępny również w poprzednich wersjach zestawu SDK, wystarczy ustawić kolor tła dla widoku zawartości, który obejmuje widok tła komórki.
Kwietnia,
Cóż, nie wyświetla się automatycznie w kreatorze interfejsów wcześniejszym niż xcode 5. Na czym dokładnie polega?
DrBug,
Mam na myśli twoją odpowiedź na inny problem, a nie moje pytanie. Chcesz tylko ustawić kolor tła dla swojej komórki, prawda? Tak więc bez względu na to, że komórki mają domyślnie białe tło lub nie w iOS 7, zawsze możesz je zaimplementować, ustawiając kolor dla widoku zawartości, ponieważ widok zawartości leży nad widokiem tła komórki. Ma sens? ;)
Kwietnia
1

Rozwiązanie Swift 1.2:

Po prostu dodaj wyraźną definicję koloru tła komórki w taki sposób:

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

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

    return cell
}
Dan Beaulieu
źródło
Przepraszam. Mój błąd. To działa. Brakowało mi innych ustawień.
Sung Kim
1

Miał podobny problem, musiał

  1. Ustaw niebieski jako styl wyboru i
  2. dodaj to do kodu, aby to poprawić

    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
    }
Nakul Sudhakar
źródło
0

Możesz także użyć kodu koloru, aby zyskać lukratywną komórkę UITableView.

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

Oto kod do zastosowania metody kodu koloru:

-(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];
}
MahboobiOSDeveloper
źródło