2009-05-22 16 views
50

Czy jest jakiś sposób ustawić widok tła na UITableViewController?iPhone - Ustawianie tła na UITableViewController

Próbuję z kodem używanym na UIViewController, ale widok obejmuje całą zawartość widoku tabeli. Jeśli dodaję widok tła w cellForRowAtIndexPath-method, w ogóle się nie wyświetla. Czy ktoś to wcześniej zrobił lub miał pomysł, jak to zrobić? Oto kod używam:

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

Odpowiedz

68

(To jest w zasadzie taki sam jak roztwór Hans Espen za wyżej, ale używa metod wygoda dla zwięzłość)

umieścić to w swoim - metody [UITableViewControllerSubclass viewDidLoad]:

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

Nie ma sensu w unikaniu kilku autorelease w metodzie viewDidLoad, ponieważ jest ona rzadko wywoływana (gdy widok faktycznie się ładuje), a zatem będzie miał znikomy wpływ na wydajność.

N.B. Zawsze powinieneś używać obrazów PNG na iPhonie, a nie JPEG lub jakimkolwiek innym formacie.

+0

Dlaczego tylko .png na iOS? –

+13

Powinienem wyjaśnić - użyj PNG do wszystkiego, co nie jest fotograficzne. Pliki PNG są przyspieszane sprzętowo przez procesory graficzne na urządzeniach z systemem iOS, więc wszystkie obrazy interfejsu użytkownika powinny mieć format PNG. PNG obsługuje przezroczystość alfa, co jest koniecznością dla wielu grafik interfejsu użytkownika. Cokolwiek fotograficznego, kompresja JPEG zapewni mniejsze rozmiary plików, więc może to być korzystne. –

+2

Powoduje to ustawienie tła dla każdej grupy, gdy tabela jest ustawiona na styl zgrupowany, czy istnieje sposób na rozwiązanie tego problemu? –

6

Właściwie mam to działa! :)

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

wiem, że to było dawno, ale tylko dla porządku .. Chyba znalazłem lepsze rozwiązanie korzystając UITableView.backgroundView:

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

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

Próbowałem z rozmiarze 320x480 na iPhone i działa idealnie (próbowałem również z .jpg).

+1

To działało świetnie !! – Das

+1

To jest lepsze, zgodził się z nagłówkiem, jak również zgodził się – powerj1984

+0

, użył tego rozwiązania nad tym, używając wzorca koloru. –

5

Dla Swift wykorzystania tego,

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

To rozwiązanie działa dla mnie, ale okazało się, że właściwości nieprzezroczyste, bgcolor ... w kodzie x 8 nie są akceptowane w starszych kompilacjach (na przykład iOS 9). Nie wiem, czy coś przeoczyłem, ale stworzyłem rozwiązanie, odwołując się do komórek widoku tabeli jako ujścia do kodu i sprawiłem, że były nieprzezroczyste, a widok tła zerowy. Może to pomoże komuś innemu :) –

0

W C# dla statycznego UITableViewController z odcinków można użyć:

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

    } 
} 

wynik może być coś takiego:

Setting TableViewController grading background

Powiązane problemy