UITableViewCell beyaz arka planı gösterir ve iOS7'de değiştirilemez


186

Ben miras özel bir tablo görünümü hücre sınıfı uyguladım UITableViewCell. Tableview bir arka plan görüntüsü içeriyor, bu yüzden hücre arka planının şeffaf olmasını istiyorum. İOS7'den önce harika görünüyor.

Bununla birlikte, iOS7'de hücre her zaman beyaz bir arka planla gösterilir.


Xcode7, 2015 için bile film şeridinde bir hata var: kodda bir hücrenin arka plan rengini ayarlamanız gerekiyor.


özellik arka plan rengine erişerek doğrudan hücrenin arka plan rengini değiştirebilirsiniz. cell.backgroundColor = [UIColor clearColor];
ViruMax

Yanıtlar:


384

Apple DOC'un dediği gibi ( UITableViewCell Sınıf Referansı ):

... iOS 7'de, hücrelerin varsayılan olarak beyaz bir arka planı vardır ; iOS'un önceki sürümlerinde, hücreler, ekli tablo görünümünün arka plan rengini devralır. Bir hücrenin arka plan rengini değiştirmek istiyorsanız, bunu tablo görünümü temsilcinizin tableView: willDisplayCell: forRowAtIndexPath: yönteminde yapın.

Yani benim durumum için şeffaf arka plana sahip hücreleri göstermek için, sadece aşağıdaki gibi tablo görünümü denetleyicisinde temsilci yöntemi uygulamak gerekir:

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

Sadece Not : @null dediği gibi, "... arayüz oluşturucu bir hata var gibi görünüyor ..." , onun hata olup olmadığını tamamen emin değilim, ama öyle görünüyor çünkü yorum birkaç oy aldı. IB kullanırsanız yanlış bir şeyler olabilir. :)


53
Ne yazık ki doğru değil, arayüz oluşturucuda bir hata var gibi görünüyor ve film şeridinden özel hücreme ayarlayamadım.
Tarek Hallak

1
@null, aha, iOS 7 SDK'nın hala düzeltilmesi gereken birçok hata var gibi görünüyor. Zaten bazılarıyla tanıştım, ancak Storyboard ile ilgili olarak hiçbir fikrim yok. :)
Kjuly

4
Bunu tableView:cellForRowAtIndexPath:yöntemde de yapabilirsiniz .
bugloaf

1
@KendallHelmstetterGelner emin misiniz? Henüz fark etmedim, hala benim için çalışıyor gibi görünüyor. :)
Kjuly

1
Bugloaf Yukarıda söylediği gibi - tableView bunu: cellForRowAtIndexPath:
amergin

66

Biraz araştırdım ve hücre backgroundColor'un Görünüm sistemi tarafından ayarlandığını öğrendim. Dolayısıyla, uygulamanızdaki tüm hücrelerin net arka planı varsa, en kolay çözüm şöyle olacaktır:

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

Ve farklı bir arka plana sahip olsalar bile, açık renk varsayılan renk olarak en uygun gibi görünüyor.


1
Sen arkadaşım bir canavarsın. Ben alt sınıfı tüm benim UITableViewCellyapmamı BG rengini ayarlamak için ilklendiricili bir üst sınıfı sağlamak için bir sorun değildi bu yüzden, s clearColor, ama ne oldu? Bu işe yaramadı ... Yani, NEDEN APPLE?
Mazyod

Bu çalışıyor. Ancak, beyaz renk görünmez. En iyi etki için en iyi tepki ile gitti (haşhaş yok).
Carl Prehn

@Anton Filimonov Benim Appdelegate şimdi belirli bir viewController tablo görünümü hücre görünümünü ayarladım Ben hücre için farklı bir renk var istiyorum Bu Senaryoya nasıl yaklaşabilirim? CellWillDisplay delege yönteminde farklı bir renk ayarlamaya çalıştım ama hiçbir etkisi yok. Bana bu konuda yardımcı olabilir misiniz
Peer Mohamed Thabib

