UITableView backgroundColor在iPad上始终为白色

时间:2014-12-18 16:28:17

标签: ios objective-c ipad uitableview uibackgroundcolor

我正在从事一个项目。我有很多UITableView个设置为清晰的颜色。他们的观点'背景颜色设置为我的自定义颜色,一切都很好 iPhone

问题出现在 iPad 上!我尝试了几乎所有的东西,但我的UITableView有一种白色。

我查看了其他主题,例如: UITableView backgroundColor always gray on iPad ,但没有任何效果。另外,我的问题不是灰色,它像雪一样白了!

可能是什么原因?

16 个答案:

答案 0 :(得分:124)

好消息:根据发行说明,适用于iOS 10:

  

在iPad上运行时,为UITableViewCell设置背景颜色   在故事板中现在受到尊重。

对于版本< 10:

我在iOS 8(8.3)中看到了这一点。即使在IB中我的细胞是“清晰的颜色”,并且它们的内容视图是“清晰的颜色”,它们将呈现为白色。一个不完美但合理的解决方案,因为它仍然需要来自IB的值:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    ...
    cell.backgroundColor = cell.contentView.backgroundColor;
    return cell;
}

似乎我的可重复使用的可重复使用的单元格在iPad上强制使用白色背景。我能够使用视图层次结构调试器确定这一点。

一旦我这样做了,我就可以使用表格的背景颜色而不必设置背景视图,尽管这样也可以。

答案 1 :(得分:38)

您可以通过在appDelegate文件中设置外观API设置来解决此问题:

夫特:

UITableViewCell.appearance().backgroundColor = UIColor.clearColor()

答案 2 :(得分:19)

不是设置背景颜色,而是尝试使用背景视图,如下所示:

- (void)viewDidLoad {
    self.tableView.backgroundView = [UIView new];
    self.tableView.backgroundView.backgroundColor = [UIColor clearColor];
}

我遇到的问题是使用backgroundColor并不总能产生效果,但设置背景视图却可以正常工作。

答案 3 :(得分:12)

建立Ben Flynn的答案... cell.contentView背景颜色不一定等于cell.background颜色。在这种情况下,我发现这有助于在更多情况下解决iPad白色背景问题:

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        ...
        cell.backgroundColor = cell.backgroundColor;
        return cell;
    }

虽然这句话看起来很荒谬和疯狂......但它解决了这个问题。

答案 4 :(得分:10)

我有一个表格视图,里面有许多不同的单元格,每个单元格都有不同的颜色。

@Ben Flynn cell.backgroundColor = self.contentView.backgroundColor的答案无法实现。 原因是self.contentView.backgroundColor为零,所以你所做的只是清除cell.backgroundColor = nil

基本上它是来自Xcode的错误(我想,是的,它很糟糕!),cell.backgroundColor仍然有颜色,但它无法显示。

调试一段时间后,根据@Ray W回答,这是我的解决方案。

@impelement YouCustomCellClass

- (void)awakeFromNib {
    [super awakeFromNib];
    self.backgroundColor = self.backgroundColor; // What the heck?? But it is.
}

@end

答案 5 :(得分:4)

这为我解决了这个问题

 func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    tableView.backgroundColor = UIColor.clear
}

答案 6 :(得分:3)

根据我的经验,某些版本的iOS在调用委托的tableView:willDisplayCell:forRowAtIndexPath:之前设置了UITableViewCell的backgroundColor。在该方法中重新设置回自定义颜色可以修复它。

答案 7 :(得分:2)

SWIFT 3.XX

把这个

UITableViewCell.appearance().backgroundColor = UIColor.clear

AppDelegate

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool

答案 8 :(得分:1)

我正在使用StoryboardUITableViewControlrs,所以最简单的决定是将所有控制器子类化,并将此方法添加到父

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

答案 9 :(得分:1)

<强> SWIFT

这也发生在我身上。我的SWRevealViewController中的表格视图在我的iPad上显示为白色,当它在我的iPhone上看起来很清晰时(这是我想用背景图像的方式)。我尝试了以上所有内容,但这最终在我的viewDidLoad()中为我工作。

tableView.backgroundView = UIImageView(image: UIImage(named: "gray"))
tableView.backgroundView?.backgroundColor = .clearColor()
UITableViewCell.appearance().backgroundColor = .clearColor()

答案 10 :(得分:1)

Swift 3.1

我通过将此问题放在我的UITableViewCell子类中来解决这个问题:

从NIB文件加载单元格时:

override func awakeFromNib() {
    super.awakeFromNib()
    self.backgroundColor = UIColor.clear
}

当系统重用该单元时

override func prepareForReuse() {
    super.prepareForReuse()
    self.backgroundColor = UIColor.clear
}

iOS 10应该在Interface Builder中修复此问题,因为 animeshporwal 表示。

答案 11 :(得分:0)

这可以在故事板中实现,如下所示:

  • 显示故事板的文档大纲
  • 在您的表格中,选择一个TableViewCell
  • 转到该单元格内的“内容视图”
  • 设置内容视图的背景颜色。

