【问题标题】:Disable text selection in UITextView在 UITextView 中禁用文本选择
【发布时间】:2013-06-27 00:32:42
【问题描述】:

我想在 UITextView 中禁用文本编辑,只有光标应该保留。我已经禁用了键盘、剪切复制粘贴菜单和缩放编辑模式。但是仍然存在一个问题 - 如果我双击 TextView 它会选择整个单词。还有一件事,我怎样才能让光标选择任何地方,而不仅仅是单词的结尾或开头?

我做了截图,这更好地描述了我的问题,但由于声誉问题无法发布。所以我希望你能明白我的意思。

UITextView 的子类:

#import "UIUneditableTextView.h"

@implementation UIUneditableTextView

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
    }
    return self;
}

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
    UIMenuController *menuController = [UIMenuController sharedMenuController];
    if (menuController) {
        [UIMenuController sharedMenuController].menuVisible = NO;
    }
    return NO;
}

-(void)addGestureRecognizerForLongPress:(UIGestureRecognizer *)gestureRecognizer
{
    if ([gestureRecognizer isKindOfClass:[UILongPressGestureRecognizer class]]){
        gestureRecognizer.enabled = NO;
    }
    [super addGestureRecognizer:gestureRecognizer];
    return;
}

@end

【问题讨论】:

    标签: ios objective-c uitextview disabled-input


    【解决方案1】:

    因为你已经重载了文本视图,所以实现gestureRecognizerShouldBegin:我做了一个这样的实现。

    -(BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
        // Check for gestures to prevent
        if ([gestureRecognizer isKindOfClass:[UITapGestureRecognizer class]]) {
            // Check for double tap
            if (((UITapGestureRecognizer *)gestureRecognizer).numberOfTapsRequired == 2) {
                // Prevent the double tap
                return NO;
            }
        }
    
        // Always anything that makes it here
        return YES;
    }
    

    您可能需要考虑在此处检查长手势识别器,这远非 hack。

    【讨论】:

      【解决方案2】:

      查看UITextInput 中的方法,因为这是控制选择的地方。您可以充当inputDelegate 来找出selectionWillChange: 的时间并覆盖selectedTextRange 来控制选择和插入符号。

      文档:http://developer.apple.com/library/ios/documentation/UIKit/Reference/UITextInput_Protocol/Reference/Reference.html#//apple_ref/occ/intfp/UITextInput

      【讨论】:

      • “你可以充当inputDelegate”是什么意思?我很确定你不能。根据 Apple 文档:“UIKit 提供了一个私有文本输入委托,它在运行时将其分配给其类采用 UITextInput 协议的对象的 inputDelegate 属性。”
      【解决方案3】:

      Swift 工作示例来了

      class TextView: UITextView {
      
          override func canPerformAction(action: Selector, withSender sender: AnyObject!) -> Bool {
              return false
          }
      
          override func gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer!) -> Bool {
              if gestureRecognizer.isKindOfClass(UITapGestureRecognizer) && ((gestureRecognizer as UITapGestureRecognizer).numberOfTapsRequired == 1) {
                  let touchPoint = gestureRecognizer.locationOfTouch(0, inView: self)
                  let cursorPosition = closestPositionToPoint(touchPoint)
                  selectedTextRange = textRangeFromPosition(cursorPosition, toPosition: cursorPosition)
                  return true
              }
              else {
                  return false
              }
          }
      
      }
      

      【讨论】:

        猜你喜欢
        • 2010-12-11
        • 1970-01-01
        • 2014-03-21
        • 2019-06-18
        • 2012-10-26
        • 2010-09-26
        • 2012-08-02
        • 1970-01-01
        相关资源
        最近更新 更多