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


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

есть ли способ изменить высоту линии в UITextView?

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

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

EDIT: Я знаю, что есть UIWebView и, что приятно, и можно делать укладку и т. д. Но это не редактируется. Мне нужен редактируемый текстовый компонент с приемлемой высотой строки. Эта вещь из рамок Omni тоже не помогает, так как она слишком медленная и не чувствует себя правильно...

8 54

8 ответов:

после 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. Это дает еще больше контроля, например, отступ первой строки, и расчет ограничивающий прямоугольник. Так что альтернативно...

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;

Примечание: это не доступно в 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, конечно, может не согласиться (хотя, учитывая, как мы все привыкли к swizzle все, чтобы настроить внешний вид UIKit, я чувствую, что такого рода "частное" использование-это не то, что Apple возражает), но это такой простой способ достижения целей этот вопрос, который вы можете также попробовать. Если приложение будет отклонено, вы можете потратить (возможно, значительное) время на более сложное решение.

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

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

UITextView's Attribute Inspector

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

#import "SomeDangTextView.h"

@interface UITextView ()

- (id)styleString;

@end

@implementation SomeDangTextView

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

@end

согласно документации Apple, вы можете использовать UIWebView.

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

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

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