2015-04-24 23 views
6

Ho progettato una vista personalizzata come vista dell'intestazione del mio UITableView. proprio come questo (ho appena messo immagine link qui invece di immagine dal momento che non ho 10 reputazioni.)La vista dell'intestazione della tabella personalizzata si sovrappone alle celle della vista tabella

http://i.stack.imgur.com/KhNbE.png

Poi nel mio UITableViewController Io uso questo punto di vista come tableHeaderView

override func viewDidLoad() { 
    tableView.tableHeaderView = headerView! 
    //...other things 
} 

Ho ricevuto il testo da un JSON per soddisfare lo ContentLabel. Se il testo è lungo, il headerView si sovrappongono le cellule proprio come l'immagine qui sotto. (Breve testo è OK)

http://i.stack.imgur.com/gtO2g.png

sezione è visibile, ma due linee di cellule sono state sovrapposte dal headerView.I'm non certo se ho sbagliato vincoli o codice su ContentLabel. Di seguito è riportato il codice che ho configurato il contentLabel in TopicHeaderView.swift

var content: String? { 
    didSet { 
    self.contentLabel.text = content! 

    self.setNeedsUpdateConstraints() 
    self.updateConstraintsIfNeeded() 
    self.setNeedsLayout() 
    self.layoutIfNeeded() 

    } 
} 
func setFrameHeight(height: CGFloat) { 
    var frame = self.frame 
    frame.size.height = height 
    self.frame = frame 
} 

override func layoutSubviews() { 
    super.layoutSubviews() 
    self.contentLabel.preferredMaxLayoutWidth =  self.contentLabel.alignmentRectForFrame(contentLabel.frame).width 
    self.titleLabel.preferredMaxLayoutWidth = self.titleLabel.bounds.size.width 
    self.authorLabel.preferredMaxLayoutWidth = self.authorLabel.bounds.size.width 
    self.setFrameHeight(CGRectGetMaxY(contentLabel.frame) + 8) 

} 

ho passato in rassegna domande simili a SO, ma sembra non riesco a trovare una soluzione per risolvere il mio problema. Qualcuno può aiutare su questo?

Modificato:

mi sono collegato l'origine CGPoint della mia prima cella tableView e l'altezza di headerView. Mostra il numero giusto che significa che la prima cella si trova proprio accanto alla vista dell'intestazione in verticale. C'è un gap di 22 punti a causa dell'altezza della sezione, ovviamente.

headerheight:600.0 
first cell's y: 622.0 

Quindi forse il problema dell'etichetta è che l'altezza è troppo grande per superare i limiti di TableView headerView? Non ne sono sicuro.

MODIFICATO:

Le cose strane accadono. Ho registrato il valore y del fondo inferiore di headerView, contentLabel inferiore e la prima origine di UITableViewCell. Si prega di vedere l'immagine dal link nel commento della domanda qui sotto (hanno ancora bisogno di 10 reputazione)

Come si può vedere, dal valore in console, la sequenza di visualizzazione dall'alto dovrebbe essere "bottom di ContentLabel (valore: 224) - header's bound bounds (valore: 232) - origine della prima cella (valore: 254) ". Ma nel simulatore, la sequenza è completamente incasinata. Si trasforma in "headerView's bottom bounds - origine della prima cella - contentLabel's bottom"

Apprezzo davvero se qualcuno può aiutare in questo.

+0

immagine link: http://i.stack.imgur.com/xMuAB.png – behumble

+0

Hai sovrascrivere 'tableView (tableView: UITableView, sezione heightForHeaderInSection: Int) -> CGFloat' ?. – sahara108

risposta

3

Il problema è che UITableView non cambia automaticamente la posizione delle celle quando l'altezza di headerView cambia. Per questo motivo è necessario ricaricareogni volta.

+0

Ho provato ma non ho funzionato. Ho registrato il punto di partenza CGPoint della mia prima cella TableView e l'altezza di headerView. Mostra il numero giusto che significa che la prima cella si trova proprio accanto alla vista dell'intestazione in verticale. Quindi dubito che forse è il problema dell'etichetta. l'altezza è troppo grande per superare i limiti di headerView. Probabilmente? – behumble

+0

Vedo un'altra potenziale trappola: in 'layoutSubviews()' quando si chiama 'self.setFrameHeight()' Non penso che 'contentLabel' abbia aggiornato il suo frame. Prova a chiamare 'self.contentLabel.layoutIfNeeded()' –

+0

Ciao Jakub, in realtà il frame è stato modificato correttamente ... ma solo in console. Si prega di vedere la mia ultima modifica. Mi ha davvero confuso. – behumble

-1

Selezionare la vista dell'intestazione o l'immagine. Visualizzare quello che si trova lì e controllare Clip Subviews nella scheda Attributes Inspector.

Questo ha funzionato per me. Before

Storyboard

Problemi correlati