2009-05-22 7 views
50

C'è un modo per impostare una vista di sfondo su un UITableViewController?iPhone - Impostazione dello sfondo su UITableViewController

Provo con il codice che sto usando su un UIViewController, ma la vista viene su tutto il contenuto della vista tabella. Se aggiungo la vista di sfondo nello cellForRowAtIndexPath-method, non viene visualizzata affatto. Qualcuno l'ha già fatto prima o ha un'idea su come può essere fatto? Ecco il codice che sto usando:

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

risposta

68

(Questo è fondamentalmente lo stesso come la soluzione di Hans Espen sopra, ma utilizza metodi di convenienza per brevità)

Mettete questo nella vostra - Metodo [UITableViewControllerSubclass viewDidLoad]:

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

Non ha senso per evitare un paio di autoreleases in un metodo viewDidLoad, poiché viene chiamato solo raramente (quando la vista viene effettivamente caricata) e quindi avrà un impatto trascurabile sulle prestazioni.

N.B. Dovresti sempre usare le immagini PNG su iPhone, non su JPEG o altri formati.

+0

Perché solo .png per iOS? –

+13

Dovrei chiarire: usa PNG per tutto ciò che non è fotografico. I PNG sono hardware accelerati dalle GPU su dispositivi iOS, quindi tutte le immagini dell'interfaccia utente devono essere in formato PNG. PNG supporta la trasparenza alfa, che è una necessità per molti elementi grafici dell'interfaccia utente. Per qualsiasi cosa fotografica, la compressione JPEG ti darà file di dimensioni più piccole, quindi potrebbe essere un vantaggio. –

+2

Questo imposta lo sfondo di ogni gruppo quando la tabella è impostata su uno stile raggruppato, c'è un modo per risolvere questo? –

6

In realtà, ho ottenuto che funziona! :)

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

So che è passato molto tempo, ma solo per la cronaca .. Credo di avere trovato una soluzione migliore usando UITableView.backgroundView:

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

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

ho provato con una dimensione dell'immagine di 320x480 su iPhone e funziona perfettamente (ho provato anche con .jpg).

+1

Questo ha funzionato alla grande !! – Das

+1

Questo è meglio, va anche dietro l'intestazione – powerj1984

+0

d'accordo, usato questa soluzione su quella usando un modello di colore. –

5

Per Swift uso questo,

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

Questa soluzione funziona per me, ma ho scoperto che le proprietà per opaque, bgcolor ... in xcode 8 non sono accettate per le versioni precedenti (ad esempio iOS 9). Non so, se mi fosse sfuggito qualcosa, ma ho costruito una soluzione, riferendomi alle codeviewcells come punti di uscita del codice e rendendoli opachi e con lo sfondo zero. Forse questo aiuterà qualcun altro :) –

0

In C# per un UITableViewController statico con le sezioni è possibile utilizzare:

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

    } 
} 

Il risultato può essere qualcosa di simile:

Setting TableViewController grading background