iPhone: Disable the “double-tap spacebar for .” shortcut?

前端 未结 8 1749
陌清茗
陌清茗 2020-11-28 15:29

By default, if you tap the spacebar twice on the iPhone or iPad, instead of getting \"  \" (two spaces), you get \". \" (a period followed by a space). Is the

8条回答
  •  情深已故
    2020-11-28 15:55

    I have an answer based on the the one given by Chaise above.

    Chaise's method does not allow you to type two spaces in sequence - this is not desirable in some situations. Here's a way to completely turn off the auto-period insert:

    Swift

    In the delegate method:

    func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
        //Ensure we're not at the start of the text field and we are inserting text
        if range.location > 0 && text.count > 0
        {
            let whitespace = CharacterSet.whitespaces
            
            let start = text.unicodeScalars.startIndex
            let location = textView.text.unicodeScalars.index(textView.text.unicodeScalars.startIndex, offsetBy: range.location - 1)            
            
            //Check if a space follows a space
            if whitespace.contains(text.unicodeScalars[start]) && whitespace.contains(textView.text.unicodeScalars[location])
            {
                //Manually replace the space with your own space, programmatically
                textView.text = (textView.text as NSString).replacingCharacters(in: range, with: " ")
                
                //Make sure you update the text caret to reflect the programmatic change to the text view
                textView.selectedRange = NSMakeRange(range.location + 1, 0)
                
                //Tell UIKit not to insert its space, because you've just inserted your own
                return false
            }
        }
        
        return true
    }
    

    Now you can tap the spacebar as much and as fast as you like, inserting only spaces.

    Objective-C

    In the delegate method:

    - (BOOL) textView:(UITextView*)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString*)text
    

    Add the following code:

    //Check if a space follows a space
    if ( (range.location > 0 && [text length] > 0 &&
          [[NSCharacterSet whitespaceCharacterSet] characterIsMember:[text characterAtIndex:0]] &&
          [[NSCharacterSet whitespaceCharacterSet] characterIsMember:[[textView text] characterAtIndex:range.location - 1]]) )
    {
        //Manually replace the space with your own space, programmatically
        textView.text = [textView.text stringByReplacingCharactersInRange:range withString:@" "];
        
        //Make sure you update the text caret to reflect the programmatic change to the text view
        textView.selectedRange = NSMakeRange(range.location+1, 0);  
        
        //Tell Cocoa not to insert its space, because you've just inserted your own
        return NO;
    }
    

提交回复
热议问题