2012-12-02 15 views
8

Questo sta facendo la mia testa in :-)personalizzato UITableViewCell in modalità di modifica non muovere le UILabels

Ho un CoreData completamente funzionale popolato UITableView all'interno di un UIViewController e ho implementato con successo il "scorri per eliminare l'opzione" (che è facile) e posso anche cancellare singole istanze con un pulsante di modifica in cui compare il cerchio rosso.

Il mio problema è, e penso che sia perché ho una CustomCell, che quando premo il pulsante di modifica il UILabels non si sposta a destra.

Ho provato a utilizzare -(void)layoutSubViews e pochi altri, ma non funziona.

Ho pubblicato il mio codice per il mio cellForRowAtIndexPath. Questo fa parte di una sezione di note nella mia app. Questo codice funziona, ho solo bisogno di sapere Come spostare le etichette quando vado in modalità Modifica ??

Grazie per i suggerimenti e consigli :-)

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
static NSString *cellIdentifier = @"Cell"; 

MNCustomCell *cell = [_mainTableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath]; 
if (cell == nil) { 
    cell = [[MNCustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; 
} 


//cell.textLabel.text = [_tableArray objectAtIndex:indexPath.row]; 

MNotes *mnotes = [[self fetchedResultsController] objectAtIndexPath:indexPath]; 

cell.noteTitle.text = mnotes.noteTitleString; 
cell.noteSummary.text = mnotes.mainNoteString; 

mnotes.createDate = [[NSDate alloc] init]; 
SORelativeDateTransformer *relativeDateTransformer = [[SORelativeDateTransformer alloc] init]; 
NSString *relativeDate = [relativeDateTransformer transformedValue:mnotes.createDate]; 

cell.noteDate.text = relativeDate; 


cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 

return cell; 
} 

-

//This is the Custom Cell 
@interface MNCustomCell : UITableViewCell 
{ 

} 

@property (strong, nonatomic) IBOutlet UILabel *noteTitle; 
@property (strong, nonatomic) IBOutlet UILabel *noteDate; 

@property (strong, nonatomic) IBOutlet UITextView *noteSummary; 


@end 

-

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier 
    { 
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; 
    if (self) { 
    // Initialization code 

    [self.contentView addSubview:_noteTitle]; 
    [self.contentView addSubview:_noteSummary]; 
    [self.contentView addSubview:_noteDate]; 

    } 
    return self; 
    } 
+0

Sono le vostre etichette aggiunti direttamente alla cella o fatto li si aggiungono a 'contentView' della cellula? Dovrebbero essere nel 'contentView' per loro per regolare automaticamente quando la cella va in modalità di modifica o sono aggiunte altre decorazioni cellulari. – rmaddy

+0

Ho creato una nuova classe personalizzata e li ho trascinati da Storyboard - penso che significhi che sono direttamente sulla cella, giusto ?? –

+0

Ho aggiunto il codice per la mia cella personalizzata - Non ho aggiunto nulla nel file .m - non ho avuto bisogno di occuparmene fino ad ora. –

risposta

8

L'altra soluzione probabilmente funzionerà ma in questo modo farà l'animazione automaticamente per voi. MNCustomCell non ridisegna la vista in base allo stato corrente della cella, ma se si aggiunge l'etichetta al contentView della cella, lo farà.

L'esempio seguente sposta l'etichetta in modo che non interferisca con il pulsante Elimina.

MNCustomCell.m

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { 
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; 
    if (self) { 
     mainLabel = [[[UILabel alloc] initWithFrame:CGRectMake(0.0, 0.0, 220.0, 15.0)]]; 
     mainLabel.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleHeight; 
     [cell.contentView addSubview:mainLabel]; 
+0

Ho aggiunto il codice che hai detto in alto (3 ° lotto di codice) è il posto giusto? Ancora non funziona. Ma nel TableView ho ancora impostato i textlabels come ho ragione ?? –

+0

3 ° lotto di codice? Non sono sicuro di cosa intendi. – Fredrik

+0

Siamo spiacenti, se osservi la domanda originale, ho suddiviso il mio codice inviato in 3 segmenti. il terzo è quello a cui mi riferisco. è proprio in fondo alla domanda. –

1

Implementare i seguenti metodi nella classe di cella personalizzato.

- (void)willTransitionToState:(UITableViewCellStateMask)state 

e

- (void)didTransitionToState:(UITableViewCellStateMask)state 

e spostare l'etichetta di conseguenza.

Dovrebbe essere come

- (void)willTransitionToState:(UITableViewCellStateMask)state { 

    [super willTransitionToState:state]; 

    if ((state & UITableViewCellStateShowingDeleteConfirmationMask) == UITableViewCellStateShowingDeleteConfirmationMask) { 
     label.frame = ... 
    } 
} 

Edit:

- (void)willTransitionToState:(UITableViewCellStateMask)state { 

    [super willTransitionToState:state]; 

// label.hidden = YES; 
// label.alpha = 0.0; 
} 

- (void)didTransitionToState:(UITableViewCellStateMask)state { 

    [super didTransitionToState:state]; 

    if (state == UITableViewCellStateShowingDeleteConfirmationMask) { 

     [UIView beginAnimations:@"anim" context:nil]; 
     label.frame = leftFrame; 
     [UIView commitAnimations]; 
    } else if (state == UITableViewCellStateDefaultMask) { 

     [UIView beginAnimations:@"anim" context:nil]; 
     label.frame = rightFrame; 
     [UIView commitAnimations]; 
    } 
} 
+0

Devi solo modificare le posizioni dei fotogrammi in entrambi i metodi. Nel metodo 'will..', devi spostare l'etichetta a destra, e nel metodo' did..', devi spostare l'etichetta a sinistra. – Ilanchezhian

+0

ok - L'ho fatto funzionare, tuttavia l'etichetta non si anima con esso, si sposta semplicemente nella nuova posizione. Ho provato [UIView beginAnimations: nil context: NULL]; ma c'è molto di un ritardo per farlo sembrare naturale. –

+0

Vedere la mia risposta modificata – Ilanchezhian