Come impostare la larghezza di una cella in un UITableView in stile raggruppato

Ho lavorato su questo per circa 2 giorni, quindi ho pensato di condividere le mie conoscenze con te.

La domanda è: è ansible rendere più piccola la larghezza di una cella in un UITableView raggruppato?

La risposta è no.

Ma ci sono due modi per aggirare questo problema.

Soluzione n. 1: una tabella più sottile È ansible modificare la cornice di tableView, in modo che la tabella sia più piccola. Ciò comporterà che UITableView esegua il rendering della cella all’interno con la larghezza ridotta.

Una soluzione per questo può assomigliare a questo:

-(void)viewWillAppear:(BOOL)animated { CGFloat tableBorderLeft = 20; CGFloat tableBorderRight = 20; CGRect tableRect = self.view.frame; tableRect.origin.x += tableBorderLeft; // make the table begin a few pixels right from its origin tableRect.size.width -= tableBorderLeft + tableBorderRight; // reduce the width of the table tableView.frame = tableRect; } 

Soluzione n. 2: celle rese da immagini

Questa soluzione è descritta qui: http://cocoawithlove.com/2009/04/easy-custom-uitableview-drawing.html

Spero che questa informazione ti sia stata di aiuto. Mi ci sono voluti circa 2 giorni per provare un sacco di possibilità. Questo è ciò che è rimasto.

Un modo migliore e più pulito per raggiungere questo objective è la sottoclass di UITableViewCell e l’override del suo -setFrame: metodo come questo:

 - (void)setFrame:(CGRect)frame { frame.origin.x += inset; frame.size.width -= 2 * inset; [super setFrame:frame]; } 

Perché è meglio? Perché gli altri due sono peggio.

  1. Regola la larghezza della vista tabella in -viewWillAppear:

    Prima di tutto, questo è inaffidabile, la superview o il controllore della vista genitore può regolare ulteriormente il frame di visualizzazione della tabella dopo -viewWillAppear: viene chiamato. Naturalmente, puoi creare sottoclassi e sovrascrivere -setFrame: per il tuo UITableView proprio come quello che faccio qui per UITableViewCells. Tuttavia, la sottoclassi di UITableViewCells è un modo molto comune, leggero e Apple.

    In secondo luogo, se UITableView ha backgroundView, non vuoi che il suo backgroundView venga ristretto insieme. Mantenere lo sfondo della larghezza della vista mentre restringi la larghezza di UITableView non è un lavoro banale, per non parlare del fatto che le sottoview in espansione oltre la sua superview non sono una cosa molto elegante da fare in primo luogo.

  2. Rendering cella personalizzato per falsificare una larghezza più stretta

    Per fare ciò, devi preparare speciali immagini di sfondo con margini orizzontali, e devi disporre le sottoview delle celle per adattarle ai margini. In confronto, se si regola semplicemente la larghezza dell’intera cella, l’autoresizzazione farà tutto il lavoro per te.

Per fare ciò in Swift, che non fornisce metodi per impostare le variabili, dovrai sovrascrivere il setter per il frame . Originariamente pubblicato (almeno dove l’ho trovato) qui

 override var frame: CGRect { get { return super.frame } set (newFrame) { let inset: CGFloat = 15 var frame = newFrame frame.origin.x += inset frame.size.width -= 2 * inset super.frame = frame } } 

Se non funziona niente puoi provarlo

Rendi il colore di sfondo della cella come un colore chiaro e poi inserisci un’immagine della cella con le dimensioni richieste. Se vuoi visualizzare del testo su quella cella, metti un’etichetta sopra l’immagine. Non dimenticare di impostare il colore di sfondo dell’etichetta anche per cancellare il colore.

Ho trovato che la soluzione accettata non funzionava a rotazione. Per ottenere UITableViewCells con larghezze fisse e margini flessibili ho adattato la soluzione sopra riportata a quanto segue:

 - (void)setFrame:(CGRect)frame { if (self.superview) { float cellWidth = 500.0; frame.origin.x = (self.superview.frame.size.width - cellWidth) / 2; frame.size.width = cellWidth; } [super setFrame:frame]; } 

Il metodo viene chiamato ogni volta che il dispositivo ruota, quindi le celle saranno sempre centrate.

C’è un metodo che viene chiamato quando lo schermo viene ruotato: viewWillTransitionToSize

Questo è dove devi ridimensionare la cornice. Vedi esempio. Cambia le corde del canvasio quando è necessario.

 - (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id)coordinator { [coordinator animateAlongsideTransition:nil completion:^(id context) { int x = 0; int y = 0; self.tableView.frame = CGRectMake(x, y, 320, self.tableView.frame.size.height); }]; } 

lo faccio dentro

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell; CGFloat tableBorderLeft = self.view.frame.origin.x + 10; CGFloat tableBorderRight = self.view.frame.size.width - 20; CGRect tableRect = self.view.frame; tableRect.origin.x = tableBorderLeft; tableRect.size.width = tableBorderRight; tableView.frame = tableRect; } 

E questo ha funzionato per me

Nel file .h aggiungere il delegato ‘UITableViewDataSource’

 -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return size; }