2015-01-19 6 views
3

Я делаю customKeyboard, которые имеют кнопку Удалить для удаления текста и коды для этого есть:При создании пользовательского расширения клавиатуры iOS, как я могу создать кнопку, которая имеет те же функциональные возможности, что и оригинальный задний ключ Apple?

func addDelete() { 

    deleteButton = UIButton.buttonWithType(.System) as UIButton 
    deleteButton.setTitle(" Delete ", forState: .Normal) 
    deleteButton.sizeToFit() 
    deleteButton.setTranslatesAutoresizingMaskIntoConstraints(false) 
    deleteButton.addTarget(self, action: "didTapDelete", forControlEvents: .TouchUpInside) 
    deleteButton.layer.cornerRadius = 5 

    view.addSubview(deleteButton) 

    var rightSideConstraint = NSLayoutConstraint(item: deleteButton, attribute: .Right, relatedBy: .Equal, toItem: view, attribute: .Right, multiplier: 1.0, constant: -10.0) 
    var topConstraint = NSLayoutConstraint(item: deleteButton, attribute: .Top, relatedBy: .Equal, toItem: view, attribute: .Top, multiplier: 1.0, constant: +10.0) 
    view.addConstraints([rightSideConstraint, topConstraint]) 
} 

func didTapDelete() { 
    var proxy = textDocumentProxy as UITextDocumentProxy 
    proxy.deleteBackward() 
} 

Но это медленно, потому что я должен нажать так много времени, чтобы удалить много символов из textField.

Есть ли способ создать кнопку, которую я могу непрерывно нажимать, и она может удалить персонажа так быстро, как кнопка iPhone для клавиатуры iPhone?

ответ

4

Я нашел ответ от HERE.

В этом ключевом блоке у deleteButton есть те же функции, что и я.

Код для этой кнопки:

private func addDeleteButton() { 
    deleteButton = KeyButton(frame: CGRectMake(keyWidth * 8.5 + spacing * 9.5, keyHeight * 2.0 + spacing * 3.0 + predictiveTextBoxHeight, keyWidth * 1.5, keyHeight)) 
    deleteButton.setTitle("\u{0000232B}", forState: .Normal) 
    deleteButton.addTarget(self, action: "deleteButtonPressed:", forControlEvents: .TouchUpInside) 
    self.view.addSubview(deleteButton) 

    let deleteButtonLongPressGestureRecognizer = UILongPressGestureRecognizer(target: self, action: "handleLongPressForDeleteButtonWithGestureRecognizer:") 
    deleteButton.addGestureRecognizer(deleteButtonLongPressGestureRecognizer) 

    let deleteButtonSwipeLeftGestureRecognizer = UISwipeGestureRecognizer(target: self, action: "handleSwipeLeftForDeleteButtonWithGestureRecognizer:") 
    deleteButtonSwipeLeftGestureRecognizer.direction = .Left 
    deleteButton.addGestureRecognizer(deleteButtonSwipeLeftGestureRecognizer) 
} 

func deleteButtonPressed(sender: KeyButton) { 
    switch proxy.documentContextBeforeInput { 
    case let s where s?.hasSuffix(" ") == true: // Cursor in front of tab, so delete tab. 
     for i in 0..<4 { // TODO: Update to use tab setting. 
      proxy.deleteBackward() 
     } 
    default: 
     proxy.deleteBackward() 
    } 
    updateSuggestions() 
} 

func handleLongPressForDeleteButtonWithGestureRecognizer(gestureRecognizer: UILongPressGestureRecognizer) { 
    switch gestureRecognizer.state { 
    case .Began: 
     if deleteButtonTimer == nil { 
      deleteButtonTimer = NSTimer(timeInterval: 0.1, target: self, selector: "handleDeleteButtonTimerTick:", userInfo: nil, repeats: true) 
      deleteButtonTimer!.tolerance = 0.01 
      NSRunLoop.mainRunLoop().addTimer(deleteButtonTimer!, forMode: NSDefaultRunLoopMode) 
     } 
    default: 
     deleteButtonTimer?.invalidate() 
     deleteButtonTimer = nil 
     updateSuggestions() 
    } 
} 

func handleSwipeLeftForDeleteButtonWithGestureRecognizer(gestureRecognizer: UISwipeGestureRecognizer) { 
    // TODO: Figure out an implementation that doesn't use bridgeToObjectiveC, in case of funny unicode characters. 
    if let documentContextBeforeInput = proxy.documentContextBeforeInput as NSString? { 
     if documentContextBeforeInput.length > 0 { 
      var charactersToDelete = 0 
      switch documentContextBeforeInput { 
      case let s where NSCharacterSet.letterCharacterSet().characterIsMember(s.characterAtIndex(s.length - 1)): // Cursor in front of letter, so delete up to first non-letter character. 
       let range = documentContextBeforeInput.rangeOfCharacterFromSet(NSCharacterSet.letterCharacterSet().invertedSet, options: .BackwardsSearch) 
       if range.location != NSNotFound { 
        charactersToDelete = documentContextBeforeInput.length - range.location - 1 
       } else { 
        charactersToDelete = documentContextBeforeInput.length 
       } 
      case let s where s.hasSuffix(" "): // Cursor in front of whitespace, so delete up to first non-whitespace character. 
       let range = documentContextBeforeInput.rangeOfCharacterFromSet(NSCharacterSet.whitespaceCharacterSet().invertedSet, options: .BackwardsSearch) 
       if range.location != NSNotFound { 
        charactersToDelete = documentContextBeforeInput.length - range.location - 1 
       } else { 
        charactersToDelete = documentContextBeforeInput.length 
       } 
      default: // Just delete last character. 
       charactersToDelete = 1 
      } 

      for i in 0..<charactersToDelete { 
       proxy.deleteBackward() 
      } 
     } 
    } 
    updateSuggestions() 
}