iOS7 Введите в UITextView с межстрочным интервалом и продолжайте форматирование с использованием TextKit
Я наткнулся на этот замечательный пример, который помог мне понять, как я могу достигнуть межстрочного интервала / абзаца при вводе текста в UITextView с iOS7, однако есть проблема, и я надеюсь, что кто-то может помочь мне решить проблему, так как я все еще учусь про TextKit пожалуйста.
Это фактический пример https://github.com/downie/DoubleSpacedTextView
Я приложил 2 файла:-
1- Это видео проблемы:- http://1drv.ms/1o8Rpd2
2- Это проект, с которым я тестирую: http://1drv.ms/1o8RtK0
Проблема заключается в том, что если между текстовыми строками есть пустые строки (как минимум 2 пустые строки), а затем щелкните внутри пустых строк, чтобы активировать UITextView и показать клавиатуру, текст перемещается вверх / теряет свое форматирование.
Это основная функция, которую я немного изменил по сравнению с оригиналом, и она выполняет форматирование, она работает отлично, но не при первом щелчке внутри UITextView:-
- (void) formatText
{
__block CGFloat topOffset = 0;
NSRange lineGlyphRange = [self.layoutManager glyphRangeForTextContainer:self.textContainer];
[self.layoutManager
enumerateLineFragmentsForGlyphRange:lineGlyphRange usingBlock:^(CGRect rect, CGRect usedRect, NSTextContainer *textContainer, NSRange glyphRange, BOOL *stop)
{
CGRect adjustedRect = rect;
CGRect adjustedUsedRect = usedRect;
adjustedRect.origin.y = topOffset;
adjustedUsedRect.origin.y = topOffset;
[self.layoutManager setLineFragmentRect:adjustedRect forGlyphRange:glyphRange usedRect:adjustedUsedRect];
topOffset += 30; // 30 is the space between the lines you can adjust this as you like
}];
CGRect adjustedExtraLineFragmentRect = self.layoutManager.extraLineFragmentRect;
CGRect adjustedExtraLineFragmentUsedRect = self.layoutManager.extraLineFragmentUsedRect;
adjustedExtraLineFragmentRect.origin.y = topOffset;
adjustedExtraLineFragmentUsedRect.origin.y = topOffset;
[self.layoutManager setExtraLineFragmentRect:adjustedExtraLineFragmentRect usedRect:adjustedExtraLineFragmentUsedRect textContainer:self.textContainer];
}
Можете ли вы посмотреть, сможем ли мы остановить это? так что текст всегда форматируется при вводе в UITextView.
Есть ли другие примеры, которые показывают, как мы можем ввести форматированный текст (с межстрочным интервалом) в UITextView, используя TextKit или атрибутивный текст?.
Я боролся с этой проблемой начиная с iOS6.
Спасибо,
Будет
1 ответ
У меня нет полного решения, только идеи о том, где искать решение.
Весь код макета запускается из события textChange UITextView. Перемещение курсора не меняет никакого содержимого этого текста, поэтому не вызывается ни один из этого кода. Однако даже присоединение его к textViewDidChangeSelection не устраняет проблему.
Я думаю, это может быть одна из двух вещей:
- NSLayoutManager обрабатывает пустую строку иначе, чем строка с текстом. Это либо означает, что это ошибка TextKit, либо это один из многих делегатов / методов, который просто не вызывается.
- Что-то в прямоугольной математике неправильно для пустой строки. Я полагаю, что единственное ключевое различие в макете, если строка пустая, а не нет, состоит в том, что usedRect для lineFragmentRect имеет ширину 0, но, возможно, он также имеет высоту 0 или неправильное смещение, которое мешает математике. Я действительно не понимаю, что является причиной этого, хотя.