如何在textView中垂直对齐文本?

30

我希望能够垂直对齐UITextView中的文本(使其位于中间)。 我该如何实现呢? 我查找了一些资料,但没有找到任何可以帮助我的答案。

提前致谢。


你需要更具体一些,你想从Storyboard还是从代码中实现?如果你想从代码中实现,你使用的Swift版本是什么? - mike vorisis
我使用Swift 3。如果可以从Storyboard中实现会更好,但我没有看到这个选项。 - Volkan
8个回答

61

将您的Text ViewView Controller连接,并按您想要的名称命名(假设我们称其为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


1
假设我有一段只有两行的文本,而我的TextView高度为200。我想要将该文本垂直居中。 - Volkan
4
这个答案很好,只需将那段代码放在父视图的layoutsubviews或控制器中的viewdidlayoutsubviews方法中即可。 - Stan
1
但是这个答案不太支持多行,对吧? - Happiehappie
并且,如果您为 .text 设置新值,还需要调用方法。 - miff
我该如何在创建多行UITextView的单独类中使用它?我尝试将“textView.centerVertically()”放入“override func layoutSubviews()”中,但它不起作用。 - Greg
显示剩余10条评论

4

谢谢!被接受的回答不允许我在textView上滚动,而你的可以(我只需要在layoutSubview中调用它就可以了)。 - benjiii

2
上述答案是正确的,我只想为那些实时/在编辑时更新textView的解决方案添加一些内容。
使用上面的扩展并添加委托方法。
func textViewDidChange(_ textView: UITextView) { textView.centerVertically() }

2
如果您想使用Storyboard完成此操作,可以在textView中添加一个视图。然后,将用于textView的约束设置为新视图。最后,向文本视图添加以下约束:
  • (右和左)O和点指向新视图
  • 使用对齐约束,添加垂直约束。
  • enter image description here


1
你无法把 UIView 放在 UITextView 里面。 - Farkas Antal
啊,这真的很聪明。他是说将一个垂直对齐的TextView放在一个“父”视图中。 - Eric
1
这对我来说完全有效,而且非常容易做到。被低估的答案。我建议将“父”视图设置为水平堆栈视图,然后将对齐方式设置为“居中”,以便文本视图的高度自动调整,始终保持居中。 - Eric

2

Swift 5

将以下extension放置在您的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()

只有这一行对我有用:self.textAlignment = .center - Akbar Khan

1
将以下内容添加到您的扩展或扩展UITextView类中。
public func centerVertically()
{
    let iFont = font == nil ? UIFont.systemFont(ofSize: UIFont.systemFontSize) : font!
    textContainerInset.top = (frame.height - iFont.lineHeight) / 2
}

0

textContainerInset 对我而言比 contentOffset 更有效。

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)
        textContainerInset.top = positiveTopOffset
    }
}

-1

这用于将文本水平居中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接