Установить высоту строки в UITextView - PullRequest
55 голосов
/ 21 сентября 2010

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

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

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

спасибо, Max

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

Ответы [ 8 ]

102 голосов
/ 18 сентября 2013

После 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 теперь поддерживает lineSpacing в 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;
25 голосов
/ 21 декабря 2011

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

19 голосов
/ 12 октября 2010

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

15 голосов
/ 06 мая 2016

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

UITextView's Attribute Inspector

10 голосов
/ 02 марта 2012

Переопределение подкласса 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
0 голосов
/ 22 марта 2013

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

0 голосов
/ 21 декабря 2011

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

0 голосов
/ 21 сентября 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...