29

I'm using NSMutableParagraphStyle in my UITextview for adding linespace between each row text.

When I type something in textview, cursor height is normal. but when I move cursor position to text on the 2nd row (not the last row), cursor height is getting bigger.

big caret

What should I do to make cursor height normal in every row of the texts? This is code I'm currently using:

NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
paragraphStyle.lineSpacing = 30.;
textView.font = [UIFont fontWithName:@"Helvetica" size:16];
textView.attributedText = [[NSAttributedString alloc] initWithString:@"My Text" attributes:@{NSParagraphStyleAttributeName : paragraphStyle}];
asked Nov 26, 2013 at 3:28

2 Answers 2

40

Finally I found a solution that solve my problem.

Changing the cursor height is possible by subclassing the UITextView, then overriding the caretRectForPosition:position function. For example:

- (CGRect)caretRectForPosition:(UITextPosition *)position {
 CGRect originalRect = [super caretRectForPosition:position];
 originalRect.size.height = 18.0;
 return originalRect;
}

Documentation link: https://developer.apple.com/documentation/uikit/uitextinput/1614518-caretrectforposition


Update: Swift 2.x or Swift 3.x

See Nate's answer.


Update: Swift 4.x or Swift 5.x

For Swift 4.x use caretRect(for position: UITextPosition) -> CGRect.

import UIKit
class MyTextView: UITextView {
 override func caretRect(for position: UITextPosition) -> CGRect {
 var superRect = super.caretRect(for: position)
 guard let font = self.font else { return superRect }
 // "descender" is expressed as a negative value, 
 // so to add its height you must subtract its value
 superRect.size.height = font.pointSize - font.descender 
 return superRect
 }
}

Documentation link: https://developer.apple.com/documentation/uikit/uitextinput/1614518-caretrect

answered Dec 1, 2013 at 11:30
2
11

And for Swift 2.x or Swift 3.x:

import UIKit
class MyTextView : UITextView {
 override func caretRectForPosition(position: UITextPosition) -> CGRect {
 var superRect = super.caretRectForPosition(position)
 guard let isFont = self.font else { return superRect }
 superRect.size.height = isFont.pointSize - isFont.descender 
 // "descender" is expressed as a negative value, 
 // so to add its height you must subtract its value
 return superRect
 }
}
answered Dec 30, 2015 at 21:54
1
  • 2
    Swift 4 changes caretRectForPosition(position: UITextPosition) to: caretRect(for position: UITextPosition) Commented Dec 7, 2018 at 21:34

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.