5

Mam niestandardową podklasę UICollectionViewCell, która zawiera UIScrollView.UIScrollView jako subview z UICollectionViewCell - przekazanie stuknięcia, aby uzyskać super widok

Widok przewijania jest prawidłowo przewijany, ale przechwytuje dotknięcia, dzięki czemu podświetlenie i wybór zaznaczenia kolekcji nie działa zgodnie z oczekiwaniami.

Ustawienie userInteractionEnabled na NO zezwala na kliknięcia "do", ale przewijanie nie działa (oczywiście).

Przesłanianie hitTest:withEvent: nie jest przydatne, ponieważ potrzebuję wiedzieć, czy to kranik lub patelnia przed przekazaniem.

Jakieś myśli?

Odpowiedz

1

Wpadłem na to dzisiaj. Oto, jak to rozwiązałem, ale musi być lepszy sposób. Nie powinienem wstawiać logiki wyboru widoku kolekcji do mojego kodu komórki.

Dodaj UITapGestureRecognizer do widoku przewijania.

UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(scrollViewTapped:)]; 
[scrollView addGestureRecognizer:tapGesture]; 

Następnie w zwrotnego, trzeba symulować, co stałoby się w normalnym kranu na komórkę:

-(void) scrollViewTapped:(UITapGestureRecognizer *)sender { 
    UIView *tappedView = [sender view]; 

    while (![tappedView isKindOfClass:[UICollectionView class]]) { 
     tappedView = [tappedView superview]; 
    } 

    if (tappedView) { 
     UICollectionView *collection = (UICollectionView *)tappedView; 
     NSIndexPath *ourIndex = [collection indexPathForCell:self]; 
     BOOL isSelected = [[collection indexPathsForSelectedItems] containsObject:ourIndex]; 

     if (!isSelected) { 
      BOOL shouldSelect = YES; 
      if ([collection.delegate respondsToSelector:@selector(collectionView:shouldSelectItemAtIndexPath:)]) { 
       shouldSelect = [collection.delegate collectionView:collection shouldSelectItemAtIndexPath:ourIndex]; 
      } 

      if (shouldSelect) { 
       [collection selectItemAtIndexPath:ourIndex animated:NO scrollPosition:UICollectionViewScrollPositionNone]; 
       if ([collection.delegate respondsToSelector:@selector(collectionView:didSelectItemAtIndexPath:)]) { 
        [collection.delegate collectionView:collection didSelectItemAtIndexPath:ourIndex]; 
       } 
      } 
     } else { 
      BOOL shouldDeselect = YES; 
      if ([collection.delegate respondsToSelector:@selector(collectionView:shouldDeselectItemAtIndexPath:)]) { 
       shouldDeselect = [collection.delegate collectionView:collection shouldDeselectItemAtIndexPath:ourIndex]; 
      } 

      if (shouldDeselect) { 
       [collection deselectItemAtIndexPath:ourIndex animated:NO]; 
       if ([collection.delegate respondsToSelector:@selector(collectionView:didDeselectItemAtIndexPath:)]) { 
        [collection.delegate collectionView:collection didDeselectItemAtIndexPath:ourIndex]; 
       } 
      } 
     } 
    } 
} 
Powiązane problemy