长按以幻灯片放映图像

时间:2016-07-19 02:22:09

标签: ios objective-c swift collectionview

我有CollectionViewCollectionView中的单元格大小等于屏幕(CollectionView具有分页启用模式)。

我想在屏幕上长按,然后CollectionView将滚动到下一个单元格。

例如:

我需要1秒才能使CollectionView滚动到下一个单元格, 我按了2.5秒。

开始时间:我开始长按屏幕,集合视图现在在第一个单元格上。

第一秒后:它将滚动到第二个单元格。

第二秒后:它将滚动到第三个单元格。

后半秒:它仍然站在第三个单元格上(因为半秒时间不足以使集合视图滚动到下一个单元格。)

我已将UILongPressGestureRecognizer添加到单元格中,我尝试过这样:

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")
            }
        }
    }

但是我总是要结束这个长手势让集合视图滚动。

2 个答案:

答案 0 :(得分:1)

你似乎想要的东西会启动一个计时器,在手指熄灭时每1秒发射一次。我可能会成功:

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

你可以控制你的handleLongPress代码:

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

因此,当长按手势首次触发时,它会设置一个bool(longPressActive),然后调用scroll函数。滚动功能完成后,它会再次调用自身。如果手势完成,它将清除longPressActive bool,因此如果计时器触发,则bool将为false并且不会滚动。

更理想的情况是,我可能不会使用长按手势识别器,只是自己跟踪触摸,因为我可以引用触摸并检查其状态而不是使用布尔值。此外,当调度进入后台时,可能会有一个有趣的错误。

答案 1 :(得分:0)

这是我尝试过的方式:

首先,我将这些属性添加到我的控制器:

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

然后,每当counter

,我都会计算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")
    }
}

现在效果很好。 :)