结果:iPad和iPhone模拟器视图看起来相同

答案 12 :(得分:0)

我刚刚遇到这个问题,并通过更改View的backgroundColor(而不是tableView的一个)来修复它。在iPad上似乎是首先使用的那个,在我的情况下,它被设置为白色。

答案 13 :(得分:0)

<强> SWIFT 我也有这个问题。在.phone上正常工作,但tableViewCells在.pad上显示白色。我想我是如何使用swift修复它的。

将tableViewCell作为@IBOutlet连接到viewController.swift,如下所示:

require(data.table)
require(microbenchmark)
require(feather)
ns <- as.integer(10^seq(2, 6, length.out = 25))
DTn <- function(nn)
    data.table(
          str1 = sample(sprintf("%010d",1:nn)),
          str2 = sample(sprintf("%09d",1:nn)),
          str3 = replicate(nn,paste0(sample(LETTERS,sample(10:30,1),T), collapse="")),
          str4 = sprintf("%05d",sample(sample(1e5,50),nn,T)),
          str5 = sample(replicate(17,paste0(sample(LETTERS, sample(15:25,1),T), collapse="")),nn,T),
          num1 = round(exp(rnorm(nn,mean=6.5,sd=1.5)),2),
          str6 = sample(c("Y","N"),nn,T),
          str7 = sample(c("M","F"),nn,T),
          str8 = sample(c("B","W"),nn,T),
          int1 = as.integer(ceiling(rexp(nn))),
          num2 = round(exp(rnorm(nn,mean=6,sd=1.5)),2),
          num3 = (-1)^sample(2,nn,T)*round(exp(rnorm(nn,mean=6,sd=1.5)),2))

count <- data.table(n = ns,
                    c = c(rep(1000, 12),
                          rep(100, 6),
                          rep(10, 7)))

mbs <- lapply(ns, function(nn){
  print(nn)
  set.seed(51423)
  DT <- DTn(nn)
  microbenchmark(times = count[n==nn,c],
               write.csv=write.csv(DT, "writecsv.csv", quote=FALSE, row.names=FALSE),
               save=save(DT, file = "save.RData", compress=FALSE),
               fwrite=fwrite(DT, "fwrite_turbo.csv", quote=FALSE, sep=","),
               feather=write_feather(DT, "feather.feather"))})

png("microbenchmark.png", height=600, width=600)
par(las=2, oma = c(1, 0, 0, 0))
matplot(ns, t(sapply(mbs, function(x) {
  y <- summary(x)[,"median"]
  y/y[3]})),
  main = "Relative Speed of fwrite (turbo) vs. rest",
  xlab = "", ylab = "Time Relative to fwrite (turbo)",
  type = "l", lty = 1, lwd = 2, 
  col = c("red", "blue", "black", "magenta"), xaxt = "n", 
  ylim=c(0,25), xlim=c(0, max(ns)))
axis(1, at = ns, labels = prettyNum(ns, ","))
mtext("# Rows", side = 1, las = 1, line = 5)
legend("right", lty = 1, lwd = 3, 
       legend = c("write.csv", "save", "feather"),
       col = c("red", "blue", "magenta"))
dev.off()

然后在viewDidLoad中输入以下内容:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    packagingOptions {
        exclude 'META-INF/DEPENDENCIES'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/license.txt'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/NOTICE.txt'
        exclude 'META-INF/notice.txt'
        exclude 'META-INF/ASL2.0'
    }

    defaultConfig {
        applicationId "com.example.petersenrr.test"
        minSdkVersion 8
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"

        multiDexEnabled true
    }
     buildTypes {
         release {
             minifyEnabled false
             proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}
dependencies {
    compile 'com.android.support:multidex:1.0.0'
    //compile fileTree(include: ['*.jar'], dir: 'libs')
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.2.1'
    compile 'com.android.support:design:23.2.1'
    compile files('libs/android-support-v4.jar')
    compile files('libs/httpclient-android-4.3.5.jar')
    compile files('libs/httpclient-4.5.2.jar')
    compile files('libs/httpcore-4.4.4.jar')
}

很奇怪,我不知道这里发生了什么,但这解决了我。

答案 14 :(得分:0)

这似乎与iOS 10 Beta 4有关,正如UIKit笔记下的发行说明所述:

enter image description here

答案 15 :(得分:0)

我有一个带有半透明表视图单元格的透明表格视图。我在创建表时将表视图背景颜色设置为清除。这适用于除iPad + iOS 8之外的所有iOS /设备组合,其中背景颜色保持白色。

对我来说,将单元格的背景颜色设置为半透明,将内容视图背景颜色设置为清除工作,因为我在每个tableView(_ tableView: UITableView, cellForRowAt indexPath)上执行此操作。对我来说问题只是表视图背景仍然是白色。

我尝试了所有关于此问题的组合,但我唯一需要做的就是在每个tableView(_ tableView: UITableView, cellForRowAt indexPath)上将表格视图背景设置为透明。不是非常直观,但至少它是有效的。 :P