2013-09-26 10 views
5

Nowy wygląd i działanie "przeciągnij, aby usunąć" w iOS 7 dodał efekt "bounce", gdzie UITableViewCell nadal offset po przesunięciu. Czy istnieje sposób wyłączenia tego odbicia, aby komórka zatrzymała się, gdy przycisk usuwania jest w pełni widoczny?Jak usunąć UITableViewCell przesuń palcem, aby usunąć bounce

komórkowych, które nadal offset:

Chcę komórka zatrzymać się tu nawet jeśli przeciąganie kontynuuje:

enter image description here

Próbowałem to w moim sposobie cellForRowAtIndexPath:, ale nic nie wydawało zmiana.

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

Dostałeś tę pracę? Jeśli sprawdzisz zintegrowaną aplikację pogodową, zrobi to samo, co chcesz, od jakiegoś czasu szukałem tego, jak to zrobić, ale wciąż nie mam nic. –

+0

@AlexSaidani - Nie. Próbowałem rzeczy, ale nadal nie mam rozwiązania. I masz rację! Wiedziałem, że gdzieś to widziałem, ale nie pamiętałem, gdzie. – hgwhittle

Odpowiedz

4

Myślę, że w końcu znalazłem rozwiązanie! Za pomocą niestandardowej komórki można ustawić tę komórkę jako UIScrollViewDelegate i zaimplementować metodę scrollViewDidScroll:. W tej metodzie można wymusić ustawienie contentOffice UIScrollView, aby pozostało pod określoną wartością (używam 82.0f, ponieważ wydaje się, że jest to contentOffset, gdy przycisk "Delete" jest w pełni widoczny). Tak:

.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); 
    } 
} 

ten może być również wykonane bez użycia komórkę niestandardową, po prostu ustawiając ViewController jako UIScrollViewDelegate i ustawienie Delegat UIScrollView w tableView:cellForRowAtIndexPath, tak jak:

.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

nie sądzę istnieje opcja na to, ale być może to, co można zrobić, to podklasa swoją komórkę i didTransitionToState: można wykryć kasowania stanu potwierdzenia.

W tym momencie nie jestem do końca pewien, co możesz zrobić, aby zapobiec przewijaniu, ale mam nadzieję, że to postawi cię we właściwym kierunku.

Może w tym stanie można wyłączyć rozpoznawanie gestów komórki?

Powiązane problemy