Domanda

applicazioni per iPhone di Apple come la musica e Contants utilizzare una barra di ricerca in un UITableView. Quando si scorre verso il basso in modo che la barra di ricerca si muove verso il basso, lo spazio vuoto sopra il contenuto della vista di scorrimento ha un colore di sfondo grigio chiaro (vedi screenshot).

Schermata di applicazione Contatti che mostra sfondo grigio chiaro

(Si noti che la barra di ricerca ha una linea di bordo leggermente più scura alla sua sommità. Questo non è lì per il default UISearchBar, ma sottoclassi dovrebbe prendere cura di questo.)

Ho provato a fissare il colore di sfondo UITableView, ma che influenza le righe pure. Qualcuno sa come ottenere questo effetto? Sto andando ad avere per sostituire implementare drawRect: o c'è una costruito nel modo

?
È stato utile?

Soluzione

A partire da iOS 7, si può sperimentare questo cambiando la vista Tableview sfondo.

[self.tableView setBackgroundView:view];

make colore di sfondo della vista lo stesso come il colore vista padre.

Altri suggerimenti

Impostazione lucidi è un male per le prestazioni. Quello che vogliamo è la zona grigia sopra la barra di ricerca, ma dovrebbe comunque essere bianco oltre la fine della lista.

È possibile aggiungere una visualizzazione secondaria al vostro UITableView che vive sopra il contenuto, invece.

CGRect frame = self.list.bounds;
frame.origin.y = -frame.size.height;
UIView* grayView = [[UIView alloc] initWithFrame:frame];
grayView.backgroundColor = [UIColor grayColor];
[self.listView addSubview:grayView];
[grayView release];

Si potrebbe aggiungere più roba di fantasia per la vista, se volete, forse una dissolvenza, o di una linea di divisione, senza sottoclasse UISearchBar.

Questo è uno dei miei trucchi preferiti molto.

UIView *topview = [[[UIView alloc] initWithFrame:CGRectMake(0,-480,320,480)] autorelease];
topview.backgroundColor = [UIColor colorWithRed:226.0/255.0 green:231.0/255.0 blue:238.0/255.0 alpha:1];

[self.tableView addSubview:topview];

In sostanza si sta creando una grande vista la dimensione dello schermo e l'immissione "al di sopra" del contenuto. Non sarai mai in grado di scorrere verso l'alto passato.

E non preoccuparti per l'impatto della memoria di un UIView che è 320x480 pixel, non consumerà la memoria significativa, perché il CALayer non ha alcun contenuto significativo.

Nota: Perché questa risposta rilevante quando la risposta "accettato" è molto più semplice? Perché non è sufficiente impostare la backgroundView sulla visualizzazione della tabella? È perché, in caso di applicazione Contatti, come mostrato nella domanda iniziale, l'area "sopra" la vista tavolo ha un diverso colore di sfondo (azzurro) rispetto alla zona "sotto" la visualizzazione della tabella (bianca). Questa tecnica permette di avere due diversi colori sopra e sotto la vista della tabella, che non può essere compiuta da un semplice sfondo.

Modifica 1/2018: Come Tom nei commenti sottolineato, questa risposta è piuttosto vecchio e presuppone che tutti i dispositivi iOS hanno la stessa dimensione dello schermo (sembra folle ma è stato il caso nel 2009, quando ho risposto a questa). Il concetto che presento qui funziona ancora, ma si dovrebbe usare UIScreen.main.bounds per capire il reale dimensioni dello schermo, o si potrebbe entrare in alcune cose layout automatico di fantasia (suggerimenti benvenuti). Non consiglio usando tableView.bounds come in un'altra risposta, perché di solito in viewDidLoad le dimensioni del vostro punto di vista non è necessariamente la dimensione che diventeranno dopo che il controllore li ridimensiona. A volte iniziano come 0x0!

Per estendere il di HusseinB suggerimento :

Swift 3

let bgView = UIView()
bgView.backgroundColor = UIColor.white
self.tableView.backgroundView = bgView

Obiettivo C

UIView *bgView = [UIView new];
bgView.backgroundColor = [UIColor whiteColor];
[self.tableView setBackgroundView:bgView];

Questo codice funziona in Swift fot UITableView:

var frame = self.tableView.bounds
frame.origin.y = -frame.size.height
frame.size.height = frame.size.height
frame.size.width = UIScreen.mainScreen().bounds.size.width
let blueView = UIView(frame: frame)
blueView.backgroundColor = UIColor.headerBlueColor()
self.tableView.addSubview(blueView)

Nel Swift (testato su iOS9)

    let backView = UIView(frame: self.tableView.bounds)
    backView.backgroundColor = UIColor.clearColor() // or whatever color
    self.tableView.backgroundView = backView

Ho trovato solo un modo per fare questo. È necessario impostare la backgroundColor del UITableView sia trasparente, impostare il backgroundColor della contentView della cellula di qualsiasi colore si desidera che le cellule attuali per essere, quindi cruciale dovete ottenere il colore grigio chiaro ad apparire dietro l'UITableView. Questo ultimo passo si può fare sia l'impostazione del backgroundColour del UIWindow, o di ciò che è contenente o il vostro tableViewController.

Quindi, a patto di avere un controller della vista che è derivato da UITableViewController, inserire queste righe nel - metodo di (void) viewDidLoad: -

// sets the background of the table to be transparent
self.tableView.backgroundColor = [UIColor colorWithWhite:1.0 alpha:0.0];
// assuming we are inside a navigation or tab controller, set the background
self.parentViewController.view.backgroundColor = [UIColor lightGrayColor];

