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

Добавление левого поля в UITextView

Я пытаюсь добавить левое поле в UITextView.

Я попытался установить свойство contentInset, см. ниже:

UITextView *textView = [[UITextView alloc] initWithFrame: CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height)];
textView.editable = YES;
textView.autoresizingMask = UIViewAutoresizingFlexibleHeight;
textView.backgroundColor = [UIColor clearColor];
textView.opaque = NO;
textView.contentInset = UIEdgeInsetsMake(0, 15.0f, 0, 0);

Кажется, что это работает, хотя он вызывает горизонтальную прокрутку в TextView, который я не хочу.

Я просто хочу, чтобы текстовая вставка слева не увеличивала текст.

4b9b3361

Ответ 1

Если вы хотите только переместить текст, попробуйте

[textView setContentInset:UIEdgeInsetsMake(<#CGFloat top#>, <#CGFloat left#>, <#CGFloat bottom#>, <#CGFloat right#>)];

Если положительное число перемещает "текстовый фрейм" в сторону середины, отрицательный перемещает его из середины.

Например, [textView setContentInset:UIEdgeInsetsMake(0, 20, 0,-20)], переместит текст на 20 пикселей вправо!

Ответ 2

Помните, что для iOS 7 существует специальное свойство

textContainerInset Вставка области размещения текстового контейнера в области содержимого текстового вида.

@property (неатомный, назначить) UIEdgeInsets textContainerInset

Это свойство предоставляет текстовые поля для текста, изложенного в текстовое представление.

Доступность Доступна в iOS 7.0 и более поздних версиях. Объявлено в UITextView.h

в iOS 6 этот контент выполняет работу. Я лично столкнулся с этой проблемой. Все закончилось:

if (isIOS7()) {
    textView.textContainerInset = UIEdgeInsetsMake(0, 10, 0, 10);
} else {
    textView.contentInset = UIEdgeInsetsMake(0, 10, 0, 10);
}

Ответ 3

Единственная вещь, которая работала для меня, заключается в подклассификации UITextView и переопределении следующего метода:

    - (id)styleString
{
    return [[super styleString] stringByAppendingString:@"; line-height: 1.6em;margin-right: 30px; margin-left: 45px; margin-top: 20px;"];
}

По-видимому, вы можете настроить маржу-левую, margin-top и все, что хотите;)


Предложение о размещении UITextView в более крупном UIView не работало для меня, поскольку мне нужно было прокручивать строки на фоне UITextView, для этого я использовал следующий проект с открытым исходным кодом: https://github.com/aahsanali/NoteView

Кроме того, следующее решение не помогло мне вообще:

[textView setContentInset:UIEdgeInsetsMake(0, 20, 0,-20)]

Так как текст не был правильно упакован.

Надеюсь, это решение поможет, поскольку я буквально потратил неделю на то, чтобы проложить этот простой пользовательский интерфейс!

Ответ 4

Вы можете попробовать этот код ниже с помощью Swift 3.0

// Align the text to the left edge of textContainer
textView.textContainer.lineFragmentPadding = 16
// Align the text with the top of textContainer
textView.textContainerInset = UIEdgeInsets.zero

Это работает для меня.

Ответ 5

Это намного проще, если вы делаете это через IB. Найдите панель с именем Размер прокрутки и установите вставки содержимого.

В коде вы можете попробовать установить scrollEnabled на NO.

Ответ 6

UITextView внутренне реализуется с использованием веб-представления. Эти внутренние элементы используют выделенные недокументированные трюки, которые также изменяются между обновлениями ОС. Один из этих трюков - снова и снова reset свойство contentInsets. Когда и почему не задокументировано, я узнал, что любые изменения в макете текстового вида могут/будут запускать этот reset.

Мой первый совет заключался бы в том, чтобы не пытаться настраивать вставки текстового представления. Это просто хрупкое, и, вероятно, он будет разорван в будущем.

Если вы действительно настаиваете, я бы подклассифицировал UITextView, переопределит -[UITextView layoutSubviews] и закрепит там новые вставки.

В любом случае я перейду к http://bugreport.apple.com и сообщит о текущем поведении как серьезную ошибку.