iOS 8自定义键盘如何通过长按按钮进行删除?

5

我目前正在构建一个自定义键盘,离完成只有一步之遥。但是我遇到了一个问题,就是删除按钮的问题。当用户点击删除按钮时,它会删除先前输入的文本,这是应该做的事情。但是当用户长按该按钮时,没有任何反应。如何才能让用户长按删除按钮时,键盘像标准 iOS 键盘一样连续删除?以下是我的当前代码:

pragma mark 键盘

- (void)addGesturesToKeyboard{
[self.keyboard.deleteKey addTarget:self action:@selector(pressDeleteKey)forControlEvents:UIControlEventTouchUpInside];

并且:

-(void)pressDeleteKey{
[self.textDocumentProxy deleteBackward];
}

感谢您的帮助。
4个回答

7

Swift 3使用"allowableMovement"属性。

override func viewDidLoad() {
    super.viewDidLoad()

    let longPress = UILongPressGestureRecognizer(target: self, action: #selector(KeyboardViewController.handleLongPress(_:)))
    longPress.minimumPressDuration = 0.5
    longPress.numberOfTouchesRequired = 1
    longPress.allowableMovement = 0.1
    buttonDelete.addGestureRecognizer(longPress)
}

func handleLongPress(_ gestureRecognizer: UIGestureRecognizer) {
    textDocumentProxy.deleteBackward()
}

2
您可以通过管理按钮的事件,如touchdown、touchupinside和touchoutside来实现这一点。
当按钮按下时,以0.2秒的延迟启动计时器,并从textDocumentProxy中删除最后一个字符,直到按钮的touchup方法触发,然后只需要使计时器失效即可。
[self.btnDelete addTarget:self action:@selector(btnTocuhDown:) forControlEvents:UIControlEventTouchDown];
[self.btnDelete addTarget:self action:@selector(btnTouchUp:) forControlEvents:UIControlEventTouchUpInside];
[self.btnDelete addTarget:self action:@selector(btnTouchUp:) forControlEvents:UIControlEventTouchUpOutside];

-(void) btnTocuhDown

    NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:0.2  target:self selector:@selector(kpTimerMethod:) userInfo:nil repeats:YES];

self.kpTimer = timer;
__weak typeof(self)weakSelf = self;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^(void){
    if (timer == self.kpTimer) {
        [weakSelf.kpTimer fire];
    }
});

-(void)kpTimerMethod:(NSTimer *)timer

if (self.btnDelete.highlighted)
{
    [self deleteLastCharacter];
}
else
{
    [timer invalidate];
    self.kpTimer = nil;
}

-(void)deleteLastCharacter

NSString *strInput = self.textDocumentProxy.documentContextBeforeInput;

if (strInput.length > 1)
    NSString *coupleOfLastCharacters = [strInput substringWithRange:NSMakeRange(strInput.length-2, 2)];
    if( [@"yo" caseInsensitiveCompare:coupleOfLastCharacters] == NSOrderedSame ) {
        [self.textDocumentProxy deleteLastCharacter];
    }
}
[self.textDocumentProxy deleteLastCharacter];

-(void) btnTouchUp

[self.kpTimer invalidate];
self.kpTimer = nil;

1
- (void)addGesturesToKeyboard{

 UILongPressGestureRecognizer *ges = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPress:)];
    ges.minimumPressDuration = 0.1;
    ges.numberOfTouchesRequired = 1;
    ges.delegate = self;
    [self.mykeyboard.deleteKey addGestureRecognizer:ges];
}

- (void)longPress:(UILongPressGestureRecognizer*)gesture {


        [self.textDocumentProxy deleteBackward];
}

0

最佳实践是在答案中包含所有细节。如果你只想链接,那更像是一条评论。 - Halvor Holsten Strand
如果已经有答案了,为什么我还要再回答一遍呢?而且链接非常详细,我无法超越那个人。 - Luo Sen
2
如果你认为问题是相同的,那么它就是一个重复的问题。如果你要通过展示别人的解决方案来“回答”,你应该发表评论。如果你有自己提供的解决方案,你应该在答案中写下所有细节。 - Halvor Holsten Strand
2
@LuoSen 如果链接的答案被删除,你的回答也将无效 - Jasper
这并没有完全回答问题。它没有解释如何进行重复删除。 - Foobar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接