2010-11-17 23 views
16

In ogni UITableViewCell di UITableView sto posizionando un'immagine nel suo imageView. Tuttavia, se aumentare l'altezza di una cella utilizzando tableView: heightForRowAtIndexPath: per accogliere più testo, ho scoperto che:Posizionamento dell'immagine imageView di UITableViewCell

  1. L'immagine è allineato al centro in verticale.
  2. Il margine sinistro dell'immagine aumenta. Questo spinge il testo a destra in modo che il suo margine sinistro non sia più allineato con il testo nelle celle sopra e sotto.

vorrei che l'immagine sia superiore allineato verticalmente, in modo che sia nell'angolo superiore sinistro della cella (come la prima cella nell'immagine sotto) e non avere il suo margine sinistro aumentato (in modo che il margine sinistro del testo nella seconda cella sia allineato con il testo nella prima cella).

Alterazione di frame, centro, ecc. Di imageView sembra non aver effetto. Qualche idea? Grazie ...

(Ho un'immagine del problema, ma così non mi permette di postare un'immagine ancora perché io sono un noob con meno di 10 reputazione. Grrr ...)

risposta

0

È puoi creare una cella personalizzata e posizionare gli oggetti dove ti occorrono, oltre a impostare i valori della maschera automatica.

6

Nel momento in cui pensi di dover regolare le dimensioni o le posizioni degli articoli negli stili predefiniti, è il momento in cui devi pensare di creare una cella personalizzata con i tuoi oggetti dimensionati e posizionati nel modo desiderato. Questo è il motivo per cui è possibile creare celle personalizzate. :)

+0

destro, si dovrebbe pasticciare con la cella ASPETTO "built-in". – Rivera

+0

Rivera: dovresti? –

45

È necessario sottoclasse UITableViewCell e sovrascrivere layoutSubviews, come segue:

- (void) layoutSubviews 
{ 
    [super layoutSubviews]; 

    self.imageView.frame = CGRectMake(10, 10, 50, 50); // your positioning here 
} 

Nel vostro cellForRowAtIndexPath: metodo, assicurarsi di restituire un'istanza del nuovo tipo di cellula.

+0

Puoi spiegare dove questo approccio è spiegato nei documenti Apple? Ad esempio, perché non puoi fare imageView.frame = CGRectMake (10,10,50,50)? (questo non funziona, ma non riesco a capire perché non funziona. Sembra che dovrebbe) – Ian

+2

Non funziona perché la superclasse fa il layout nella sua implementazione di layoutSubviews. Chiamando [super layoutSubviews] le superclasse posizioneranno l'imaveView e qualsiasi altra etichetta/icone, e quindi potrai riposizionarle. – TomSwift

+0

Potrebbe aiutare a capire che UITableViewCell è solo un UIView, che gestisce e posiziona queste etichette e le immagini di subview per te "gratuitamente".Potresti facilmente riprendere il disegno dell'intera cella e fare tutto ciò che vuoi (ad esempio, rimbalzare intorno a una palla). Ad un certo punto nella curva di personalizzazione, è proprio quello che dovresti fare. Il tipo di sottoclasse che Tom suggerisce è un piccolo passo in quella direzione. –

1

Una funzione davvero utile si potrebbe non avere provato (in UITableViewDelegate) è tableView:willDisplayCell:forRowAtIndexPath:. Viene chiamato immediatamente prima che venga visualizzata una cella e il suo scopo è quello di consentire di eseguire operazioni sul layout senza il il sistema operativo che lo modifica nuovamente prima della visualizzazione. Effettivamente hai il controllo totale. L'ho usato per cambiare i caratteri nelle celle, ma puoi anche scorrere le visualizzazioni secondarie della cella e modificare i loro fotogrammi.

Ancora sono d'accordo sul punto in cui è il momento di esaminare le celle personalizzate e smettere di combattere il sistema operativo. Non è difficile da fare e Apple dà un buon esempio in Table View Programming Guide for iOS.

+0

Ho provato a farlo ma ha ancora riposizionato l'immagine nel mezzo della mia cella di visualizzazione tabella: 'cell.imageView.frame = CGRectMake (10, 10, 50, 50);'. Hai un'idea del perché? – Besi

+2

Non funziona su iOS 6 – Philip007

4

Un altro modo (funziona in iOS 6) è quello di creare un UIImageView e aggiungerlo alla cella come una visualizzazione secondaria

UIImageView *yourImageView = [[UIImageView alloc] initWithFrame:CGRectMake(x,y,20,20)]; 

[yourImageView setImage:[UIImage imageNamed:[imagesArray objectAtIndex:indexPath.row]]]; //You can have an Array with the name of 

[yourcell.contentView addSubview:yourImageView]; //add the imageView as a subview 
+4

Non aggiungere direttamente la vista personalizzata su 'UITableViewCell'. Invece, posizionali sotto l'oggetto 'contentView'. Ecco come viene progettata la classe di celle. (consultare la documentazione Apple) Se si posiziona la vista direttamente sulla cella, potrebbe causare risultati imprevisti. – Eonil

Problemi correlati