50

Is there any way to set a background view on a UITableViewController?

I try with the code I am using on a UIViewController, but the view comes over all the contents of the table view. If I add the background view in the cellForRowAtIndexPath-method, it is not showing at all. Has anyone done this before or have an idea on how it can be done? Here is the code I am using:

UIImage *image = [UIImage imageNamed: @"background.jpg"];
UIImageView *backImage = [[UIImageView alloc] initWithImage: image];
[self.view addSubview: backImage];
[self.view sendSubviewToBack: backImage];

Linger's user avatar

Linger

15.1k23 gold badges54 silver badges79 bronze badges

asked May 22, 2009 at 15:04

Hans Espen's user avatar

72

I know it's been a long time, but just for the record.. I Think I found a better solution using UITableView.backgroundView:

UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"lisbon.png"]];

self.tableView.backgroundView = imageView;
[imageView release];

I tried with an image size of 320x480 on iPhone, and works perfect (I have tried with .jpg also).

answered Feb 29, 2012 at 16:46

Frade's user avatar

4 Comments

This is better, goes behind the header as well

agreed, used this solution over the one using a color pattern.

@MárioCarvalho ainda bem que funcionou! ;)

This method works but it inserts the background to the ViewController, instead i need to add a background just to the content of the TableView (I don't want the background to be inserted behind the header or the footer of the TableView)

68

(This is basically the same as Hans Espen's solution above, but uses convenience methods for brevity)

Put this in your -[UITableViewControllerSubclass viewDidLoad] method:

self.tableView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"BackgroundPattern.png"]];

There's no point in avoiding a couple of autoreleases in a viewDidLoad method, since it only gets called rarely (when the view actually loads) and will therefore have negligible impact on performance.

N.B. You should always use PNG images on the iPhone, not JPEG or any other format.

iDev's user avatar

iDev

23.3k7 gold badges63 silver badges86 bronze badges

answered Mar 17, 2010 at 2:38

Nick Forge's user avatar

Nick Forge

21.5k7 gold badges59 silver badges81 bronze badges

7 Comments

I should clarify - use PNG for everything that isn't photographic. PNGs are hardware accelerated by the GPUs on iOS devices, so all of your UI images should be in PNG format. PNG supports alpha transparency, which is a necessity for a lot of UI graphics. For anything photographic, JPEG compression will give you smaller file sizes, so that may be a benefit.

This sets the background of each group when the table is set to a grouped style though, is there a way to solve this?

As of iOS 3.2, there's a UITableView.backgroundView property, which AFAIK makes the color/pattern workaround redundant (if you can drop pre-3.2 support).

Where can we find an answer to this question that utilizes UITableView.backgroundView? I'll upvote if you add a new answer and tag me.

initWithNibName is not god, need on didLoad or willAppear! God answer

|

6

Actually, I got it working! :)

NSString *backgroundPath = [[NSBundle mainBundle] pathForResource:@"background" ofType:@"jpg"];
UIImage *backgroundImage = [UIImage imageWithContentsOfFile:backgroundPath];
UIColor *backgroundColor = [[UIColor alloc] initWithPatternImage:backgroundImage];
self.tableView.backgroundColor = backgroundColor; 
[backgroundColor release];

answered May 22, 2009 at 15:10

Hans Espen's user avatar

Hans Espen

1,1176 gold badges14 silver badges22 bronze badges

Comments

5

For Swift use this,

self.tableView.backgroundView = UIImageView(image: UIImage(named: "backgroundImage.png"))

answered Dec 29, 2014 at 6:51

Zaid Pathan's user avatar

Zaid Pathan

16.9k7 gold badges105 silver badges136 bronze badges

1 Comment

This solution is working for me, but I found out, that the properties for opaque, bgcolor... in xcode 8 aren't accepted for older builds (iOS 9 for example). I don't know, if I missed something, but I built a solution, referencing the tableviewcells as outlets to the code and made them opaque and the backgroundview nil. Maybe this will help someone else :)

0

self.parentViewController.view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"yourImage.png"]];

Adrian P's user avatar

Adrian P

6,5294 gold badges40 silver badges55 bronze badges

answered Sep 29, 2011 at 9:02

Sandip Patel - SM's user avatar

Comments

0

In C# for a static UITableViewController with sections you can use:

using System;
using Foundation;
using UIKit;
using CoreGraphics;
using CoreAnimation;

namespace MyNamespace
{
    public class CustomTableViewController : UITableViewController
    {
        public override void ViewDidLoad()
        {
            base.ViewDidLoad();

            SetGradientBackgound();
        }

        private void SetGradientBackgound()
        {
            CGColor[] colors = new CGColor[] {
                UIColor.Purple.CGColor,
                UIColor.Red.CGColor,
            };

            CAGradientLayer gradientLayer = new CAGradientLayer();
            gradientLayer.Frame = this.View.Bounds;
            gradientLayer.Colors = colors;
            gradientLayer.StartPoint = new CGPoint(0.0, 0.0);
            gradientLayer.EndPoint = new CGPoint(1.0, 1.0);

            UIView bgView = new UIView()
            {
                Frame = this.View.Frame
            };
            bgView.Layer.InsertSublayer(gradientLayer, 0);

            UITableView view = (UITableView)this.View;
            view.BackgroundColor = UIColor.Clear;
            view.BackgroundView = bgView;
        }

        // Setting cells background transparent
        public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath)
        {
            var cell = base.GetCell(tableView, indexPath);
            cell.BackgroundColor = UIColor.Clear;
            return cell;
        }

        // Setting sections background transparent
        public override void WillDisplayHeaderView(UITableView tableView, UIView headerView, nint section)
        {
            if (headerView.GetType() == typeof(UITableViewHeaderFooterView))
            {
                UITableViewHeaderFooterView hView = (UITableViewHeaderFooterView)headerView;
                hView.ContentView.BackgroundColor = UIColor.Clear;
                hView.BackgroundView.BackgroundColor = UIColor.Clear;
            }
        }

    }
}

The result can be something like this:

Setting TableViewController grading background

answered Jan 23, 2018 at 5:07

neurona.dev's user avatar

neurona.dev

1,4071 gold badge15 silver badges13 bronze badges

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.