长按幻灯片放映图片
Long press to slide show images
我有一个 CollectionView
,CollectionView
中的单元格大小与屏幕相同(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")
}
}
}
但我总是不得不END长手势来使集合视图滚动。
您似乎想要的是启动一个计时器,该计时器在手指按下时每 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
}
}
所以,当长按手势第一次触发时,它设置一个布尔值(longPressActive),然后调用滚动函数。当滚动功能完成时,它会再次调用自身。如果手势最终确定,它将清除 longPressActive 布尔值,因此如果计时器触发,该布尔值将为假且不会滚动。
更理想的情况是,我可能不会使用长按手势识别器,而是自己跟踪触摸,因为我可以引用触摸并检查其状态,而不是使用布尔值。此外,当调度进入后台时可能有一个有趣的错误。
这是我试过的方法:
首先,我将这些属性添加到我的控制器中:
var counter = 0
var timer = NSTimer()
var currentIndexPath: NSIndexPath?
然后每当 longGesture.state == .Began
时我就数 counter
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")
}
}
现在可以正常使用了。 :)
我有一个 CollectionView
,CollectionView
中的单元格大小与屏幕相同(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")
}
}
}
但我总是不得不END长手势来使集合视图滚动。
您似乎想要的是启动一个计时器,该计时器在手指按下时每 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
}
}
所以,当长按手势第一次触发时,它设置一个布尔值(longPressActive),然后调用滚动函数。当滚动功能完成时,它会再次调用自身。如果手势最终确定,它将清除 longPressActive 布尔值,因此如果计时器触发,该布尔值将为假且不会滚动。
更理想的情况是,我可能不会使用长按手势识别器,而是自己跟踪触摸,因为我可以引用触摸并检查其状态,而不是使用布尔值。此外,当调度进入后台时可能有一个有趣的错误。
这是我试过的方法:
首先,我将这些属性添加到我的控制器中:
var counter = 0
var timer = NSTimer()
var currentIndexPath: NSIndexPath?
然后每当 longGesture.state == .Began
counter
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")
}
}
现在可以正常使用了。 :)