2016-07-19 13 views
0

Ich habe eine CollectionView, die Zelle in CollectionView hat Größe gleich dem Bildschirm (CollectionView hat Paging-Modus aktivieren).Lang drücken, um Bilder anzuzeigen

Ich möchte lange auf dem Bildschirm drücken, dann wird die CollectionView zur nächsten Zelle scrollen.

Zum Beispiel:

Ich brauche 1 Sekunde CollectionView blättert zur nächsten Zelle zu machen, und ich drücke für 2,5 Sekunden.

Die Anfangszeit: Ich fange an, lange auf den Bildschirm zu drücken, und die Sammlungsansicht befindet sich jetzt auf der ersten Zelle.

Nach der ersten Sekunde: Es wird in die zweite Zelle scrollen.

Nach der zweiten Sekunde: Es wird bis zur dritten Zelle scrollen.

Die letzte halbe Sekunde: Sie steht immer noch auf der dritten Zelle (weil eine halbe Sekunde nicht genug Zeit ist, um die Sammelansicht zur nächsten Zelle zu scrollen).

Ich habe die UILongPressGestureRecognizer in die Zelle gegeben und ich habe wie diese versucht:

func handleLongPress(longGesture: UILongPressGestureRecognizer) { 
     if longGesture.state == .Ended { 
      let p = longGesture.locationInView(self.collectionView) 
      let indexPath = self.collectionView.indexPathForItemAtPoint(p) 

      if let indexPath = indexPath { 
       let row = indexPath.row + 1 
       let section = indexPath.section 
       if row < self.photoData.count { 
       self.collectionView.selectItemAtIndexPath(NSIndexPath(forRow: row, inSection: section), animated: true, scrollPosition: .Right) 
       } 
       print(indexPath.row) 
      } else { 
       print("Could not find index path") 
      } 
     } 
    } 

Aber ich habe immer zu END die lange Geste die Sammlung Ansicht zu machen.

Antwort

0

ist die Art, wie ich versucht habe:

Zuerst füge ich diese Eigenschaften zu meinem Controller:

var counter = 0 
var timer = NSTimer() 
var currentIndexPath: NSIndexPath? 

Dann zählen ich die counter, wenn longGesture.state == .Began

func handleLongPress(longGesture: UILongPressGestureRecognizer) { 
    if longGesture.state == .Began { 
     let point = longGesture.locationInView(self.collectionView) 
     currentIndexPath = self.collectionView.indexPathForItemAtPoint(point) 

     self.counter = 0 
     self.timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: #selector(ODIProfileAlbumMode4TableViewCell.incrementCounter), userInfo: nil, repeats: true) 
    } else if longGesture.state == .Ended { 
     self.timer.invalidate() 
    } 
} 

func incrementCounter() { 
    self.counter += 1 
    print(self.counter) 
    if let indexPath = currentIndexPath { 
     let section = indexPath.section 
     if self.counter < self.photoData.count { 
      self.collectionView.scrollToItemAtIndexPath(NSIndexPath(forRow: self.counter, inSection: section), atScrollPosition: .Right, animated: true) 
     } else { 
      self.counter = 0 
      self.collectionView.scrollToItemAtIndexPath(NSIndexPath(forRow: 0, inSection: section), atScrollPosition: .Right, animated: true) 
     } 
    } else { 
     print("Could not find index path") 
    } 
} 

Es funktioniert jetzt perfekt. :)

1

Was Sie zu haben scheinen, ist etwas, das einen Timer auslöst, der alle 1 Sekunde auslöst, während der Finger unten ist. Ich würde wahrscheinlich eine Funktion machen:

func scrollCell() { 
     if (longPressActive) { 
      //scroll code 

      let dispatchTime: dispatch_time_t = dispatch_time(DISPATCH_TIME_NOW, Int64(0.1 * Double(NSEC_PER_SEC))) 
      dispatch_after(dispatchTime, dispatch_get_main_queue(), { 
       scrollCell() // function calls itself after a second 
      }) 
     } 
    } 

Dass Sie in Ihrem handleLongPress Code kontrollieren können:

func handleLongPress(longGesture: UILongPressGestureRecognizer) { 
    if longGesture.state == .Began { 
     longPressActive = true 
     scrollCell() 
    } else if longGesture.state == .Ended || longGesture.state == .Canceled { 
      longPressActive = false 
     } 
    } 

Also, wenn die lange Presse Geste zuerst Brände, eine Bool (longPressActive) setzen, und ruft dann die Scroll-Funktion auf. Wenn die Bildlauffunktion beendet ist, ruft sie sich selbst erneut auf. Wenn die Geste abgeschlossen ist, wird die longPressActive bool gelöscht. Wenn der Timer ausgelöst wird, ist die bool falsch und scrollt nicht.

Idealerweise würde ich wahrscheinlich keinen langen Gestenerkenner verwenden und nur die Berührungen selbst verfolgen, da ich die Berührung referenzieren und ihren Zustand überprüfen könnte, anstatt einen booleschen Wert zu verwenden. Außerdem ist wahrscheinlich ein lustiger Bug mit dem Versand verbunden, wenn er in den Hintergrund tritt. Hier

+0

Ich habe dieses Problem gelöst, Sie können meine eigene Antwort überprüfen. Übrigens, deine Antwort ist gut. +1 – Khuong

Verwandte Themen