使用动态textview作为子视图的ScrollView

时间:2016-11-25 05:53:35

标签: ios iphone swift uiscrollview uitextview

我想在scrollView中使用textView。当用户在textView中键入时,textView应该在高度上扩展。在textView达到scrollView高度的高度之前,一切似乎都能正常工作。 scrollView的contentSize未更新。这是我的设置。

--scrollView
  |--contentView
     |--textView

约束设置如下:

ScrollView - 顶部,领先,尾随到superview和bottom to bottomLayoutGuide

ContentView - 顶部,前导,尾随,底部到超级视图(ScrollView),对齐中心x并将中心y对齐到superview(ScrollView)

TextView - 顶部,前导,尾随到superview(ContentView),底部是< = 400指向superview(ContentView)

具体来说,我没有为textView设置高度,因此它可以作为用户类型动态调整大小。我正在使用autolayout,textView也设置为滚动禁用。

我试图在TextViewDidChange委托调用上强制更新contentSize。

func textViewDidChange(_ textView: UITextView) {
     let size = CGSize(width: textView.frame.width, height: CGFloat(MAXFLOAT))
     let value = textView.sizeThatFits(size)
     let newHeight = value.height + textView.frame.minY
     if newHeight > scrollView.contentSize.height {
        contentView.frame = CGRect(x: 0, y: 0, width: textView.frame.width, height: newHeight)
        scrollView.contentSize = CGSize(width: textView.frame.width, height: value.height + textView.frame.minY)
    }
}

这种方法存在几个问题。首先是每次击键都会调用sizeToFit。而textView似乎"减速"我输入的textView文本越多。

另一个问题是,当我旋转屏幕时,scrollView的滚动停止工作。

有人可以对此有所了解吗?

*更新*

我能够将其置于scrollView识别textView的动态高度变化的状态。 我的新约束是这样的:

ScrollView - 顶部,领先,尾随到superview和bottom to bottomLayoutGuide

ContentView - top,leading,trailing,bottom to superview(ScrollView),width to scrollView的superview

TextView - 顶部,前导,尾随到superview(ContentView),底部是= 400点到superview(ContentView)

现在这会相应地更新contentSize,我不需要计算任何帧。然而,这导致另一个问题,其中底部约束总是400.理想情况下,我只希望底部约束在init上为400。并且随着textView的扩展,它应该减少到0(textView底部到达contentView的底部)

有谁知道如何解决这个问题?

0 个答案:

没有答案