【发布时间】:2012-05-25 07:53:11
【问题描述】:
在UITextview 中,当长按触摸时放大镜会出现。如何禁用它。
【问题讨论】:
标签: iphone uiscrollview uitextview
在UITextview 中,当长按触摸时放大镜会出现。如何禁用它。
【问题讨论】:
标签: iphone uiscrollview uitextview
Xamarin.iOS:
UITextView 上覆盖 GestureRecognizerShouldBegin 方法
public override bool GestureRecognizerShouldBegin(UIGestureRecognizer gestureRecognizer)
{
if (gestureRecognizer is UILongPressGestureRecognizer ||
gestureRecognizer.Name != "UITextInteractionNameLinkTap")
{
return false;
}
return true;
}
【讨论】:
Swift 4 版本的@user1120133 的回答:
override func addGestureRecognizer(_ gestureRecognizer: UIGestureRecognizer) {
//Prevent long press to show the magnifying glass
if gestureRecognizer is UILongPressGestureRecognizer {
gestureRecognizer.isEnabled = false
}
super.addGestureRecognizer(gestureRecognizer)
}
【讨论】:
@Irina 的回答在 iOS 9.x 上部分有效(尝试轻按,然后长按,您将获得放大覆盖),并在 iOS 10 上崩溃,原因如下:
*** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“您无法更改委托” UIViewControllerPreviewing 失败关系的手势 识别器'
以下代码适用于 iOS 9.x 和 10.x,适用于我能想到的每种轻击和/或长手势组合。
注意我不保证它会被苹果的审查接受。
@implementation CustomTextView
- (void)addGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
{
NSArray *allowedGestures = @[ @"UILongPressGestureRecognizer", @"UIScrollViewDelayedTouchesBeganGestureRecognizer", @"UIScrollViewPanGestureRecognizer" ];
if (![allowedGestures containsObject:NSStringFromClass([gestureRecognizer class])])
{
return;
}
if (([gestureRecognizer isKindOfClass:[UILongPressGestureRecognizer class]] && !gestureRecognizer.delaysTouchesEnded))
{
return;
}
[super addGestureRecognizer:gestureRecognizer];
}
@end
我们需要UIScrollViewDelayedTouchesBeganGestureRecognizer 和UIScrollViewPanGestureRecognizer 来保持UITextView 的滚动能力。这两个类都是私有 API 的一部分所以使用它需要您自担风险。
【讨论】:
这对我有用
@implementation CustomTextView
- (NSArray *)selectionRectsForRange:(UITextRange *)range
{
self.selectedTextRange = nil;
return nil;
}
- (void)addGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
{
gestureRecognizer.delegate = self;
[super addGestureRecognizer:gestureRecognizer];
return;
}
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
return NO;
}
- (CGRect)caretRectForPosition:(UITextPosition *)position
{
return [super caretRectForPosition:self.endOfDocument];
}
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
if (([gestureRecognizer isKindOfClass:[UILongPressGestureRecognizer class]] && !gestureRecognizer.delaysTouchesEnded))
{
return NO;
}
else
return YES;
}
【讨论】:
最后这个问题也解决了
这是供任何人需要时参考的代码
在子类UITextview的m文件中添加代码
-(void)addGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
{
//Prevent zooming but not panning
if ([gestureRecognizer isKindOfClass:[UILongPressGestureRecognizer class]])
{
gestureRecognizer.enabled = NO;
}
[super addGestureRecognizer:gestureRecognizer];
return;
}
有效。
【讨论】: