Jak dostosować kolor tła UITableViewCell?

Chciałbym dostosować tło (i może również obramowanie) wszystkich UITableViewCells w moim UITableView. Do tej pory nie byłem w stanie dostosować tych rzeczy, więc mam kilka białych komórek tła, które są domyślne.

Czy jest sposób, aby to zrobić z iPhone SDK?

Author: Ryan Townshend, 2008-11-11

17 answers

Musisz ustawić kolor tła widoku zawartości komórki na swój kolor. Jeśli używasz akcesoriów (takich jak strzałki do ujawniania itp.), będą one wyświetlane jako białe, więc może być konieczne zrolowanie ich niestandardowych wersji.

 187
Author: Ben Gottlieb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-11 18:13:50

Oto najskuteczniejszy sposób, na jaki natknąłem się, aby rozwiązać ten problem, użyj metody willDisplayCell delegate (to dba o biały kolor tła etykiety tekstowej, jak również podczas korzystania z komórki.textLabel.tekst i / lub komórka.detailTextLabel.tekst): {]}

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

Gdy ta metoda delegata jest wywoływana, kolor komórki jest kontrolowany przez komórkę, a nie przez Widok tabeli, jak w przypadku użycia:

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

Więc w treści metody cell delegate Dodaj następujący kod do alternatywne kolory komórek lub po prostu użyj wywołania funkcji, aby wszystkie komórki tabeli były tego samego koloru.

if (indexPath.row % 2)
{
    [cell setBackgroundColor:[UIColor colorWithRed:.8 green:.8 blue:1 alpha:1]];
}
else [cell setBackgroundColor:[UIColor clearColor]];
To rozwiązanie działało dobrze w moich okolicznościach...
 204
Author: N.Berendt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-23 08:59:52

Jest to naprawdę proste, ponieważ OS 3.0 ustawia tylko kolor tła komórki w metodzie willDisplayCell. Nie wolno ustawiać koloru w ścieżce cellForRowAtIndexPath.

To działa zarówno dla stylu zwykłego, jak i grupowego:

Kod:

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

P. S: tutaj wyciąg z dokumentacji dla willDisplayCell:

" widok tabeli wysyła tę wiadomość do jego delegat tuż przed użyciem komórki aby narysować wiersz, pozwalając tym samym na deleguj, aby dostosować komórkę obiekt zanim zostanie wyświetlony. Metoda ta daje delegatowi szansę na override state-based properties set wcześniej przez Widok tabeli, np. wybór i kolor tła. Po delegat powraca, widok tabeli ustawia tylko Alfę i ramkę właściwości, a wtedy tylko wtedy, gdy animowanie wierszy podczas przesuwania lub Wynocha."

Znalazłem tę informację w ten post od colionel. Podziękuj Mu!

 104
Author: Seba,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-10 13:57:15

Najlepsze podejście, jakie do tej pory znalazłem, polega na ustawieniu widoku tła komórki i wyczyszczeniu tła podwidów komórki. Oczywiście wygląda to ładnie na stołach z indeksowanym stylem, bez względu na akcesoria lub bez.

Oto próbka, w której tło komórki jest żółte:

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 ];
}
 57
Author: Vladimir Grigorov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-14 14:57:57

Po prostu umieść to w pliku klasy delegata 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;
}
 19
Author: JAG,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-27 11:19:39

Zgadzam się z Sebą, Próbowałem ustawić przemienny kolor wiersza w metodzie delegata rowForIndexPath, ale uzyskiwałem niespójne wyniki między 3.2 A 4.2. Poniższe prace świetnie mi się sprawdziły.

- (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;
    }

}
 7
Author: cipherz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-23 19:29:40

Po wypróbowaniu wszystkich różnych rozwiązań, poniższa metoda jest najbardziej elegancka. Zmiana koloru w następującej metodzie delegate:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (...){
        cell.backgroundColor = [UIColor blueColor];
    } else {
        cell.backgroundColor = [UIColor whiteColor];
    }
}
 6
Author: Jim Huang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-08 09:43:24

