UITableViewCell'in arka plan rengi nasıl özelleştirilir?


188

Benim UITableView içinde tüm UITableViewCells arka plan (ve belki de sınır) özelleştirmek istiyorum. Şimdiye kadar bu şeyleri özelleştiremedim, bu yüzden varsayılan bir grup beyaz arka plan hücresim var.

Bunu iPhone SDK ile yapmanın bir yolu var mı?

Yanıtlar:


193

Hücrenin contentView öğesinin backgroundColor değerini renginize ayarlamanız gerekir. Aksesuarlar (açıklama okları vb.) Kullanıyorsanız, bunlar beyaz olarak görünür, bu nedenle bunların özel sürümlerini yuvarlamanız gerekebilir.


108
örneğin myCell.contentView.backgroundColor = [UIColor greenColor];
JoBu1324

1
vlado.grigorov'un cevabı daha esnektir - William Denniss'in cevabına bakınız
JoBu1324

3
UITableViewCellAccessoryCheckmarkÖrneğin, kendininkini nasıl yuvarlayacağınıza dair herhangi bir bağlantı var mı? Teşekkürler.
Dan Rosenstark

6
Bazen görmek için ayarlamanız gerekir:cell.textLabel.backgroundColor = [UIColor clearColor];
Evan Moran

205

İşte bu sorunu çözmek için karşılaştığım en verimli yol, willDisplayCell delege yöntemini kullanın (cell.textLabel.text ve / veya cell.detailTextLabel.text kullanırken de metin etiketi arka planı için beyaz renkle ilgilenir. ):

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

Bu delege yöntemi olarak adlandırıldığında, hücrenin rengi tablo görünümünden ziyade hücre üzerinden denetlenir, kullandığınız gibi:

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

Hücre delege yönteminin gövdesi içinde, hücrelerin renklerini değiştirmek için aşağıdaki kodu ekleyin veya yalnızca tablonun tüm hücrelerini aynı renkte yapmak için işlev çağrısını kullanın.

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

Bu çözüm benim durumumda iyi çalıştı ...


Bu çok daha temiz bir çözüm. Diğer çözümlerin çoğu ya UITableViewCell alt sınıfını gerektirir. vlado.grigorov'un çözümü benim için çalışmıyor.
Ronnie Liew

Gerçekten de, Apple'ın gördüğüm çeşitli WWDC sunumlarına göre kendilerinin önerdiği yöntem budur.
Mike Weller

Güzel - Listenin üstüne yeni satırlar eklemeniz gerektiğinde hariç. Bu yöntem tüm eklemeleri aynı renkte yapar. Yenileme sorunu çözer, ancak gereksiz zaman alır. Dün
öğrendik

Temel Verilerin kullanılması dışında, bu iyi çalışıyor gibi görünüyor. NSFetchedResultsController aracılığıyla eklenen yeni hücreler, willDisplayCell'i düzgün çağırmıyor gibi görünüyor. İşe
yarayan bir kaybım var

Swift 2.0'da arka plan rengini ayarlamak için eşdeğer çizgi:cell.backgroundColor = UIColor.clearColor
kbpontius

104

OS 3.0 sadece willDisplayCell yönteminde hücrenin arka plan rengini ayarladığından bu gerçekten basittir. CellForRowAtIndexPath içinde rengi ayarlamamalısınız.

Bu hem düz hem de gruplandırılmış stil için çalışır:

Kod:

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

Not: Burada willDisplayCell için belge özeti:

"Bir tablo görünümü, bir satır çizmek için hücreyi kullanmadan hemen önce bu iletiyi temsilcisine gönderir ve böylece temsilcinin, görüntülenmeden önce hücre nesnesini özelleştirmesine izin verir. Bu yöntem, temsilciye, daha önce ayarlanan durum tabanlı özellikleri geçersiz kılma şansı verir Temsilci geri döndükten sonra, tablo görünümü yalnızca alfa ve çerçeve özelliklerini ve ardından yalnızca satırları içeri veya dışarı kaydırırken animasyon yaparken ayarlar. "

Bu bilgiyi colionel'den bu yazıda buldum . Ona teşekkür et!


3
Eğer bir şey bile yok gibi bir disclosureIndiator varsa bu doğru cevap olarak işaretlenmesi gereken
Ashish Awaghad

1
Benim için tablo görünümleri arka planından farklı bir hücre arka planı rengi istiyorsanız bu işe yaramaz.
Chris

Grup hücresi için, hücreye ayarlayabilirsinizForRow
Sharen Eayrs

58

Şimdiye kadar bulduğum en iyi yaklaşım, hücrenin arka plan görünümünü ve hücre alt görünümlerinin net arka planını ayarlamaktır. Tabii ki, bu sadece endeksli tarzı olan masalarda, aksesuarlar olsun veya olmasın güzel görünüyor.

İşte hücrenin arka planının sarıya çevrildiği bir örnek:

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
Bunu yaparsanız, opak özelliğini de NO değerine ayarladığınızdan emin olun.
Lily Ballard

11
Şeffaf hücre kontrollerinin kullanılması gerçekten önerilmez. Kaydırma performansı çok etkilenecek, bu yüzden Apple her zaman opak kontrolleri kullandığını söylüyor.
Mike Weller

3
İOS 4.2 ve sonraki sürümlerde, döngü artık gerekli değildir.
Frank Schmitt

