2015-03-24 2 views
18

Я хотел бы выяснить, как распечатать indexPath UICollectionViewCell, когда я долгое время нажимаю на ячейку.Как использовать UILongPressGestureRecognizer с UICollectionViewCell в Swift?

Как я могу это сделать в Swift?

Я повсюду рассмотрел пример того, как это сделать; не может найти его в Swift.

+0

Покажите нам, что вы пробовали. – rdelmar

+0

Я пробовал так много вещей, что невозможно было бы все это здесь. Я попытался использовать информацию по этим ссылкам: http://stackoverflow.com/questions/23392485/change-background-of-uicollectionview-cell-on-tap - http://www.tagwith.com/question_73045_delete-uicollectionviewcell- с-uilongpressgesturerecognizer? ref = driverlayer.com/web - http://www.freshconsulting.com/create-drag-and-drop-uitableview-swift/ ТОНН других страниц. – webmagnets

ответ

56

Сначала вы, ваш контроллер, должны быть UIGestureRecognizerDelegate. Затем добавьте UILongPressGestureRecognizer к вашему CollectionView в viewDidLoad() методе вашего ViewController в

class ViewController: UIViewController, UIGestureRecognizerDelegate { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let lpgr = UILongPressGestureRecognizer(target: self, action: "handleLongPress:") 
     lpgr.minimumPressDuration = 0.5 
     lpgr.delaysTouchesBegan = true 
     lpgr.delegate = self 
     self.collectionView.addGestureRecognizer(lpgr) 
    } 

Метод обрабатывать длительное нажатие:

func handleLongPress(gestureReconizer: UILongPressGestureRecognizer) { 
     if gestureReconizer.state != UIGestureRecognizerState.Ended { 
      return 
     } 

     let p = gestureReconizer.locationInView(self.collectionView) 
     let indexPath = self.collectionView.indexPathForItemAtPoint(p) 

     if let index = indexPath { 
      var cell = self.collectionView.cellForItemAtIndexPath(index) 
      // do stuff with your cell, for example print the indexPath 
      println(index.row) 
     } else { 
      println("Could not find index path") 
     } 
    } 

Этот код основан на версии Objective-C в this answer.

+0

Спасибо. Отлично! – webmagnets

+0

работал. проголосовали. – kennydust

+0

Моя вертикальная прокрутка теперь не работает для моей коллекцииView: (\ –

3

Одна вещь, которую я обнаружил, что:

if gestureReconizer.state != UIGestureRecognizerState.Ended { 
    return 
} 

не ставит булавку, пока вы не отпустите longpress, который в порядке, но я нашел

if gestureRecognizer.state == UIGestureRecognizerState.Began { } 

вокруг всей функции будет препятствовать множественным размещаемых в местах размещения контактов, позволяя вывести штырь, как только будет достигнута задержка таймера.

Кроме того, одна опечатки выше: Reconizer -> распознаватель

+0

Вы абсолютно правы, она больше похожа на родную карту, на которой вы находитесь, когда вы все еще нажимаете, а не ожидаете, пока пресса не отпустят, чтобы поместить вывод Здесь есть полный код Swift: http://stackoverflow.com/a/29466391/1359088 –

8

ztan ответ преобразуется в стремительный 3 синтаксис:

func handleLongPress(_ gestureReconizer: UILongPressGestureRecognizer) { 
    if gestureReconizer.state != UIGestureRecognizerState.ended { 
     return 
    } 

    let p = gestureReconizer.location(in: collectionView) 
    let indexPath = collectionView.indexPathForItem(at: p) 

    if let index = indexPath { 
     var cell = collectionView.cellForItem(at: index) 
     // do stuff with your cell, for example print the indexPath 
     print(index.row) 
    } else { 
     print("Could not find index path") 
    } 
} 
3

Метод handleLongProgress преобразуется в стремительный 3 синтаксиса работает отлично. Я просто хочу добавить, что инициализация lpgr следует изменить на:

let lpgr = UILongPressGestureRecognizer(target: self, action: #selector(handleLongPress(gestureReconizer:))) 
Смежные вопросы