【问题标题】:Setting dynamic height on UItextview to fit content programmatically在 UItextview 上设置动态高度以以编程方式适合内容
【发布时间】:2016-02-06 03:18:58
【问题描述】:

仅通过编程编码,我正在尝试实现如下图所示的效果。 TextView 和 ContainerView 嵌入在滚动视图中,虽然它没有显示在图像中。

这是我的代码。

override func viewDidLoad() {
    super.viewDidLoad()
    let margin = CGFloat(10)
    textView =  UITextView()
    textView.text = "asdadaasdadadadasdadadadasdadadadasdadadadasdadadadasdadadadasdadadadasdadadadasdadadadasdadadadasdadadadasdadadadasdadadadasdadadadasdadadadaadasdadadadasdadadadasdadadadasdadadadasdadadadasdadadadasdadadadasdadadadasdadadadasdadadadasdadadadasdadadadasdadadaddadd"
let contentSize = textView.sizeThatFits(textView.bounds.size)
textView.frame = CGRectMake(margin, 0, self.view.frame.width - 2 * margin, contentSize.height)


let scrollView = UIScrollView(frame: CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height - 50))
let containerView = UIView(frame: CGRectMake(margin, contentSize.height + margin, self.view.frame.width - 2 * margin, self.view.frame.height))

let button1 = UIButton(frame:  CGRectMake(margin, contentSize.height + containerView.frame.height + 2 * margin, (view.frame.width - 2 * margin)/2, 30))

scrollView.contentSize = CGSize(width: self.view.frame.width, height: button1.frame.origin.y + button1.frame.height + margin)

self.view.addSubview(scrollView)
scrollView.addSubview(textView)
scrollView.addSubview(containerView)

scrollView.backgroundColor = UIColor.blueColor()
containerView.backgroundColor = UIColor.yellowColor()
textView.backgroundColor = UIColor.greenColor()
}

问题在于 textview 的高度不是动态的,无法在 textview 中显示所有内容。

我已经确认,如果我在 viewdidappear 中添加下面的代码,它确实会使 textview 的高度动态化,但它堆叠在 Container 视图下,因为下面的代码在 ViewDidLoad 配置完所有内容后运行。

let contentSize = textView.sizeThatFits(textView.bounds.size)
textView.frame = CGRectMake(margin, 0, self.view.frame.width - 2 * margin, contentSize.height)

解决此类问题的最佳方法是什么? 我认为这是由于 viewdidload 中的渲染顺序引起的,但我不确定 100%。如果有人也可以谈论渲染顺序,那就太好了。

【问题讨论】:

  • 您是否有理由希望/需要以编程方式进行布局?这会使事情变得非常困难。为什么不直接使用约束?
  • @Dan,尝试使用约束,这比编写代码更痛苦。

标签: ios swift uitextview


【解决方案1】:

要回答最初的问题,您对 sizeThatFits 的调用不知道 TextView 应该有多高,因为它不知道您希望它有多宽。我认为在 sizeThatFits 行之前,您需要以下内容:

textView.frame.size.width = self.view.frame.width - 2 * margin

【讨论】:

  • 就是这样。但是我需要在 sizeThatFits 之后再写这行吗? textView.frame = CGRectMake(margin, 0, self.view.frame.width - 2 * margin, contentSize.height) 我觉得我在复制宽度部分。有没有更好的重构方法?
  • 确实宽度部分在那里重复,但需要设置其他属性(x,y,height。)x & y 默认为 0,所以你可以用 textView 替换它.frame.size.height = contentSize.height
猜你喜欢
  • 2018-02-18
  • 1970-01-01
  • 2018-03-02
  • 2012-08-15
  • 2022-06-11
  • 2022-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多