2009-05-22 11 views
50

Y a-t-il un moyen de définir une vue en arrière-plan sur un UITableViewController?iPhone - Définition de l'arrière-plan sur UITableViewController

J'essaye avec le code que j'utilise sur un UIViewController, mais la vue vient sur tout le contenu de la vue de table. Si j'ajoute l'arrière-plan dans le cellForRowAtIndexPath-method, il ne s'affiche pas du tout. Quelqu'un a-t-il déjà fait cela ou a-t-il une idée sur la façon de le faire? Voici le code que je utilise:

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

Répondre

68

(Ceci est essentiellement le même que la solution de Hans Espen ci-dessus, mais utilise des méthodes pratiques pour la brièveté)

Mettez dans votre - Méthode [UITableViewControllerSubclass viewDidLoad]:

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

Il n'y a aucun point en évitant quelques autoreleases dans une méthode viewDidLoad, car elle est rarement appelée (lorsque la vue est réellement chargée) et aura donc un impact négligeable sur les performances.

N.B. Vous devez toujours utiliser les images PNG sur l'iPhone, pas JPEG ou tout autre format.

+0

Pourquoi seulement .png pour iOS? –

+13

Je devrais clarifier - utiliser le format PNG pour tout ce qui n'est pas photographique. Les fichiers PNG sont accélérés par les GPU sur les appareils iOS. Toutes vos images d'interface utilisateur doivent donc être au format PNG. PNG prend en charge la transparence alpha, ce qui est une nécessité pour de nombreux graphiques d'interface utilisateur. Pour tout ce qui est photographique, la compression JPEG vous donnera des tailles de fichier plus petites, ce qui peut être un avantage. –

+2

Cela définit l'arrière-plan de chaque groupe lorsque la table est définie sur un style groupé, y at-il un moyen de résoudre ce problème? –

6

En fait, je l'ai travaillé! :)

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]; 
0
self.parentViewController.view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"yourImage.png"]]; 
72

Je sais que ça fait longtemps, mais juste pour le dossier .. Je pense avoir trouvé une meilleure solution en utilisant UITableView.backgroundView:

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

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

J'ai essayé avec une taille d'image de 320x480 sur iPhone , et fonctionne parfaitement (j'ai essayé avec .jpg aussi).

+1

Cela a fonctionné très bien! – Das

+1

Ceci est mieux, va derrière l'en-tête ainsi – powerj1984

+0

convenu, utilisé cette solution sur celle utilisant un modèle de couleur. –

5

Pour Swift utiliser,

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

Cette solution fonctionne pour moi, mais j'ai découvert, que les propriétés pour opaque, bgcolor ... dans xcode 8 ne sont pas acceptées pour les anciennes versions (iOS 9 par exemple). Je ne sais pas, si j'ai manqué quelque chose, mais j'ai construit une solution, en référençant les viewviewcells comme des points de vente au code et les ai rendus opaques et le backgroundview nul. Peut-être que cela aidera quelqu'un d'autre :) –

0

Dans C# pour une UITableViewController statique avec des sections que vous pouvez utiliser:

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

    } 
} 

Le résultat peut être quelque chose comme ceci:

Setting TableViewController grading background