Подтвердить что ты не робот

UITextView lineSpacing делает высоту курсора не одинаковой

Я использую NSMutableParagraphStyle в моем UITextview для добавления пространства строк между каждой строкой текста.

Когда я набираю что-то в textview, высота курсора нормальная. но когда я перемещаю позицию курсора в текст во 2-й строке (не в последней), высота курсора становится больше.

big caret

Что я должен сделать, чтобы высота курсора была нормальной в каждой строке текста? Это код, который я сейчас использую:

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}];
4b9b3361

Ответ 1

Наконец я нашел решение, которое решило мою проблему.

Изменение высоты курсора возможно путем создания подкласса UITextView последующим переопределением функции caretRectForPosition:position. Например:

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

Ссылка на документацию: https://developer.apple.com/documentation/uikit/uitextinput/1614518-caretrectforposition


Обновление: Swift 2.x или Swift 3.x

Смотрите ответ Нейта.


Обновление: Swift 4.x

Для Swift 4.x используйте 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
    }
}

Ссылка на документацию: https://developer.apple.com/documentation/uikit/uitextinput/1614518-caretrect

Ответ 2

И для Swift 2.x или 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
    }
}