@PeerMohamedThabib lütfen çevre (iPad / iPhone, iOS sürümü) hakkında biraz daha bilgi verin ve bazı kodlar sağlayın. Ve aslında durumu kendiniz araştırabilirsiniz - sadece bir UITableViewCell alt sınıfı yapın, setBackgroundColor: yöntemini yeniden tanımlayın (sadece superclass 'uygulamasını çağırın) ve bu yönteme bir kesme noktası koyun ve göreceksiniz, ayarladıktan sonra hücre rengini neyin değiştirdiğini göreceksiniz tablo: ViewDisplayCellAtIndexYol:
Anton Filimonov

1
Karışık hücreleriniz olsa bile, bazıları arka planı olan ve bazıları şeffaf olmayan. En kolay yol, özel bir sınıf tanımlamak ve aynı kodu yazmaktır. Bu şekilde tüm UITableViewCell sınıfları varsayılan olarak kalır ve özel sınıflar açık renklidir. [[CustomTableCell görünümü] setBackgroundColor: [UIColor clearColor]]; Bu defult UITableViewCells etkilemez ve sadece özel hücreler üzerinde etkisi olmaz.
Ansari

30

Dönüş hücresinden önce bunu cellForRowAtIndexPath yöntemine yazın;

cell.backgroundColor = [UIColor clearColor];

1
Bu, iPhone 5'teki iOS 8'de bir sorunla bana yardımcı oldu
Almo

13

UITableViewCellİOS 7'deki bir varsayılan arka plan rengi beyazdır.

backgroundColorÖzelliği kodunuzda bir yere ayarlamanız gerekir. Örneğin, hücreyi yeni oluşturduktan sonra ayarlayın.

cell.backgroundColor = [UIColor clearColor];

Denedim ama benim için işe yaramadı. Çalıştığından emin misiniz?
Matrosov Alexander

Benim için initWithCoder: aDecoder yöntemi özel bir tablo görünümü hücre için çalışır.
ftvs

13

Aslında sorunun UITableView'ın Arkaplan renginin net olarak ayarlanmamasından kaynaklandığını gördüm. UITableViewCell'in Arkaplan rengini temizlemek için değiştirirseniz ve hala beyaz görüyorsanız, UITableView'ın arka plan renginin açık (veya istediğinizi) olarak ayarlandığından emin olun.

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

Swift'te

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

Sadece FYI bunu IB'de de ayarlayabilirsiniz. Görünürde belirgin bir etkisi olmayan 'Tablo Görünümü' bölümünde değil, arka plan rengini 'Görünüm' bölümü içinde değiştirdiğinizden emin olun.
AndyDunn

1
Bu da benim için çalıştı, onun hızlı sürümünü arıyordum. Kod benim için işe
yarayan eklendi

10

Bu kesinlikle bir iOS hatası. İOS 8'de Interface BuilderiPhone'da arka plan rengini ayarlamak iyi çalışıyor, ancak iPad'de her zaman whiteColor. Düzeltmek için, cellForIndexPathveri kaynağı mesajında ​​şunu yerleştirin:

cell.backgroundColor = cell.backgroundColor

Ve işe yarayacak. Tam olarak bu yüzden kodun kendisi oldukça saçma * t olduğu için bir hata olduğunu söyledim, ama çalışıyor.


Xcode7 / iOS9 için hala durum böyle. Yukarıda açıklandığı gibi tableView: willDisplayCell: forRowAtIndexPath açık kod ekledim.
Andrew Duncan

XCode 7.0.1'de evrensel uygulamayı derleyen iOS 7,8,9 çalıştıran iPhone'da siyah arka plan, ancak iOS 9.0.2 çalıştıran iPad'de beyaz arka plan gösterdi (ve muhtemelen diğerleri ancak doğrulayamıyor). Yukarıdaki kod düzeltildi.
ScottyB

Statik tableView için geçersiz kılma willDisplayCell with cell.backgroundColor = UIColor.clearColor (). IB'de renk ayarını yeniden atamak benim için işe yaramadı.
Viktor Kucera

4

UITableViewCell varsayılan olarak seçili olabilir .. Bunu Xcode 6s yeni görsel hata ayıklayıcı kullanarak onaylayabilirsiniz (veya tam olarak hangi görünümün bu beyaz hücrenin görünmesine neden olduğunu öğrenin).

resim açıklamasını buraya girin

İlginç bir şekilde, bunu bildikten sonra .. seçili hücrenin arka plan rengini temizlemek için hala çalışmıyor işe yaramadı .. biraz daha araştırma yaparak, ben sadece bu özel hücre oluştururken seçim stilini değiştirmek zorunda kaldım:

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

görsel hata ayıklayıcı için kırık bağlantı
Suragch

3

Yukarıdakilerin hiçbirinin XCode 5.1.1, iOS 7.1'den çalışmadığını buldum.

Prototip hücreleriyle Arayüz Oluşturucu kullanıyorsanız, prototip hücresini seçin, ardından Görünüm bölümündeki nitelik seçiciden Arka Plan formunun varsayılanını Rengi Temizle olarak değiştirin:

resim açıklamasını buraya girin

Bu iyi çalışıyor gibi görünüyor. Yukarıdaki kod değişikliklerinin hiçbirine de gerek yoktur - bu saf bir IB çözümüdür.


2

Kabul edilen cevap benim için sorunu çözmedi. Bunu yapmak zorundaydım:

  1. Arayüz oluşturucuda tablo görünümünü seçin. Ardından öznitelik denetçisinden Görünüm bölümünden Arka Planı saydam (% 0 opaklık) olarak ayarlayın.

resim açıklamasını buraya girin

  1. Tablonun veri kaynağı sınıfı cellForRowAtIndexPath yönteminden:

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

Eh, @null cevabım aşağıda yorumladı olarak Interface Builder .. kullanmak “... ... arayüz oluşturucu bir hata var gibi görünüyor” Tamamen emin hata var olup olmadığı değilim, ama neden o kadar görünüyor yorum birkaç oy aldı. ;)
Kjuly

