【问题标题】:Disable Magnifying Glass in UITextview在 UITextview 中禁用放大镜
【发布时间】:2012-05-25 07:53:11
【问题描述】:

UITextview 中,当长按触摸时放大镜会出现。如何禁用它。

【问题讨论】:

  • 看看这个thread
  • 答案是HERE不需要子类。

标签: iphone uiscrollview uitextview


【解决方案1】:

Xamarin.iOS:

  1. 创建自定义 UITextView
  2. 在您的 UITextView 上覆盖 GestureRecognizerShouldBegin 方法
public override bool GestureRecognizerShouldBegin(UIGestureRecognizer gestureRecognizer)
{
    if (gestureRecognizer is UILongPressGestureRecognizer ||
        gestureRecognizer.Name != "UITextInteractionNameLinkTap")
    {
        return false;
    }
    return true;
}

【讨论】:

    【解决方案2】:

    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)
        }
    

    【讨论】:

      【解决方案3】:

      @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
      

      我们需要UIScrollViewDelayedTouchesBeganGestureRecognizerUIScrollViewPanGestureRecognizer 来保持UITextView 的滚动能力。这两个类都是私有 API 的一部分所以使用它需要您自担风险。

      【讨论】:

        【解决方案4】:

        这对我有用

        @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;
        
        }
        

        【讨论】:

          【解决方案5】:

          最后这个问题也解决了

          这是供任何人需要时参考的代码

          在子类UITextview的m文件中添加代码

          -(void)addGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 
          {
              //Prevent zooming but not panning
              if ([gestureRecognizer isKindOfClass:[UILongPressGestureRecognizer class]]) 
              {
                  gestureRecognizer.enabled = NO;
              }
              [super addGestureRecognizer:gestureRecognizer];
              return;
          }
          

          有效。

          【讨论】:

          • 但如果我没记错的话,这会完全禁用长按。换句话说,如果您的文本视图包含 URL 链接或电话号码(如果您启用了检测),那么长按您的文本视图将无法响应它们,对吗?
          • 希望同时禁用插入符号和文本编辑?看到这个答案->link
          • 是的,就像@antf 说的那样,这段代码完全禁用了对链接、电话和事件的触摸。
          • 在 ios9 中遇到同样的问题,我只需要禁用 maging glass,而不是 url 和手机触摸事件。
          • @Madhu 检查我刚刚发布的答案。它可能会给你一些见解。
          猜你喜欢
          • 2011-02-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-08-27
          • 2016-01-04
          • 2021-11-28
          • 2012-11-17
          • 1970-01-01
          相关资源
          最近更新 更多