I've implemented a custom table view cell class that inherit from UITableViewCell
. The tableview contains a background image, so I want cell's background to be transparent. It looks great before iOS7.
However, in iOS7, the cell is always shown with a white background.
Even for Xcode7, 2015, there is a bug in storyboard: you have to set the background color of a cell in code.
As Apple DOC said (UITableViewCell Class Reference):
... In iOS 7, cells have a white background by default; in earlier versions of iOS, cells inherit the background color of the enclosing table view. If you want to change the background color of a cell, do so in the tableView:willDisplayCell:forRowAtIndexPath: method of your table view delegate.
So for my case that to show cells with transparent background, just need to implement the delegate method in the table view controller like below:
- (void)tableView:(UITableView *)tableView
willDisplayCell:(UITableViewCell *)cell
forRowAtIndexPath:(NSIndexPath *)indexPath
{
[cell setBackgroundColor:[UIColor clearColor]];
}
Just Note: As @null said, "...there seems to be a bug in interface builder...", I'm not totally sure whether it does have the bug, but seems so cause his comment got several up votes. So there might something wrong if you use IB. :)
I investigated it a little bit and found out that the cell backgroundColor is set by the Appearance system. So if all cells in your application have clear background, the easiest solution would be:
[[UITableViewCell appearance] setBackgroundColor:[UIColor clearColor]];
And even if they have different background, clear color seems to be the most convenient as the default one.
UITableViewCell
s, so it wasn't an issue for me to provide a superclass with an initializer to set the BG color to clearColor
, but guess what? That didn't work... I mean, WHY, APPLE?
Write this in your cellForRowAtIndexPath method before return cell;
cell.backgroundColor = [UIColor clearColor];
The default background color of an UITableViewCell
in iOS 7 is white.
You have to set the backgroundColor
property somewhere in your code. For example, set it after you newly created the cell.
cell.backgroundColor = [UIColor clearColor];
I actually found that the issue arose from the UITableView's Background color not being set to clear. If you change the UITableViewCell's Background color to clear and you are finding you still see white, make sure that the UITableView's background color is set to clear (or whatever you want).
[self.tableView setBackgroundView:nil];
[self.tableView setBackgroundColor:[UIColor clearColor]];
In Swift
tableView.backgroundView = nil
tableView.backgroundColor = UIColor.clearColor()
This is definitely an iOS bug. In iOS 8, setting background color in Interface Builder
works fine for iPhone, but in iPad it's always whiteColor
. To fix it, in the cellForIndexPath
data source message, putting this in:
cell.backgroundColor = cell.backgroundColor
And it will work. This is exactly why I said it's a bug since the code itself is pretty much bullsh*t, but it works.
It could be that your UITableViewCell is selected by default.. You can confirm this using Xcode 6s new visual debugger (or find out exactly which view is causing this white cell to appear).
https://i.stack.imgur.com/A5t5P.png
Interestingly, after knowing this.. setting the background color of the selected cell to clear still didn't work.. doing some more research, turns out i just had to modify the selection style when i'm creating this custom cell:
- (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;
}
I found that none of the above worked from XCode 5.1.1, iOS 7.1.
If you are using Interface Builder with prototype cells, select the prototype cell, then from the attributes selector in the View section, change the Background form default to Clear Color:
https://i.stack.imgur.com/RzMnn.jpg
This seems to work fine. None of the above code changes are needed, either--this is a pure IB solution.
The accepted answer did not fix the problem for me. I had to do this:
In the interface builder, select the table view. Then from the attributes inspector, from the View section, set the Background to transparent (0% opacity).
https://i.stack.imgur.com/QB6Ki.png
From the table's data source class cellForRowAtIndexPath method: cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; cell.backgroundColor = [UIColor clearColor]; //Make cell transparent
cell = [tableView dequeueReusableCellWithIdentifier:<#Reuse ID#> forIndexPath:indexPath]
. In earlier versions you drop the indexPath argument and then test for nil, instantiating with initWithStyle:reuseIdentifier
as per your code snippet in the nil case.
Swift 1.2 Solution:
Just add an explicit definition for your cell's background color like so:
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
// Configure the cell...
cell.backgroundColor = UIColor.clearColor()
return cell
}
For me setting cell.backgroundColor = cell.contentView.backgroundColor;
either in tableView:willDisplayCell:forRowAtIndexPath:
or tableView:cell:forRowAtIndexPath:
did the job.
This is because I set the contentView's background colour in Interface Builder as desired.
When adding UI objects to a cell, Xcode 5/IOS 7 adds a new "Content View" which will be the superview of all elements in the cell. To set the background color of the cell, set the background color of this Content View. The solutions above didnt work for me but this one worked well for me.
Had a similar problem, had to
Set blue as the selectionStyle and add this to the code to correct it 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 }
You can also use colour code in order to make your UITableView Cell lucrative.
[cell setBackgroundColor:[self colorWithHexString:@"1fbbff"]];
This is the code for applying colour code method:
-(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];
}
Success story sharing
tableView:cellForRowAtIndexPath:
method.