在UITextView中禁用点击并按住

时间:2015-05-01 10:15:46

标签: ios objective-c uitextfield

有没有办法在UITextView中停用点按并按住

我目前有一个UITextView的子类,它实现了:

  • caretRectForPosition: ,始终返回CGRectZero以隐藏插入符号

  • addGestureRecognizer: ,用于停用UITapGestureRecognizerUILongPressGestureRecognizer手势

除了这些方法之外,我还实现了-canPerformAction:withSender:,它只返回NO,但这个方法甚至没有被调用(我已经设置了一个断点)有)。

现在一切正常,因为我需要它才能工作,但遗憾的是用户仍然可以点按并按住文本字段。这会导致放大镜出现并使文本字段可选。我已使用[self gestureRecognizers]记录了附加的手势,并收到了以下数组:

<__NSArrayI 0x18e50b10>(
< UITapGestureRecognizer: 0x18f60a80; state = Possible; enabled = NO; view = <CDICTextField 0x18f55ff0>; target= <(action=pinFieldTapped:, target=<CDICPINWizardViewController 0x18f53ee0>)>>,
< UITextTapRecognizer: 0x18e344d0; state = Possible; enabled = NO; delaysTouchesEnded = NO; view = <CDICTextField 0x18f55ff0>; target= <(action=oneFingerTripleTap:, target=<UITextInteractionAssistant     0x18e34440>)>; numberOfTapsRequired = 3>,
< UITextTapRecognizer: 0x18e34610; state = Possible; enabled = NO; delaysTouchesEnded = NO; view = <CDICTextField 0x18f55ff0>; target= <(action=oneFingerDoubleTap:, target=<UITextInteractionAssistant     0x18e34440>)>; numberOfTapsRequired = 2>,
< UITextTapRecognizer: 0x18e34740; state = Possible; enabled = NO; delaysTouchesEnded = NO; view = <CDICTextField 0x18f55ff0>; target= <(action=twoFingerSingleTap:, target=<UITextInteractionAssistant     0x18e34440>)>; numberOfTouchesRequired = 2>,
< UITapAndAHalfRecognizer: 0x18e34870; state = Possible; view = <CDICTextField 0x18f55ff0>; target= <(action=tapAndAHalf:, target=<UITextInteractionAssistant 0x18e34440>)>>,
< UILongPressGestureRecognizer: 0x18e33830; state = Possible; enabled = NO; delaysTouchesEnded = NO; view = <CDICTextField 0x18f55ff0>; target= <(action=twoFingerRangedSelectGesture:, target=<    UITextInteractionAssistant 0x18e34440>)>>,
< UITextTapRecognizer: 0x18e34a70; state = Possible; enabled = NO; delaysTouchesEnded = NO; view = <CDICTextField 0x18f55ff0>; target= <(action=oneFingerTap:, target=<UITextInteractionAssistant     0x18e34440>)>>,
< UIVariableDelayLoupeGesture: 0x18e34b90; state = Possible; enabled = NO; delaysTouchesEnded = NO; view = <CDICTextField 0x18f55ff0>; target= <(action=loupeGesture:, target=<UITextInteractionAssistant     0x18e34440>)>>
)

检查数组我确实看到所有手势报告enabled = NOUITapAndAHalfRecognizer除外(这对我们的开发人员来说甚至不是一个可见的类)。 现在我不确定那个手势是不是罪魁祸首。如果是这样,我也不知道如何禁用那个。

我搜索了SO的答案,但找不到答案。此外,-canPerformAction:withSender:不会被调用,这可能是因为没有执行任何操作。 UIMenuViewController也不可见(我看不到带有选择/复制/粘贴等的黑条),只是一个放大镜。

UITextField所在的UIViewController实现:

同样,我 DO 想要的是:

  • 使UITextfield可编辑但不可选择
  • 禁用所有手势(双击,点击并按住,长按)

我想要的是:

  • UITextField响应选择/复制/粘贴等。
  • 以任何方式显示放大镜

&#39;为什么&#39;我正在制作一种PIN屏幕,我希望用户在我想要的字段中输入一个数字(因为我必须使用文本字段,请不要提供任何其他方式创建PIN屏幕。)

2 个答案:

答案 0 :(得分:1)

您应该继承UITextView并覆盖canPerformAction:withSender。不应该提供复制/粘贴的文本字段应该用您的子类定义。

<强> NonCopyPasteField.h:

@interface NonCopyPasteField : UITextField
@end

<强> NonCopyPasteField.m:

@implemetation
  (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
    if (action == @selector(copy:) || action == @selector(paste:)) {
      return NO;
    }
    [super canPerformAction:action withSender:sender];
  }
@end

如果您需要任何有关如何实施它的帮助,请告诉我们。

答案 1 :(得分:1)

我也在玩pin输入。现在停在子类的下一个:

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
    return NO;
}

-(void)addGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer {
    gestureRecognizer.enabled = NO;

    if ([gestureRecognizer isKindOfClass:[UITapGestureRecognizer class]]) {
        NSInteger taps = ((UITapGestureRecognizer *)gestureRecognizer).numberOfTapsRequired;
        if (taps == 1) {
            gestureRecognizer.enabled = YES;
        }
    }

    [super addGestureRecognizer:gestureRecognizer];

    return;
}

但在某些情况下会发生文字选择。