- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 iOS 开发新手。我目前需要开发一个 ForceTouchGestureRecognizer,在用户开始触摸时激活 2 秒
但是,在添加 holdFor > minimumPressDuration
似乎.changed
一个状态无法到达
有控制台输出
下面是ForceTouchGestureRecognizer类的代码
import UIKit
import UIKit.UIGestureRecognizerSubclass
class ForceTouchGestureRecognizer: UIGestureRecognizer {
var minimumValue: CGFloat = 0 // Value between 0.0 - 1.0 that needs to be reached before gesture begins
var tolerance: CGFloat = 1 // Once force drops below maxValue - tolerance, the gesture ends
var minimumPressDuration: Int = 1000
private(set) var forceValue: CGFloat? // value between 0.0 - 1.0
private var maxValue: CGFloat = 0
private var touchStartTime: Int = 0
override func reset() {
super.reset()
forceValue = nil
maxValue = 0
minimumPressDuration = 1500
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent) {
super.touchesBegan(touches, with: event)
if #available(iOS 9.0, *) {
if touches.count != 1 {
state = .failed
}
touchStartTime = Int(NSDate().timeIntervalSince1970 * 1000)
}
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent) {
super.touchesMoved(touches, with: event)
if #available(iOS 9.0, *) {
let touch = touches.first!
let value = touch.force / touch.maximumPossibleForce
let holdFor = Int(NSDate().timeIntervalSince1970 * 1000) - touchStartTime
if state == .possible {
if value > minimumValue && holdFor > minimumPressDuration {
self.state = .began
}
} else {
if value < (maxValue - tolerance) {
state = .ended
} else {
maxValue = max(self.forceValue ?? 0, maxValue)
self.forceValue = value
state = .changed
}
}
}
}
override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent) {
super.touchesCancelled(touches, with: event)
if state == .began || state == .changed {
state = .cancelled
}
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent) {
super.touchesEnded(touches, with: event)
if state == .began || state == .changed {
state = .ended
}
}
}
2019 年 3 月 17 日更新
根据 Craz1k0ek 的回答。我认为在这里发布我的工作代码会很好
import UIKit.UIGestureRecognizerSubclass
class ForceTouchGestureRecognizer: UIGestureRecognizer {
var minimumValue: CGFloat = 0 // Value between 0.0 - 1.0 that needs to be reached before gesture begins
var tolerance: CGFloat = 1 // Once force drops below maxValue - tolerance, the gesture ends
var minimumPressDuration: TimeInterval = 1.5
private(set) var forceValue: CGFloat? // value between 0.0 - 1.0
private var maxValue: CGFloat = 0
private var touchStartTime: TimeInterval?
override func reset() {
super.reset()
forceValue = nil
maxValue = 0
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent) {
super.touchesBegan(touches, with: event)
if #available(iOS 9.0, *) {
if touches.count != 1 {
state = .failed
}
touchStartTime = Date().timeIntervalSince1970
}
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent) {
guard touchStartTime != nil else { return }
super.touchesMoved(touches, with: event)
if #available(iOS 9.0, *) {
let touch = touches.first!
let value = touch.force / touch.maximumPossibleForce
let holdFor = NSDate().timeIntervalSince1970 - touchStartTime!
if holdFor > minimumPressDuration {
if state == .possible {
if value > minimumValue {
self.state = .began
}
} else {
if value < (maxValue - tolerance) {
state = .ended
} else {
maxValue = max(self.forceValue ?? 0, maxValue)
self.forceValue = value
state = .changed
}
}
}
}
}
override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent) {
super.touchesCancelled(touches, with: event)
if state == .began || state == .changed {
state = .cancelled
}
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent) {
super.touchesEnded(touches, with: event)
if state == .began || state == .changed {
state = .ended
}
}
}
最佳答案
我确实想引用 documentation :
Special Considerations Subclasses of UIGestureRecognizer must use a read-write version of the state property. They get this redeclaration when they import the UIGestureRecognizerSubclass.h header file...
我已简化您的手势识别器,使其在两秒后激活。请注意,我在您的代码中发现了一些不一致之处:minimumPressDuration
默认设置为 1000
,但是,reset()
设置了该值到 1500
,这也可以解释您的某些行为。
class ForceTouchRecognizer: UIGestureRecognizer {
// The minimum time the touch should take
private let minimumTouchTime: TimeInterval = 2.0
// The start time of the touch
private var touchStartTime: TimeInterval?
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent) {
// Set the start time
touchStartTime = Date().timeIntervalSince1970
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent) {
// If there is no start time, how is this possible, don't do anything
guard touchStartTime != nil else { return }
// Check if the minimumTouchTime has passed since the start time
if(Date().timeIntervalSince1970 - touchStartTime! > minimumTouchTime) {
print("I should perform some action now!")
}
}
override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent) {
// Make sure the start time is reset
touchStartTime = nil
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent) {
// Make sure the start time is reset
touchStartTime = nil
}
}
我还建议您查看 UILongPressGestureRecognizer类(class)。这也可能有一些您想要的功能。
关于ios - 自定义手势识别器未调用 TouchMove,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55117843/
我在 Swiper.js 元素下面有一些内容。我正在尝试取消绑定(bind) slider 上的 touchmove 事件,以便在移动设备上,用户在到达幻灯片的最后一张幻灯片时可以自由地向下滚动页面。
我在 View 中实现了 Touchs 方法。TouchMoved 方法被调用四到五次,触摸会自动取消。 你能告诉我原因吗?提前致谢 最佳答案 如果你在你的类(class)中添加了任何手势识别器,那么
我正在尝试实现一个重写的 TouchMoved 函数,以使 SKSpriteNode 能够由用户移动。但是,我必须非常缓慢地移动节点,以便它在拖动时跟随我的触摸。此外,后台还有三个 SKSpriteN
我最初的假设是 touchmove 在每个像素移动时触发,但在我的测试中它会根据移动速度而变化。它的行为是否有定义的规范? 最佳答案 touchmove 事件是 W3C touch events sp
function ontouch(el, callback) { var touchsurface = el, // get element for scrollLeft st
我正在尝试创建一种插件或事件,通过在 ipad 上轻扫 css 转换(移动)元素。为此,我目前使用的是 cocco 出色的工作小代码片段: (function(D){ var M=Math,abs
我是 iOS 开发新手。我目前需要开发一个 ForceTouchGestureRecognizer,在用户开始触摸时激活 2 秒 但是,在添加 holdFor > minimumPressDurati
所以,我在让元素在 touchmove 事件上移动时遇到了问题。 这是我的代码: this is long Text this is long Text this is lo
我有 svg 元素,它们根据 mousemove 事件中的鼠标位置进行更新。我尝试通过将 touchmove 绑定(bind)到元素来执行相同的操作,但是当移动元素时,touchmove 停止工作,并
我使用此代码来禁用和启用触摸: jQuery(document).ready(function(){ jQuery("body").on("touchmove", false); jQuery('
我有一个 div,用于触摸事件以扩展我正在构建的移动菜单。到目前为止,这是我的代码: $("#" + obj.mobileButtonID).on({ touchmove: function
我像这样使用 touchmove: document.getElementById("slider").addEventListener("touchmove",alert("touch"),fals
我有组件,我试图在其中做下一件事: disableBackgroundScroll() { const container = document.getElementsByClassNam
我有一个元素相对于移动设备上的用户触摸(即用手指在屏幕上拖动它)移动(通过改变它的 leftmargin)。 我注意到在 touchmove 事件期间(我相信在 touchstart 和 touche
我将 touchmove 事件绑定(bind)到一个包含 slider 图形的 div,并且需要以某种方式计算用户上下拖动了多少像素,因此我可以调整 slider 图形(真的不想为此使用任何库,因为它
我想通过触摸 UIBarButtonItem 并移动来创建滑动 UIToolbar。我阅读了一些主题,发现我必须实现 TouchMoved。但是哪里?我唯一发现它是 UIButton 的地方,我位于
我想在移动设备上使用“position:fixed”(我有一个 Android 设备)——但这个不存在。 我通过创建两个 div 来伪造它,这两个 div 的高度总和为屏幕的高度(使用 JS),并将
tl;博士 显示第二个 Canvas 元素意味着用户失去触摸 - 我不希望用户再次触摸屏幕 我正在构建一个 HTML5 Canvas 游戏(游戏显示一张图片,将其切成拼图 block ,然后以随机顺序
我遇到了一个问题,试图找到一种方法来使一段基于鼠标事件的代码也可以与触摸事件一起使用。它在鼠标上工作正常,但在触摸设备上 react 很奇怪。 我必须捕获 mousedown 或 touchstart
我正在尝试学习如何使用touchmove event在浏览器中检测多点触控手势。当捕获 touchmove 事件时,我可以获得当前触摸点的列表。然而,这对于检测手势并不是很有用。我喜欢获取触摸事件的历
我是一名优秀的程序员,十分优秀!