Как выровнять текст внутри textView по вертикали?

Я хочу выровнять текст внутри моего UITextView по вертикали (так что он будет в середине). Как я могу этого добиться? Я посмотрел вверх и не смог найти ответа, который мог бы мне помочь.

Заранее спасибо.


person Volkan    schedule 29.12.2016    source источник
comment
Вы должны быть более конкретными, хотите ли вы сделать это из раскадровки или из кода, и если вы хотите из кода, какую версию Swift вы используете?   -  person mike vorisis    schedule 30.12.2016
comment
Я использую Swift 3. Было бы лучше, если бы это было из раскадровки, но я не видел такой возможности.   -  person Volkan    schedule 30.12.2016


Ответы (6)


Свяжите свое текстовое представление с вашим контроллером представления и назовите его по своему усмотрению (скажем, textView).

В функции viewDidLayoutSubviews поместите эту строку:

textView.centerVertically()

Затем под последней фигурной скобкой вашего класса поместите это расширение:

extension UITextView {
    func centerVertically() {
        let fittingSize = CGSize(width: bounds.width, height: CGFloat.greatestFiniteMagnitude)
        let size = sizeThatFits(fittingSize)
        let topOffset = (bounds.size.height - size.height * zoomScale) / 2
        let positiveTopOffset = max(1, topOffset)
        contentOffset.y = -positiveTopOffset
    }   
}

Чтобы использовать эту функцию в Swift 2.0, просто измените CGFloat.greatestFiniteMagnitude на CGFloat.max.

person mike vorisis    schedule 29.12.2016
comment
Я хочу центрировать его "вертикально" в контейнере, а не "горизонтально" - person Volkan; 30.12.2016
comment
@Volkan, что ты имеешь в виду вертикально? - person mike vorisis; 30.12.2016
comment
скажем, у меня есть текст только для 2 строк, а мой текст имеет высоту 200. Я хочу центрировать этот текст по вертикали - person Volkan; 30.12.2016
comment
Нет выравнивания специально для вертикальной ориентации. Однако есть ряд стратегий, которые вы можете развернуть, см. здесь: stackoverflow.com/questions/1054558/ - person Yohst; 30.12.2016
comment
@Volkan Я отредактировал свой ответ, используйте это расширение, и все будет хорошо! Не забудьте принять ответ, если он работает, спасибо. - person mike vorisis; 30.12.2016
comment
этот ответ хорош, просто поместите этот код в layoutsubviews супервизора или viewdidlayoutsubviews в контроллере - person stan; 24.07.2017
comment
Но этот ответ не поддерживает многострочный, нет? - person Happiehappie; 14.03.2019
comment
@Happiehappie Я обновил свой ответ, так как Стэн сказал, что вы должны поместить этот код в viewdidlayoutsubviews, чтобы он работал идеально. - person mike vorisis; 14.03.2019
comment
а также, если вы установите новое значение для .text, также необходимо вызвать метод - person miff; 06.09.2019
comment
Как использовать это в отдельном классе, который создает многострочный UITextView? Я пытался вставить textView.centerVertically() в override func layoutSubviews(), но это не сработало. - person Greg; 29.09.2020
comment
@ Грег Привет, ты пытаешься использовать его внутри ячейки или контроллера? Вы получаете сообщение об ошибке или не видите никаких изменений после запуска? Наконец, если вы используете layoutSubviews или viewDidLayoutSubviews, вам нужно вызвать super.layoutSubviews или super.viewDidLayoutSubviews перед вызовом метода. - person mike vorisis; 06.10.2020
comment
@mike vorisis, нет, к сожалению, такая же проблема с super.layoutSubviews() или без него. Я могу показать вам свой код, если вы можете сказать мне, как это сделать. - person Greg; 06.10.2020
comment
@ Грег, я так понимаю, ты пытался использовать его в ячейке, а не в контроллере, верно? (Я не пробовал это в ячейке, попробуйте использовать его внутри рисования) - person mike vorisis; 07.10.2020
comment
@mike vorisis - простите меня, я новичок в Xcode и Swift, и некоторые термины меня сбили с толку. Он находится внутри class CreateTables: UIView{ ... }, созданного ViewController. - person Greg; 07.10.2020
comment
Хорошо, попробуй поместить его в розыгрыш (с супер) - person mike vorisis; 09.10.2020

Если вы хотите сделать это с помощью раскадровки, вы можете добавить представление внутри вашего textView. Затем установите ограничения, которые вы использовали для textView, на новое представление. Наконец, добавьте следующие ограничения в текстовое представление:

  • (справа и слева) O и укажите на новый вид
  • используя ограничения выравнивания, добавьте ограничение по вертикали.

    введите здесь описание изображения

person Christian    schedule 14.02.2019
comment
Вы не можете поместить UIView внутри UITextView. - person Antee86; 28.04.2020

Приведенный выше ответ правильный, просто хочу добавить решение для тех, кто обновляет textView в режиме реального времени/при редактировании.

Используйте указанное выше расширение и также добавьте метод делегата.

func textViewDidChange(_ textView: UITextView) { textView.centerVertically() }

person Raza.najam    schedule 26.11.2019

Свифт 5

Поместите следующее расширение под последней фигурной скобкой в ​​вашем ViewController:

// MARK: - UITextView extension
extension UITextView {

    func centerVerticalText() {
        self.textAlignment = .center
        let fitSize = CGSize(width: bounds.width, height: CGFloat.greatestFiniteMagnitude)
        let size = sizeThatFits(fitSize)
        let calculate = (bounds.size.height - size.height * zoomScale) / 2
        let offset = max(1, calculate)
        contentOffset.y = -offset
    }
}

Вызовите эту функцию после установки текста.

yourTextView.centerVerticalText()
person Antee86    schedule 28.04.2020

Добавьте это в свое расширение или расширяющий класс UITextView.

public func centerVertically()
{
    let iFont = font == nil ? UIFont.systemFont(ofSize: UIFont.systemFontSize) : font!
    textContainerInset.top = (frame.height - iFont.lineHeight) / 2
}
person Ben Levi    schedule 17.01.2021

Это используется для центрирования текста по горизонтали.

person maiordache    schedule 27.11.2020