Çok hoş. Aksesuar görünümlerini kullanırken mükemmel çalışır !!
RyanG

19

Sadece bunu UITableView delege sınıf dosyasına (.m) koyun:

- (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 ile hemfikirim, rowForIndexPath delege yönteminde alternatif satır rengimi ayarlamaya çalıştım, ancak 3.2 ve 4.2 arasında tutarsız sonuçlar alıyordum. Aşağıdaki benim için harika çalıştı.

- (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
Hala willDisplayCell'de ayarlamanın neden herhangi bir fark yarattığını anlamıyorum. Bunu uygulasak da uygulamasak da denir mi?
Eylül Sharen Eayrs

6

Tüm farklı çözümleri denedikten sonra, aşağıdaki yöntem en şık olanıdır. Aşağıdaki temsilci yönteminde rengi değiştirin:

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

4

vlado.grigorov'un bazı iyi tavsiyeleri vardır - en iyi yol bir backgroundView oluşturmak ve bunu bir renk vermek ve clearColor'a her şeyi ayarlamaktır. Ayrıca, bu şekilde rengi doğru bir şekilde temizlemenin tek yoludur (örneğini deneyin - ama 'yellowColor' yerine 'clearColor' ayarlayın), yapmaya çalıştığım şey bu.


Bu yaklaşımın bir avantajı, Arayüz Oluşturucu'da rengi bir tasarım zamanı özelliği tutabilmenizdir. Geliştirici etkileşimi gerektiren daha az tasarım sorunu.
whitneyland

1
cell.backgroundView = [[[UIView ayırma] initWithFrame: cell.bounds] otomatik çalıştırma]; cell.backgroundView.backgroundColor = [UIColor redColor];
Brian

3

Bir tablo görünümü hücresinin arka planını özelleştirmek sonunda olur ve "ya hep ya hiç" yaklaşımı olur. İçerik hücresinin arka planı için kullanılan rengi veya görüntüyü garip görünmeyecek şekilde değiştirmek çok zordur.

Bunun nedeni, hücrenin aslında görüşün genişliğini kaplamasıdır. Yuvarlatılmış köşeler çizim stilinin sadece bir parçasıdır ve içerik görünümü bu alandadır.

İçerik hücresinin rengini değiştirirseniz köşelerde görünen beyaz bitlerle sonuçlanırsınız. Tüm hücrenin rengini değiştirirseniz, görünümün genişliğini kapsayan bir renk bloğunuz olur.

Bir hücreyi kesinlikle özelleştirebilirsiniz, ancak ilk başta düşündüğünüz kadar kolay değildir.


1
Bu, Gruplandırılmış tablolardaki hücreler için kesinlikle doğrudur, ancak Düz tabloların endişelenecek çok şeyi yoktur. Aksesuarsız süslenmemiş bir hücre iyi görünmelidir.
Ben Gottlieb

Ben - iyi bir nokta. Öncelikle gruplandırılmış tabloları kullanıyorum, ancak düz tablolardan bahsettiğiniz gibi bu sorunların hiçbirinden muzdarip değilim.
Andrew Grant

3

Bir görünüm oluşturun ve bunu hücrenin arka plan görünümü olarak ayarlayın

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

3

N.Berendt'in cevabını genişletmek için - Hücre rengini, gerçek hücre veri nesnesindeki bir duruma göre ayarlamak istiyorsanız, tablo hücresi için bilgilerin geri kalanını yapılandırırken, genellikle cellForRowAtIndexPath yöntemi, bunu içerik görünümü arka plan renginden hücre arka plan rengini ayarlamak için willDisplayCell yöntemini geçersiz kılarak yapabilirsiniz - bu, açıklama düğmesi arka planlarının vb. diğer tüm hücre özelleştirmelerini yaptığınız yer.

Yani: Bu yöntemi tablo görünümü temsilcinize eklerseniz:

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

Sonra cellForRowAtIndexPath yönteminde şunları yapabilirsiniz:

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

Bu, willDisplayCell yönteminde veri nesnelerinizi tekrar almak zorunda kalmaz ve aynı zamanda tablo hücrenizi uyarlama / özelleştirme yaptığınız iki yere sahip olmanızı sağlar - tüm özelleştirme cellForRowAtIndexPath yöntemine girebilir.


3

Photoshop veya gimp ile arka plan olarak kullanmak için bir görüntü oluşturun ve resmini myimage olarak adlandırın. Ardından, bu yöntemi tableViewController sınıfınıza ekleyin:

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

Bu, UITableView özelliğini öznitelik denetçisinde özel olarak ayarladıysanız da çalışır.


2

Benim çözüm, cellForRowAtIndexPath olayına aşağıdaki kodu eklemektir:

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];

Her durumda, açıklama düğmeleriyle bile çalışır ve mantığınızın cellForRowAtIndexPath'te hücrelerin renk durumu üzerinde hareket etmesi için cellWillShow olayından daha iyi olduğunu düşünüyorum.


1

UITableViewCell alt sınıf ve bunu uygulama ekleyin:

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

Bu, en son Xcode'da çalışacaktır.

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

0

Bunu dene:

- (void)tableView:(UITableView *)tableView1 willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    [cell setBackgroundColor:[UIColor clearColor]];
    tableView1.backgroundColor = [UIColor colorWithPatternImage: [UIImage imageNamed: @"Cream.jpg"]];
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.