Poi all'interno della parte di tableView: cellForRowAtIndexPath: che crea nuove cellule, aggiungere: -

// set an opaque background for the cells 
cell.contentView.backgroundColor = [UIColor whiteColor];

Ho appena incontrato questo problema me stesso e trovato una soluzione.

Causa

Spark ispettore per esaminare il layout della vista tabella -. Che mi hanno aiutato

La cosa è, che in questo scenario l'UITableView ha 3 subviews:

  1. UITableViewWrapperView
  2. UIView - Con backgroundColor impostato su colore grigio chiaro
  3. UISearchBar

Mentre si scorrere il contenuto Tableview verso il basso, la seconda altezza visualizzazione secondaria è dinamicamente in aumento per riempire lo spazio tra il UITableViewWrapperView e l'origine telaio UITableView.

Soluzione

L'impostazione della proprietà backgroundColor o backgroundView non avrà effetto il 2 ° visualizzazione secondaria. Quello che dovete fare è trovare il secondo punto di vista e cambiare il suo colore, in questo modo:

if (_tableView.subviews.count > 1) {
    _tableView.subviews[1].backgroundColor = THE_TARGET_COLOR;
}

Nel mio caso avevo bisogno di tutte le viste di essere bianco così ho usato il seguente, che è meno soggetto a cambiamenti futuri della gerarchia vista UITableView da Apple:

for (UIView *subview in _tableView.subviews) {
    subview.backgroundColor = [UIColor whiteColor];
}

soluzione più facile

Il modo più semplice per creare colori diversi nella parte inferiore e nella parte superiore di una zona di rimbalzo di una vista tabella è quello di impostare la chiave tableHeaderBackgroundColor della vista tabella. Facendo in questo modo si imposta il colore superiore. Non sono sicuro, ma forse c'è un'altra chiave per il piè di pagina, date un'occhiata. Se non trovate nulla, basta impostare lo sfondo della vista tabella con il colore che si desidera visualizzare nella parte inferiore. Sopra potete vedere un esempio di codice:

self.table.setValue(UIColor.blue , forKey: "tableHeaderBackgroundColor")

Spero che ti aiuta. Se sì, lasciare che altre persone conoscono questo modo semplice dare un up la risposta:)

A te darò il modo migliore per farlo.
In primo luogo impostare il colore della vista tabella per quello che si desidera in Interface Builder sfondo.
Poi rispondere al metodo tableView:willDisplayCell:ForIndexPath: UITableView delegato come questo

- (void)tableView:(UITableView*)tableView willDisplayCell:(UITableViewCelll*)cell forIndexPath:(NSINdexPath*)indexPath
{
     [cell setBackgroundColor:[UIColor whiteColor]];
}

Un altro metodo consiste
:
nel metodo ViewDidLoad (o dovunque vi piace) impostare il colore di sfondo tableView per cancellare il colore in questo modo:

self.tableView.backgroundColor = [UIColor clearColor];

e quindi impostare il colore al bianco superview

self.tableView.superview.backgroundColor = [UIColor whiteColor];

Non credo che si desidera ignorare drawRect. Molto probabilmente quello che stai vedendo è il colore di un'altra vista o la finestra, che si trova "dietro" (vale a dire è una superview del) la vista sfondo della tabella. Di solito c'è un abbastanza complessi strati di UIViews nei widget UI di Apple. Esplora la gerarchia della vista in GDB, guarda [myView superview] e poi [someSuperView subviews] e cercare manipolando i loro colori BG nel debugger per vedere se si può trovare quale sia. Tuttavia, se si implementa una correzione in questo modo, essere avvertito che potrebbe non essere compatibile con il futuro.

Si potrebbe anche provare a impostare il colore di sfondo di una delle viste dietro la Tableview in Interface Builder (o della finestra stessa).

Se si utilizza un tableviewcell, è possibile impostare lo sfondo al fine di essere di colore bianco opaco. Quindi utilizzare

self.tableView.backgroundColor = [UIColor grayColor];

nella vista ha fatto metodo load.

Sono sicuro che questo è [UITableView backgroundColor]. Aver colpito righe, perché le righe hanno backgroundColor == chiaro (o semi-trasparente). Quindi, se farete righe non trasparente, tutto funzionerà bene. Questa sarà la soluzione.

Ho seguito la punta delineato da Peylow per un UITableView, semplicemente aggiungendo una visualizzazione secondaria. Il mio unico cambiamento dal codice è stato quello di prendere un colore un po 'più vicino a quello usato in applicazioni di Apple, in più ho avuto un po' più vicino allo sguardo di Apple di avere una linea al di sopra del UISearchBar riducendo l'origine cornice coordinata y di un pixel:

frame.origin.y = -frame.size.height - 1

Per chi sta pensando a come fare lo stesso per l'area di rimbalzo basso:

Per prima cosa aggiungere una visualizzazione secondaria con il colore di sfondo desiderato per sfondo vista del vostro vista tabella:

self.bottomView = [[UIView alloc] initWithFrame:CGRectOffset(self.tableView.frame, 0, self.tableView.frame.size.height)];
self.bottomView.backgroundColor = whateverColorYouLike;

[self.tableView.backgroundView addSubview:self.bottomView];

E poi nel delegato del vostro vista tabella:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    CGRect frame = self.bottomView.frame;
    frame.origin.y = self.tableView.contentSize.height - self.tableView.contentOffset.y;
    self.bottomView.frame = frame;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top