Я поигрался с атрибутивным текстом в 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
}