自动滚动时 UIScrollView 触摸不起作用
UIScrollView touch doesnt work when Auto Scroll
我有一个 UIScrollView,里面有几个项目。如果有人按下按钮滚动视图开始以特定速度自动滚动,我的应用程序中有一个功能。但这会导致所有触摸在滚动视图中停止工作。我的目标是每当用户开始手动滚动时,我希望自动滚动自动停止。但是当自动滚动处于 运行 时手动滚动停止工作。
这是我的自动滚动代码
self.scrollTimer = Timer.scheduledTimer(timeInterval: 0.5, target: self, selector: #selector(timerAction), userInfo: nil, repeats: true)
self.scrollTimer!.fire()
RunLoop.current.add(self.scrollTimer!, forMode: RunLoopMode.commonModes)
var yOffset: CGFloat = 0
var offsetIncrementer: CGFloat = 5
@objc func timerAction() {
yOffset += offsetIncrementer
if quranContainer.frame.height <= yOffset + self.view.frame.height {
yOffset = 0
}
DispatchQueue.main.async {
UIView.animate(withDuration: 1.0) {
self.scrollView.contentOffset.y = self.yOffset
}
}
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesBegan(touches, with: event)
stopPlayerTimer()
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?){
super.touchesEnded(touches, with: event)
startPlayerTimer()
}
func startPlayerTimer(){
if self.scrollTimer == nil {
Timer.scheduledTimer(timeInterval: 0.5, target: self, selector: #selector(timerAction), userInfo: nil, repeats: true)
self.scrollTimer?.fire()
}
}
func stopPlayerTimer(){
self.scrollTimer?.invalidate()
self.scrollTimer = nil
}
预定,然后开火
self.scrollTimer = Timer.scheduledTimer(timeInterval: 0.5, target: self, selector: #selector(timerAction), userInfo: nil, repeats: true)
self.scrollTimer.fire()
因为滚动禁用了计时器的更新。
您的计时器默认不在RunLoop.Mode.tracking
将定时器添加到RunLoop的普通模式中,然后ok
RunLoop.current.add(timer, forMode: RunLoop.Mode.common)
好的,问题解决了。 UIView 动画正在删除 userInteractions。需要使用 animate 方法在选项中传递 allowUserInteraction
我是这样解决问题的:
UIView.animate(withDuration: 1.0,
delay: 0,
options: [.allowUserInteraction],
animations: {
self.scrollView.contentOffset.y = self.yOffset
})
我有一个 UIScrollView,里面有几个项目。如果有人按下按钮滚动视图开始以特定速度自动滚动,我的应用程序中有一个功能。但这会导致所有触摸在滚动视图中停止工作。我的目标是每当用户开始手动滚动时,我希望自动滚动自动停止。但是当自动滚动处于 运行 时手动滚动停止工作。
这是我的自动滚动代码
self.scrollTimer = Timer.scheduledTimer(timeInterval: 0.5, target: self, selector: #selector(timerAction), userInfo: nil, repeats: true)
self.scrollTimer!.fire()
RunLoop.current.add(self.scrollTimer!, forMode: RunLoopMode.commonModes)
var yOffset: CGFloat = 0
var offsetIncrementer: CGFloat = 5
@objc func timerAction() {
yOffset += offsetIncrementer
if quranContainer.frame.height <= yOffset + self.view.frame.height {
yOffset = 0
}
DispatchQueue.main.async {
UIView.animate(withDuration: 1.0) {
self.scrollView.contentOffset.y = self.yOffset
}
}
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesBegan(touches, with: event)
stopPlayerTimer()
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?){
super.touchesEnded(touches, with: event)
startPlayerTimer()
}
func startPlayerTimer(){
if self.scrollTimer == nil {
Timer.scheduledTimer(timeInterval: 0.5, target: self, selector: #selector(timerAction), userInfo: nil, repeats: true)
self.scrollTimer?.fire()
}
}
func stopPlayerTimer(){
self.scrollTimer?.invalidate()
self.scrollTimer = nil
}
预定,然后开火
self.scrollTimer = Timer.scheduledTimer(timeInterval: 0.5, target: self, selector: #selector(timerAction), userInfo: nil, repeats: true)
self.scrollTimer.fire()
因为滚动禁用了计时器的更新。
您的计时器默认不在RunLoop.Mode.tracking
将定时器添加到RunLoop的普通模式中,然后ok
RunLoop.current.add(timer, forMode: RunLoop.Mode.common)
好的,问题解决了。 UIView 动画正在删除 userInteractions。需要使用 animate 方法在选项中传递 allowUserInteraction
我是这样解决问题的:
UIView.animate(withDuration: 1.0,
delay: 0,
options: [.allowUserInteraction],
animations: {
self.scrollView.contentOffset.y = self.yOffset
})