Şeffaf hücre arka planı söz konusu olduğunda iOS7'deki bir şey kesinlikle hatalıdır. Umarım cevabım benimle benzer durumlarla karşı karşıya olan diğerlerine yardım eder.
RajV

Özellikle Arayüz Oluşturucu / Öykü Tabloları kullanıyorsanız, tablo görünümünüz için hücre oluşturmanın doğru yolu bu değildir. Kod snippet'inde, temsilcinizden her istendiğinde yeni bir hücre oluşturuyorsunuz, bu yeniden kullanılmıyor! Hücrenin yeniden kullanımının performans avantajlarından yararlanmak için kullanmalısınız cell = [tableView dequeueReusableCellWithIdentifier:<#Reuse ID#> forIndexPath:indexPath]. Önceki sürümlerde, indexPath bağımsız değişkenini bırakıp nil initWithStyle:reuseIdentifieriçin kod parçacığınıza göre örnekleyerek nil için test yaparsınız .
ikuramedia

ikuramedia: Yeniden kullanım kodunu yazımın dışında bıraktım. Tabii ki hücreleri tekrar kullanıyorum. Bu yazının konusu bu değil.
RajV

2

Benim için cell.backgroundColor = cell.contentView.backgroundColor; ya ayarladım ya tableView:willDisplayCell:forRowAtIndexPath:da tableView:cell:forRowAtIndexPath:iş yaptım.

Bunun nedeni, ContentView'ın arka plan rengini Interface Builder'da istediğiniz gibi ayarlamamdır.


1

Bir hücreye UI nesneleri eklerken, Xcode 5 / IOS 7, hücredeki tüm öğelerin denetimi olacak yeni bir "İçerik Görünümü" ekler. Hücrenin arka plan rengini ayarlamak için, bu İçerik Görünümünün arka plan rengini ayarlayın. Yukarıdaki çözümler benim için işe yaramadı ama bu benim için iyi çalıştı.


İçerik görünümü önceki SDK sürümlerinde de kullanılabilir, yalnızca içerik görünümü için hücrenin arka plan görünümünü kapsayan bir arka plan rengi ayarlarsınız.
Kjuly

Peki, xcode 5'ten önceki arayüz oluşturucusunda otomatik olarak açılmaz.
DrBug

Demek istediğim, cevabım başka bir konu için tartışıldı, sorum değil. Sadece hücreniz için bir arka plan rengi ayarlamak istiyorsunuz, değil mi? Dolayısıyla, iOS 7'de hücrelerin varsayılan olarak beyaz bir arka planı olursa olsun, içerik görünümü için bir renk ayarlayarak her zaman uygulayabilirsiniz, içerik görünümünün hücrenin arka plan görünümü üzerine yerleşmesine neden olabilir. Mantıklı olmak? ;)
Kjuly

1

Swift 1.2 Çözümü:

Sadece hücrenizin arka plan rengi için açık bir tanım ekleyin:

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

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

    return cell
}

Afedersiniz. Benim hatam. İşe yarıyor. Diğer ayarları kaçırdım.
Sung Kim

1

Benzer bir sorun vardı,

  1. Mavi'yi seçim olarak ayarla
  2. düzeltmek için bunu koda ekleyin

    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'inizi kazançlı hale getirmek için renk kodunu da kullanabilirsiniz.

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

Renk kodu yöntemini uygulama kodu:

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