2013-09-26 14 views
5

Il nuovo aspetto "sfiorare per eliminare" in iOS 7 ha aggiunto un effetto "rimbalzo" in cui UITableViewCell continua a spostarsi dopo uno scorrimento. C'è un modo per disabilitare questo rimbalzo, in modo che la cella si fermi quando il pulsante Elimina è completamente visibile?Come rimuovere UITableViewCell per eliminare il rimbalzo

cellulare che continua a offset:

voglio la cella di fermarsi qui, anche se il trascinamento continua:

enter image description here

Ho provato questo nel mio metodo cellForRowAtIndexPath:, ma nulla sembrava modificare.

for(UIView *subview in cell.subviews){ 
    if([subview isKindOfClass:[UIScrollView class]]){ 
     UIScrollView *theScrollView = (UIScrollView *)subview; 
     theScrollView.bounces = NO; 
    } 
} 
+0

Hai preso questo lavoro? Se controlli l'app meteo integrata fa la stessa cosa di quello che vuoi, ho cercato come farlo per un po 'ora non ho ancora ottenuto nulla. –

+0

@AlexSaidani - No. Ho provato cose ma ancora nessuna soluzione. E hai ragione! Sapevo di averlo visto da qualche parte ma non riuscivo a ricordare dove. – hgwhittle

risposta

4

Penso di aver finalmente trovato una soluzione! Utilizzando una cella personalizzata, è possibile impostare quella cella come UIScrollViewDelegate e implementare il metodo scrollViewDidScroll:. In questo metodo, puoi forzare il contenutoOffOffset di UIScrollView a rimanere sotto un valore particolare (sto usando 82.0f perché sembra essere contentOffset quando il pulsante 'Elimina' è completamente visibile). Come questo:

.h

@interface MyCustomCell : UITableViewCell <UIScrollViewDelegate> 

.m

-(void)awakeFromNib{ 
    [super awakeFromNib]; 

    for(UIView *subview in self.subviews){ 
     if([subview isKindOfClass:[UIScrollView class]]){ 
      UIScrollView *theScrollView = (UIScrollView *)subview; 
      theScrollView.delegate = self; 
     } 
    } 
} 

#pragma mark - UIScrollViewDelegate 

-(void)scrollViewDidScroll:(UIScrollView *)scrollView{ 
    static CGFloat kTargetOffset = 82.0f; 

    if(scrollView.contentOffset.x >= kTargetOffset){ 
     scrollView.contentOffset = CGPointMake(kTargetOffset, 0.0f); 
    } 
} 

Questo può essere fatto anche senza l'utilizzo di una cella personalizzato, semplicemente impostando un ViewController come UIScrollViewDelegate e impostando la Delegato di UIScrollView in tableView:cellForRowAtIndexPath così:

.h

MyViewController : UIViewController <UITableViewDataSource, UITableViewDelegate, UIScrollViewDelegate> 

.m

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 

    if(cell == nil) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier]; 
    } 

    for(UIView *subview in cell.subviews){ 
     if([subview isKindOfClass:[UIScrollView class]]){ 
      UIScrollView *theScrollView = (UIScrollView *)subview; 
      theScrollView.delegate = self; 
     } 
    } 

    return cell; 
} 

#pragma mark - UIScrollViewDelegate 

-(void)scrollViewDidScroll:(UIScrollView *)scrollView{ 
    static CGFloat kTargetOffset = 82.0f; 

    if(scrollView.contentOffset.x >= kTargetOffset){ 
     scrollView.contentOffset = CGPointMake(kTargetOffset, 0.0f); 
    } 
} 
1

io non credo ci sia un'opzione per questo, ma forse quello che si può fare è sottoclasse tuo cellulare e nella didTransitionToState: è possibile rilevare lo stato di conferma eliminazione.

Ora a questo punto non sono del tutto sicuro di cosa si possa fare per impedire lo scorrimento ma spero che questo ti metta nella giusta direzione.

Forse è possibile disabilitare il riconoscimento dei gesti della cella in questo stato?

Problemi correlati