Vlado.grigorov ma dobrą radę - najlepszym sposobem jest stworzenie tła i nadanie mu koloru, ustawiając Wszystko inne na clearColor. Również, myślę, że ten sposób jest jedynym sposobem, aby poprawnie wyczyścić kolor (spróbuj jego próbki-ale ustawić 'clearColor' zamiast 'yellowColor'), co chciałem zrobić.

 4
Author: William Denniss,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-04 06:10:13

Dostosowywanie tła komórki widoku tabeli w końcu staje się podejściem "wszystko albo nic". Bardzo trudno jest zmienić kolor lub obraz używany na tle komórki zawartości w sposób, który nie wygląda dziwnie.

Powodem jest to, że komórka faktycznie rozciąga się na szerokość widoku. Zaokrąglone rogi są tylko częścią stylu rysowania, a Widok zawartości znajduje się w tym obszarze.

Jeśli zmienisz kolor komórki zawartości, zobaczysz białe bity na rogach. Jeśli zmienisz kolor całej komórki, pojawi się blok kolorów obejmujący szerokość widoku.

Można zdecydowanie dostosować komórkę, ale nie jest to takie proste, jak może się wydawać na początku.

 3
Author: Andrew Grant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-11 21:32:17

Utwórz widok i ustaw go jako widok tła komórki

UIView *lab = [[UIView alloc] initWithFrame:cell.frame];
            [lab setBackgroundColor:[UIColor grayColor]];
            cell.backgroundView = lab;
            [lab release];
 3
Author: Senthil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-28 10:32:34

Aby rozszerzyć odpowiedź N. Berendta - jeśli chcesz ustawić kolor komórki na podstawie jakiegoś stanu w rzeczywistym obiekcie danych komórki, w czasie konfigurowania reszty informacji dla komórki tabeli, co zwykle jest w przypadku metody cellForRowAtIndexPath, możesz to zrobić, nadpisując metodę willDisplayCell, aby ustawić kolor tła komórki z widoku zawartości kolor tła - to obejdzie problem tła przycisku ujawniania itp. nie ma racji ale i tak pozwala kontrolować kolor w metodzie cellForRowAtIndexPath, w której wykonujesz wszystkie inne dostosowywanie komórek.

Więc: Jeśli dodasz tę metodę do delegata widoku tabeli:

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

Następnie w swojej metodzie cellForRowAtIndexPath możesz wykonać:

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

Zapisuje to konieczność ponownego pobierania obiektów danych w metodzie willDisplayCell, a także zapisuje posiadanie dwóch miejsc, w których można dostosować / dostosować komórkę tabeli - wszystkie dostosowania można przejść w metoda cellForRowAtIndexPath.

 3
Author: gamozzii,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-02 01:08:11

Utwórz obrazek do użycia jako tło w Photoshopie lub gimp i nazwij go myimage. Następnie dodaj tę metodę do swojej klasy 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];
}

To zadziała również, jeśli Ustawiłeś UITableView na custom in attribute inspector.

 3
Author: Davide,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-11 07:35:26

Moim rozwiązaniem jest dodanie następującego kodu do zdarzenia 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];

Działa w każdych okolicznościach, nawet z przyciskami disclosure, i lepiej jest, aby twoja logika działała na stan koloru komórek w cellForRowAtIndexPath niż w zdarzeniu cellWillShow, jak sądzę.

 2
Author: albertoFlagSolutions,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-11 07:34:03

Podklasa UITableViewCell i dodaj to w implementacji:

-(void)layoutSubviews
{
    [super layoutSubviews];
    self.backgroundColor = [UIColor blueColor];
}
 1
Author: JonahGabriel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-06 21:32:56
    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
Author: Bhavesh Nayi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-04 08:55:05

To będzie działać w najnowszym Xcode.

-(UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath {
    cell.backgroundColor = [UIColor grayColor];
}
 1
Author: Sameera R.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-11 07:33:06

Spróbuj tego:

- (void)tableView:(UITableView *)tableView1 willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    [cell setBackgroundColor:[UIColor clearColor]];
    tableView1.backgroundColor = [UIColor colorWithPatternImage: [UIImage imageNamed: @"Cream.jpg"]];
}
 0
Author: Pang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-10 03:01:26