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


107

Ci sto lavorando da circa 2 giorni, quindi ho pensato di condividere con voi i miei insegnamenti.

La domanda è: è possibile ridurre la larghezza di una cella in un UITableView raggruppato?

La risposta è no.

Ma ci sono due modi per aggirare questo problema.

Soluzione # 1: una tabella più sottile È possibile modificare la cornice di tableView, in modo che la tabella sia più piccola. Ciò si tradurrà in UITableView che renderizza la cella all'interno con la larghezza ridotta.

Una soluzione per questo può essere simile a questa:

-(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: avere celle renderizzate 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 molte possibilità. Questo è ciò che restava.


3
Penso che questo avrebbe dovuto essere impostato come una domanda con solo la seconda riga ("La domanda è: ..."), quindi la Soluzione # 1 e la Soluzione # 2 pubblicate come due risposte separate, con una di esse accettata. Quindi, se altri utenti aggiungono le proprie risposte e una di esse finisce per essere migliore, la risposta accettata può essere modificata in seguito.
General Mike

Risposte:


226

Un modo migliore e più pulito per ottenere ciò è creare sottoclassi UITableViewCell e sovrascrivere il suo -setFrame:metodo in questo modo:

- (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 non è affidabile, il controller della vista superiore o genitore potrebbe regolare ulteriormente il frame della vista tabella dopo che -viewWillAppear:è stato chiamato. Ovviamente, puoi sottoclassare e sovrascrivere il -setFrame:tuo UITableView proprio come quello che faccio qui per UITableViewCells. Tuttavia, la creazione di sottoclassi di UITableViewCells è un metodo molto comune, leggero e Apple.

    In secondo luogo, se il tuo UITableView ha backgroundView, non vuoi che il suo backgroundView sia ristretto insieme. Mantenere la larghezza di backgroundView mentre si restringe la larghezza di UITableView non è un lavoro banale, per non parlare del fatto che espandere le sottoview oltre la sua superview non è una cosa molto elegante da fare in primo luogo.

  2. Rendering personalizzato delle celle per simulare una larghezza più stretta

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


2
questa è una soluzione carina ed elegante, l'ho fatta in una categoria :) Noterei anche che più oggetti trasparenti, più carico cpu :)
mister koz

11
@misterkoz - una parola di cautela: alcuni controlli iOS (UIDatePicker per definito) utilizzano internamente UITableViewCells e si interrompono se lo implementi in una categoria.
Clafou

7
Questo metodo non sembra funzionare in iOS8 quando si tenta di rimuovere una cella in modalità di modifica. Il setFrame viene chiamato quando si entra / esci dalla modalità di modifica in modo che la cella continui a ridursi. Qualche soluzione a questo?
John Baum

3
@JohnBaum questo aiuto potrebbe (almeno nel mio caso funziona): stackoverflow.com/questions/25911484/ios-8-cell-resizing/...
HashtagMarkus

2
Questa soluzione è davvero una manna dal cielo. Nel caso qualcuno si stia chiedendo come fare lo stesso in swift - reddit.com/r/swift/comments/2fr849/…
sysuser

16

Per fare ciò in Swift, che non fornisce metodi per impostare le variabili, dovrai sovrascrivere il setter per frame. Postato originariamente (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
    }
}

Lavora per Swift
Simon McNeil

9

Se non funziona niente puoi provare questo

Rendi il colore di sfondo della cella un colore chiaro e quindi 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 anche il colore di sfondo dell'etichetta su un colore chiaro.


8

Ho scoperto che la soluzione accettata non funzionava durante la rotazione. Per ottenere UITableViewCells con larghezze fisse e margini flessibili, ho semplicemente adattato la soluzione di cui sopra 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.


0

Esiste un metodo che viene chiamato quando lo schermo viene ruotato: viewWillTransitionToSize

Qui è dove dovresti ridimensionare la cornice. Vedi esempio. Cambia le coordinate del telaio come necessario.

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

-2

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


-6

Nel file .h aggiungere il delegato "UITableViewDataSource"

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

4
Vuole impostare la larghezza, non l'altezza
Christopher Pickslay

oh hoo. grida per il disagio.
bharath gangupalli

tu fraintendi la domanda e rispondi per l'altezza e sai cosa sta funzionando per me perché sto cercando l'altezza non la larghezza .. grazie per la risposta
Pooja
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.