Как потерять поля / отступы в UITextView? - PullRequest
442 голосов
/ 14 апреля 2009

У меня есть UITextView в моем приложении iOS, которое отображает большой объем текста.

Затем я выполняю постраничный просмотр этого текста с помощью параметра поля смещения UITextView.

Моя проблема в том, что заполнение UITextView сбивает с толку мои расчеты, так как оно кажется различным в зависимости от размера шрифта и используемого шрифта.

Поэтому я задаю вопрос: возможно ли удалить отступы, окружающие содержимое UITextView?

С нетерпением ждем ваших ответов!

Ответы [ 20 ]

6 голосов
/ 14 февраля 2018

Вот обновленная версия очень полезного ответа Фатти. Он добавляет 2 очень важные строки, которые помогли мне получить идеальный макет, работающий на iOS 10 и 11 (и, вероятно, на более низких).
д

@IBDesignable class UITextViewFixed: UITextView {
    override func layoutSubviews() {
        super.layoutSubviews()
        setup()
    }
    func setup() {
        translatesAutoresizingMaskIntoConstraints = true
        textContainerInset = UIEdgeInsets.zero
        textContainer.lineFragmentPadding = 0
        translatesAutoresizingMaskIntoConstraints = false
    }
}

Важными строками являются два translatesAutoresizingMaskIntoConstraints = <true/false> утверждения!

Это удивительно удаляет все поля при всех моих обстоятельствах!

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

Поэтому я прочитал здесь, на SO , что включение и отключение translatesAutoresizingMaskIntoConstraints действительно помогает при ручной настройке фрейма / границ между вызовами.

К счастью, это работает не только с настройкой кадра, но и с двумя строками setup(), расположенными между двумя translatesAutoresizingMaskIntoConstraints вызовами!

Это, например, очень полезно при расчете кадра вида с использованием systemLayoutSizeFitting для UIView. Возвращает правильный размер (чего раньше не было)!

Как и в оригинальном ответе упоминается:
Не забудьте отключить scrollEnabled в Инспекторе!
Это решение работает правильно как в раскадровке, так и во время выполнения.

Вот и все, теперь вы действительно готово!

5 голосов
/ 24 мая 2018

Последний Свифт:

self.textView.textContainerInset = .init(top: -2, left: 0, bottom: 0, right: 0)
self.textView.textContainer.lineFragmentPadding = 0
3 голосов
/ 26 октября 2017

Для swift 4, Xcode 9

Используйте следующую функцию, чтобы изменить поле / отступ текста в UITextView

открытый функционал UIEdgeInsetsMake (_ вверху: CGFloat, _ слева: CGFloat, _ внизу: CGFloat, _ справа: CGFloat) -> UIEdgeInsets

так что в данном случае это

 self.textView?.textContainerInset = UIEdgeInsetsMake(0, 0, 0, 0)
2 голосов
/ 04 марта 2018

Вот небольшое простое расширение, которое удалит поля Apple по умолчанию из каждого текстового представления в вашем приложении.

Примечание. Интерфейсный конструктор по-прежнему будет отображать старое поле, но ваше приложение будет работать так, как ожидается.

extension UITextView {

   open override func awakeFromNib() {
      super.awakeFromNib();
      removeMargins();
   }

   /** Removes the Apple textview margins. */
   public func removeMargins() {
      self.contentInset = UIEdgeInsetsMake(
         0, -textContainer.lineFragmentPadding,
         0, -textContainer.lineFragmentPadding);
   }
}
2 голосов
/ 01 апреля 2011

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

0 голосов
/ 16 мая 2019

Если кто-то ищет последнюю версию Swift, то приведенный ниже код работает нормально с Xcode 10.2 и Swift 4.2

yourTextView.textContainerInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
0 голосов
/ 17 июня 2018

Для меня (iOS 11 и Xcode 9.4.1) волшебным образом было установить свойство textView.font в стиле UIFont.preferred(forTextStyle:UIFontTextStyle), а также первый ответ, упомянутый @Fattie. Но ответ @Fattie не сработал, пока я не установил свойство textView.font, иначе UITextView ведет себя беспорядочно.

0 голосов
/ 12 августа 2011
[firstNameTextField setContentVerticalAlignment:UIControlContentVerticalAlignmentCenter];
0 голосов
/ 25 декабря 2016

Прокрутка textView также влияет на положение текста и делает его не центрированным по вертикали. Мне удалось отцентрировать текст в представлении, отключив прокрутку и установив верхнюю вставку в 0:

    textView.scrollEnabled = NO;
    textView.textContainerInset = UIEdgeInsetsMake(0, textView.textContainerInset.left, textView.textContainerInset.bottom, textView.textContainerInset.right);

По какой-то причине я еще не понял, курсор все еще не центрирован до начала набора, но текст центрируется сразу же, как я начинаю печатать.

0 голосов
/ 28 февраля 2013

Я нашел еще один подход: получить представление с текстом из подпредставлений UITextView и настроить его в методе layoutSubview подкласса:

- (void)layoutSubviews {
    [super layoutSubviews];

    const int textViewIndex = 1;
    UIView *textView = [self.subviews objectAtIndex:textViewIndex];
    textView.frame = CGRectMake(
                                 kStatusViewContentOffset,
                                 0.0f,
                                 self.bounds.size.width - (2.0f * kStatusViewContentOffset),
                                 self.bounds.size.height - kStatusViewContentOffset);
}
...