Search code examples
ioscocoa-touchuitextviewindentationauto-indent

How can I add auto indentation to UITextView when user type new line?


How can I add auto indentation to UITextView when user type new line? Example:

line1
  line2 <user has typed "Enter">
  <cursor position>
    line3 <user has typed "Enter">
    <cursor position>

Solution

  • Although it seems as if the OP isn't in fact looking for standard indentation in this case, I'm leaving this up for future answer seekers.

    Here's how you can automatically add an indent after every newline entry. I've adapted this answer from my similar recent answer about automatically adding bullet points at every newline.

    - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
    
        // If the replacement text is "\n" thus indicating a newline...
        if ([text isEqualToString:@"\n"]) {
    
            // If the replacement text is being added to the end of the
            // text view's text, i.e. the new index is the length of the
            // old text view's text...
            if (range.location == textView.text.length) {
                // Simply add the newline and tab to the end
                NSString *updatedText = [textView.text stringByAppendingString:@"\n\t"];
                [textView setText:updatedText];
            }
    
            // Else if the replacement text is being added in the middle of
            // the text view's text...
            else {
    
                // Get the replacement range of the UITextView
                UITextPosition *beginning = textView.beginningOfDocument;
                UITextPosition *start = [textView positionFromPosition:beginning offset:range.location];
                UITextPosition *end = [textView positionFromPosition:start offset:range.length];
                UITextRange *textRange = [textView textRangeFromPosition:start toPosition:end];
    
                // Insert that newline character *and* a tab
                // at the point at which the user inputted just the
                // newline character
                [textView replaceRange:textRange withText:@"\n\t"];
    
                // Update the cursor position accordingly
                NSRange cursor = NSMakeRange(range.location + @"\n\t".length, 0);
                textView.selectedRange = cursor;
    
            }
    
            // Then return "NO, don't change the characters in range" since
            // you've just done the work already
            return NO;
        }
    
        // Else return yes
        return YES;
    }