目前我想让UITextView拥有双击手势。UITableView似乎有自己的双击手势,当我们双击时,会选择一些文本。因此,我想删除这个默认的双击手势,并加入自己的手势识别器。我尝试了很多方法,但都失败了。似乎没有办法删除UITextView的默认识别器。我还想在UITextView上添加一个透明视图来执行双击事件,但这个子视图会阻挡UITextView上的其他手势。有没有办法给UITextView添加双击手势识别器?我真的希望有一个解决方法。
我仍然期待iOS5的解决方法 :)
目前我想让UITextView拥有双击手势。UITableView似乎有自己的双击手势,当我们双击时,会选择一些文本。因此,我想删除这个默认的双击手势,并加入自己的手势识别器。我尝试了很多方法,但都失败了。似乎没有办法删除UITextView的默认识别器。我还想在UITextView上添加一个透明视图来执行双击事件,但这个子视图会阻挡UITextView上的其他手势。有没有办法给UITextView添加双击手势识别器?我真的希望有一个解决方法。
我仍然期待iOS5的解决方法 :)
文本视图中还连接了其他手势识别器。由于似乎您不需要它们,因此可以将其删除。
myTextView.gestureRecognizers = nil;
在添加您的双击手势识别器之前。它有效。
然后您可以添加
UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(mySelector)];
tapRecognizer.numberOfTapsRequired = 2;
tapRecognizer.numberOfTouchesRequired = 1;
[myTextView addGestureRecognizer:tapRecognizer];
UITextView
能够识别自定义的双击操作。UITextView
进行子类化并重写addGestureRecognizer:
方法来实现这一点,以便将我们的自定义回调注入双击手势,并配置单击手势以尊重新的双击挂钩。addGestureRecognizer:
中执行此操作,因为UITextView
会根据其当前状态不断删除和添加手势,所以您必须不断地重新设置它。@interface MyCustomTextView ()
/**
* we want to keep track of the current single-tap gesture so we can make sure
* it waits for a double-tap gesture to fail before firing
*/
@property (weak, nonatomic) UITapGestureRecognizer *singleTap;
/**
* we want to keep track of the current double-tap gesture so we can tell a single
* tap gesture to ignore this double-tap when the single tap gesture changes
*/
@property (weak, nonatomic) UITapGestureRecognizer *doubleTap;
@end
@implementation MyCustomTextView
/**
* this will fire when the text view is double-tapped
*
* @param tgr
*/
- (void)_handleTwoTaps:(UITapGestureRecognizer *)tgr
{
// ADD CODE HERE
}
/**
* the reason why I've overridden this methods is these gestures change quite a bit
* depending on the state of the UITextView, (eg, when in focus and out of focus)
* and so this provides a reliable way to make sure any new gestures get updated
* with custom overrides.
*
* @param gestureRecognizer
*/
- (void)addGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
{
[super addGestureRecognizer:gestureRecognizer];
if ([gestureRecognizer isKindOfClass:[UITapGestureRecognizer class]]) {
UITapGestureRecognizer *tgr = (UITapGestureRecognizer *)gestureRecognizer;
if ([tgr numberOfTapsRequired] == 1 && [tgr numberOfTouchesRequired] == 1) {
self.singleTap = tgr;
if (self.doubleTap) {
[tgr requireGestureRecognizerToFail:self.doubleTap];
}
} else if ([tgr numberOfTapsRequired] == 2 && [tgr numberOfTouchesRequired] == 1) {
[tgr addTarget:self action:@selector(_handleTwoTaps:)];
self.doubleTap = tgr;
if (self.singleTap) {
[self.singleTap requireGestureRecognizerToFail:tgr];
}
}
}
}
// NOTE: I'm not sure if this is needed but it's been there for years
// and so I thought I would include it just in case
- (void)removeGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
{
if ([gestureRecognizer isKindOfClass:[UITapGestureRecognizer class]]) {
UITapGestureRecognizer *tgr = (UITapGestureRecognizer *)gestureRecognizer;
if ([tgr numberOfTapsRequired] == 2 && [tgr numberOfTouchesRequired] == 1) {
[tgr removeTarget:self action:@selector(_handleTwoTaps:)];
}
}
[super removeGestureRecognizer:gestureRecognizer];
}
@end