Как вы получаете правильный размер каретки и положение при использовании NSMutableParagraphStyle и paraSpacingBefore в Swift 4 - PullRequest
0 голосов
/ 27 января 2019

Я поигрался с атрибутивным текстом в UITextView (Swift 4.2 и заметил, что после того, как я ввел в свой дизайн «paraSpacingBefore», каретка стала слишком большой в первой строке каждого нового абзаца.

Я нашел это предлагаемое исправление в Stackoverflow, которое, казалось, работало нормально, чтобы исправить размер каретки. Проблема, которую я обнаружил, заключалась в том, что сама каретка всплывает над целевой линией, когда эта строка была началом нового абзаца.

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

Каретка плавает выше целевой линии

Я попытался решить его, сохранив основную идею исходного решения и добавив некоторую логику смещения. Во время отладки я заметил, что исходный ответ для размера каретки всегда корректирует размер, даже когда он не требуется, поэтому я добавил фильтр дисперсии (корректировать только, если дисперсия> 10%). Сделал это потому, что я думаю, что настройка каждый раз будет мешать моему soln. к проблеме плавающей каретки.

Если кто-то может взглянуть на мой предложенный подход, предложить улучшения или лучший способ и т. Д., Я был бы признателен:

override func caretRect(for position: UITextPosition) -> CGRect {
    var superRect = super.caretRect(for: position)
    guard let isFont = self.font else {
        return superRect
    }
    let proposedHeight: CGFloat = isFont.pointSize - isFont.descender
    var delta: CGFloat = superRect.size.height - proposedHeight
    delta = (delta * delta).squareRoot()

    //If the delta is < 10% of the original height just return the original rect
    if delta / superRect.size.height < 0.1 {
        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
    superRect.origin.y = superRect.origin.y + delta
    // delta is used to correct for resized caret floating above the target line

    return superRect
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...