5

Utilizzare UICollectionView, è possibile selezionare più celle trascinando il dito su alcune di esse? Ad esempio, se trascini il dito su una riga di 6 e verso il basso nella riga successiva, selezionerà tutti.UICollectionView trascinare il dito sulle celle per selezionarle

qualcosa Provato semplice:

UISwipeGestureRecognizer *swipeGuesture = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeGesture:)]; 
[self.collectionView addGestureRecognizer:swipeGuesture]; 

Ma che sembravano solo chiamare il metodo sulla prima cella che è stato toccato.

Qualche idea?

+2

Hai provato a utilizzare UIPanGestureRecognizer? E in base alla posizione degli eventi pan, tenendo traccia di quali cellule sono passate attraverso. Al termine del gesto, avresti una matrice di celle selezionate. –

+0

La soluzione @MikeWelsh è un'opzione, inoltre puoi provare a sovrascrivere la classe UICollectionView e ad eseguire l'override delle funzioni come: '- (void) toccaBegan: (NSSet *) tocca conEvent: (UIEvent *) evento'' - (void) touchMoved: (NSSet *) tocca conEvent: (UIEvent *) event' e altri –

+0

@MikeWelsh Brilliant! Ha funzionato! Puoi aggiungerlo come risposta? –

risposta

2

È possibile utilizzare UIPanGestureRecognizer. E in base alla posizione degli eventi pan, tenendo traccia di quali cellule sono passate attraverso. Al termine del gesto, avresti una matrice di celle selezionate.

Assicurarsi che cancelsTouchesInView sia impostato su NO. È necessario impostare il delegato con gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer: e gestureRecognizerShouldBegin implementato per assicurarsi che CollectionView possa ancora scorrere

3

Swift 3: Scorri per selezionare con scorrimento automatico e scorrimento funzionante.

var selectMode = false 
var lastSelectedCell = IndexPath() 

func setupCollectionView() { 
    collectionView.canCancelContentTouches = false 
    collectionView.allowsMultipleSelection = true 
    let longpressGesture = UILongPressGestureRecognizer(target: self, action: #selector(didLongpress)) 
    longpressGesture.minimumPressDuration = 0.15 
    longpressGesture.delaysTouchesBegan = true 
    longpressGesture.delegate = self 
    collectionView.addGestureRecognizer(longpressGesture) 

    let panGesture = UIPanGestureRecognizer(target: self, action: #selector(didPan(toSelectCells:))) 
    panGesture.delegate = self 
    collectionView.addGestureRecognizer(panGesture) 
} 

func selectCell(_ indexPath: IndexPath, selected: Bool) { 
    if let cell = collectionView.cellForItem(at: indexPath) { 
     if cell.isSelected { 
      collectionView.deselectItem(at: indexPath, animated: true) 
      collectionView.scrollToItem(at: indexPath, at: UICollectionViewScrollPosition.centeredVertically, animated: true) 
     } else { 
      collectionView.selectItem(at: indexPath, animated: true, scrollPosition: UICollectionViewScrollPosition.centeredVertically) 
     } 
     if let numberOfSelections = collectionView.indexPathsForSelectedItems?.count { 
      title = "\(numberOfSelections) items selected" 
     } 
    } 
} 

func didPan(toSelectCells panGesture: UIPanGestureRecognizer) { 
    if !selectMode { 
     collectionView?.isScrollEnabled = true 
     return 
    } else { 
     if panGesture.state == .began { 
      collectionView?.isUserInteractionEnabled = false 
      collectionView?.isScrollEnabled = false 
     } 
     else if panGesture.state == .changed { 
      let location: CGPoint = panGesture.location(in: collectionView) 
      if let indexPath: IndexPath = collectionView?.indexPathForItem(at: location) { 
       if indexPath != lastSelectedCell { 
        self.selectCell(indexPath, selected: true) 
        lastSelectedCell = indexPath 
       } 
      } 
     } else if panGesture.state == .ended { 
      collectionView?.isScrollEnabled = true 
      collectionView?.isUserInteractionEnabled = true 
      swipeSelect = false 
     } 
    } 
} 

func didLongpress() { 
    swipeSelect = true 
}