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

Установка высоты строки в UITextView

Я уже уверен, что это не может быть сделано с каким-либо общедоступным API, но я все еще хочу спросить:

Можно ли изменить высоту строки в UITextView?

Было бы достаточно сделать это статически, не нужно менять его во время выполнения. Проблема в том, что высота линии по умолчанию - это просто ПУТЬ слишком мала. Текст будет выглядеть чрезвычайно сжатым и является кошмаром при попытке писать более длинные тексты.

спасибо, Макс

РЕДАКТИРОВАТЬ: Я знаю, что есть UIWebView, и это приятно и может делать стиль и т.д. Но это не редактируется. Мне нужен редактируемый текстовый компонент с приемлемой высотой строки. Эта вещь из Omni Frameworks тоже не помогает, так как она слишком медленная и не чувствует себя хорошо...

4b9b3361

Ответ 1

После iOS 7 стиль styleString больше не работает.

Доступны две новые альтернативы.

Во-первых, TextKit; мощный новый механизм компоновки. Чтобы изменить межстрочный интервал, установите делегат менеджера компоновки UITextView:

textView.layoutManager.delegate = self; // you'll need to declare you implement the NSLayoutManagerDelegate protocol

Затем переопределите этот метод делегата:

- (CGFloat)layoutManager:(NSLayoutManager *)layoutManager lineSpacingAfterGlyphAtIndex:(NSUInteger)glyphIndex withProposedLineFragmentRect:(CGRect)rect
{
    return 20; // For really wide spacing; pick your own value
}

Во-вторых, iOS 7 теперь поддерживает NSParagraphStyle lineSpacing. Это дает еще больший контроль, например. отступ первой строки и вычисление ограничивающего прямоугольника. Так что альтернативно...

NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
paragraphStyle.headIndent = 15; // <--- indention if you need it
paragraphStyle.firstLineHeadIndent = 15;

paragraphStyle.lineSpacing = 7; // <--- magic line spacing here!

NSDictionary *attrsDictionary =
@{ NSParagraphStyleAttributeName: paragraphStyle }; // <-- there are many more attrs, e.g NSFontAttributeName

self.textView.attributedText = [[NSAttributedString alloc] initWithString:@"Hello World over many lines!" attributes:attrsDictionary];

FWIW, старый метод contentInset для выравнивания текста вдоль левого края UITextView также не используется в iOS7. Вместо этого, чтобы удалить поле:

textView.textContainer.lineFragmentPadding = 0;

Ответ 2

Примечание: это недоступно в iOS7:


Я обнаружил, что вы можете создать подкласс, который повторно реализует [UITextView styleString]:

@interface UITextView ()
- (id)styleString; // make compiler happy
@end

@interface MBTextView : UITextView
@end
@implementation MBTextView
- (id)styleString {
    return [[super styleString] stringByAppendingString:@"; line-height: 1.2em"];
}
@end

Это не личное использование API: это просто подкласс. Возможно, Apple, конечно, может не согласиться (хотя, учитывая то, как все мы привыкли все шире, чтобы настроить внешний вид UIKit, я считаю, что использование такого рода "private" не является объектом Apple), но это такой простой способ достичь цели этого вопроса, которые вы можете попробовать. Если приложение будет отклонено, вы можете потратить (вероятно, значительное) время на более сложное решение.

Ответ 3

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

Ответ 4

В Инспекторе атрибутов для UITextView вместо этого измените свойство Text на Attributed (от Plain) и нажмите кнопку "more", там вы можете установить высоту и интервал строки.

Инспектор атрибутов UITextView

Ответ 5

Приоритет подкласса UITextView стиляString работает только в том случае, если вы определяете категорию в UITextView, которая определяет styleString, иначе вы получите ошибку компиляции. Например, в подклассе UITextView:

#import "SomeDangTextView.h"

@interface UITextView ()

- (id)styleString;

@end

@implementation SomeDangTextView

- (id)styleString {
    return [[super styleString] stringByAppendingString:@"; line-height: 1.5em"];
}

@end

Ответ 6

В соответствии с Apple Documentation вы можете использовать UIWebView.

Этот класс не поддерживает несколько стилей для текста. Атрибуты шрифта, цвета и текста, которые вы указываете, всегда применяются ко всему содержимому текстового вида. Чтобы отобразить более сложный стиль в вашем приложении, вам нужно использовать объект UIWebView и отображать его содержимое с помощью HTML.

Ответ 7

Этот класс не поддерживает несколько стилей для текста. Атрибуты шрифта, цвета и текста, которые вы указываете, всегда применяются ко всему содержимому текстового вида. Чтобы отобразить более сложный стиль в вашем приложении, вам нужно использовать объект UIWebView и отображать его содержимое с помощью HTML.

Ответ 8

Используйте OHAttributedLabel Lib. Это решит всю проблему, о которой вы упомянули.