- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试了解手势识别器的工作原理,并尝试让手势识别器告诉我长触摸何时开始以及何时结束,即使触摸没有移动也是如此。
在 viewDidLoad
中,我添加了一个名为 game 的 subview 。在游戏中,我实现了两种识别触摸的方法。一个工作但不做我想做的事。另一个不起作用。
Method1 我刚刚添加了两个方法:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
NSLog(@"Began");
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *) event {
NSLog(@"Ended");
}
这有效,无需实例化手势识别器。谁能告诉我为什么?
问题是 - (void)touchedEnded:
只有在触摸移动时才会被调用,如果触摸在开始的相同位置结束则不会。所以如果我触摸并移动然后放手,两个函数都会被调用。如果我触摸并按住并放开(没有移动),只有 - (void)touchesBegan
被调用。
方法二我实例化了一个手势识别器:
@property (nonatomic, strong) UILongPressGestureRecognizer *lprg;
然后在我的设置中:
self.lprg = [UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPress:)];
然后:
- (void)handleLongPress:(UILongPressGestureRecognizer *)recognizer {
NSLog(@"Handling");
switch (recognizer.state) {
case UIGestureRecognizerStateBegan:
// ...
}
}
但是这个,我以编程方式实例化识别器的地方,没有工作。我从未在控制台中得到任何 NSLog 输出。
最佳答案
UIResponder(UIView 是)的所有子类都会响应 touchesBegan,这就是为什么您无需执行任何操作并且免费获得它的原因。然而,它远非手势识别器。在高层次上,手势识别器跟踪很多东西,例如状态。当然,您可以使用 touches begin,但想象一下,将其扩展到拾取诸如三指长按、滑动或捏合之类的东西。事情很快变得丑陋。安装手势识别器可以简化事情。
例如长按:
UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] init];
longPress.numberOfTouchesRequired = 3;
[longPress addTarget:self action:@selector(longPressDetected:)];
[self.view addGestureRecognizer:longPress];
编辑
实现委托(delegate):
在您的实现文件 (.m) 中,在 @implemation 行的末尾添加该行。它应该看起来像
@implementation ViewController <UIGestureRecognizerDelegate>
然后在你分配并初始化你的手势识别器之后设置委托(delegate)如下
longPress.delegate = self;
然后根据需要从https://developer.apple.com/library/ios/documentation/uikit/reference/UILongPressGestureRecognizer_Class/Reference/Reference.html 中实现尽可能多的方法.例如,您可能会考虑这两个
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
return YES;
}
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
return YES;
}
关于ios - UILongPressGestureRecognizer 是如何工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23486108/
在我的应用程序中,我希望 UILongPressGestureRecognizer 每秒发送连续的消息,直到释放按钮。不幸的是,没有像“连续”这样的状态,所以我需要使用“开始”和“结束”来控制我的消息
我正在尝试创建一个应用程序,当触发 UILongPressGestureRecognizer 手势时,可以拖放 UIButtons。 我有: UIGestureRecognizer *longPres
我正在开发一个应用程序,其中我在 View 上应用 UILongPressGesture 识别器,并实现了为事件(发生时长按手势)实现的代码。 处理手势的代码写在一个方法中,当我尝试长按不需要的 Vi
我尝试在我的应用程序中使用 UILongPressGestureRecognizer,问题是该函数仅在我稍微移动手指时调用。 这是我正在使用的代码: UILongPressGestureRec
我在 UIImageView 中添加了 4 个手势识别器,单击、双击和 pin 手势工作正常。但是,长按手势不起作用。这是为什么? _imageView.userInteraction
我想让一个 UI 按钮只有在按住超过设定的秒数时才会响应。所以我这样使用了 UILongPressGestureRecognizer: import UIKit class ViewControlle
我有一个问题,当长按时,快速移动手指,并且在回调函数中我无法检测到手指已经在某个区域,如果你移动手指足够快的话。这是我的猜测:回调函数有一个最大频率,有人知道它的确切数量吗? 最佳答案 也许更好用 t
当用户将手指按在屏幕上时,我想执行一个连续的 Action 。这目前工作正常。但是当用户将第二根手指按在屏幕上时,我希望 UILongPressGestureRecognizer 取消/结束第一次按下
我已将 UILongPressGestureRecognizer 添加到 UITextField 中。当我按下 UITextField 时,它会向我显示警报,但这是三个警报向我显示。这是我的代码: -
我在 viewDidLoad 中有这段代码: UILongPressGestureRecognizer *change = [[UILongPressGestureRecognizer alloc]
我正在尝试创建一个应用程序,其中可以在触发 UILongPressGestureRecognizer 手势时拖放 UIButton。实际上,我的应用程序在任何 iPad 上都运行良好。它仅在 iPho
我已将 UILongPressGestureRecognizer 连接到 View 上的 Button。我在 Interface Builder 的 Referencing Outlet Collec
这适用于 iOS 11 上的设备,但随着我的设备更新到 iOS 12,它不再适用: //the viewcontroller is initiated with UIGestureRecognizer
我正在尝试制作一个功能,当用户按住手指时,图像会在发生过渡时变大,直到达到一定大小。我知道如何使图像变大,但不知道如何使其仅在用户按住时才变大。 有谁知道如何做到这一点?是否需要 LongPressR
我想让屏幕的右侧使节点跳转,左边的前半部分向左移动,后半部分向右移动。 一些不合适的东西: 当我快速左、右、左、右多次点击时(它会停止并且不会移动节点) 当我点击屏幕右侧并点击左侧或右侧部分时,并非每
我目前有一个使用生成按钮列表的 SimpleAlert 制作的操作表。这些按钮可识别轻击和长按。在长按时,我试图通过选择器将按钮作为发件人传递,以便访问另一个函数中的按钮标签,但是它一直给我这个错误:
我以这种方式在 UIImageView 上使用 UILongPressGestureRecogniser: UILongPressGestureRecognizer *longPress = [[UI
我正在尝试了解手势识别器的工作原理,并尝试让手势识别器告诉我长触摸何时开始以及何时结束,即使触摸没有移动也是如此。 在 viewDidLoad 中,我添加了一个名为 game 的 subview 。在
我想检测 UIWebView 的 UILongPressGestureRecognizer 点击并按住 .. 这样当我长按将近 3 秒时,下面的 if 条件应该是 True 那么只有 if (navi
我用 UILongPressGestureRecognizer 为 UIImageView 设置了动画,如下所示: override func viewDidAppear(animated: Bool
我是一名优秀的程序员,十分优秀!