2015-07-27 2 views
0

Я создаю изображение для экспорта в моем приложении iOS. Я использую UIGraphicsBeginImageContext для рисования элементов изображения, но я пытался рисовать UITextView на изображении.Получить количество строк в UITextView без contentSize.height

Сначала я создать родительский вид для рендеринга:

var parentView : UIView = UIView(frame: CGRectMake(0, 0, 700, 700)) 

Тогда я программно создать TextView и добавить все свойства. Я даю ему x = 100 и y = 100 для выравнивания текста на изображении. Ширина = 500 хорошо иметь запас 100px на каждой стороне:

var textView: UITextView = UITextView(frame: CGRectMake(100, 100, 500, 350)) 
textView.text = myText 
textView.textContainerInset = UIEdgeInsetsMake(20, 20, 20, 20) 
textView.backgroundColor = UIColor(red: 255, green: 255, blue: 255, alpha: 0.70) 
textView.font = UIFont(name: "Helvetica Neue Light Italic", size: 35) 

Тогда я оказать TextView в контексте, добавив его как подвид с родительским видом, а затем я получаю изображение для экспорта:

Проблема в том, что высота установлена ​​на 350 пикселей, но иногда текст недостаточно длинный, чтобы использовать всю эту область. В идеале я хотел бы знать, сколько строк будет мой текст использовать, так что я могу дать ему пропорциональную высоту и не имеют белую неиспользованную область (см рис, например):

Info Любые идеи о том, как отображать текст вид с пропорциональной высотой? Большое спасибо!

+0

Есть ли причина, что вы используете текстовый вид вместо UILabel? – Travis

+0

Не совсем, может ли это быть с UILabel? –

+0

UILabel отлично подходит для этого, учитывая, что это всего лишь две линии. Если вы используете раскадровки (что я настоятельно рекомендую вам сделать), вы можете изменить ограничения и размер UILabel, чтобы они соответствовали тексту. Просто не забудьте установить количество строк на 2. – Cole

ответ

1

Я не нашел способ получить количество строк, но мне удалось удалить все это пустое пространство, используя textView.sizeToFit(). Он отлично работал, надеюсь, кто-то найдет это полезным!

8

Я нашел идеальное решение этой проблемы в Apple Text Layout Programming Guide. Решение Apple предоставляет в Objective-C, поэтому я тестировал и перезаписывал его для Swift.

Оба метода отлично работают и возвращают точные количество строк, которые используются в UITextView, без фанк-математики и 100% -ной точности каждый раз.

Вот мое расширение UITextView добавить numberOfLines() метод:

extension UITextView { 
    func numberOfLines() -> Int { 
     let layoutManager = self.layoutManager 
     let numberOfGlyphs = layoutManager.numberOfGlyphs 
     var lineRange: NSRange = NSMakeRange(0, 1) 
     var index = 0 
     var numberOfLines = 0 

     while index < numberOfGlyphs { 
      layoutManager.lineFragmentRectForGlyphAtIndex(
       index, effectiveRange: &lineRange 
      ) 
      index = NSMaxRange(lineRange) 
      numberOfLines += 1 
     } 
     return numberOfLines 
    } 
} 

Просто позвоните это прямо на UITextView как так: myTextView.numberOfLines() < - возвращает Int


Этот расширение также легко преобразуется в такой метод:

func numberOfLines(textView: UITextView) -> Int { 
    let layoutManager = textView.layoutManager 
    let numberOfGlyphs = layoutManager.numberOfGlyphs 
    var lineRange: NSRange = NSMakeRange(0, 1) 
    var index = 0 
    var numberOfLines = 0 

    while index < numberOfGlyphs { 
     layoutManager.lineFragmentRectForGlyphAtIndex(index, effectiveRange: &lineRange) 
     index = NSMaxRange(lineRange) 
     numberOfLines += 1 
    } 
    return numberOfLines 
} 

Просто позвоните numberOfLines(myTextView) для извлечения Int числа линий

+2

Не дает точного количества строк, если последний символ равен \ n – iHulk

+0

имел ту же проблему ^^ –

+0

Да, у меня также была та же проблема с последним символом: \ n –

Смежные вопросы