TextLabel 在 ScrollView 中被截断

Posted

技术标签:

【中文标题】TextLabel 在 ScrollView 中被截断【英文标题】:TextLabel Cut off in ScrollView 【发布时间】:2017-12-17 16:00:42 【问题描述】:

我在滚动视图中有一个包含动态文本的文本标签。几行文本从标签底部被剪掉。我已经使用自动布局在 Storyboard 中设置了所有内容。

我已经尝试在 UIScrollView 上的 ViewDidLoad 中切换 isScrollingEnabled,但无济于事。

我也试过删除文本标签的底部约束并填充它

我已通过消除过程将问题范围缩小到我在使用 html 属性字符串时用来更改 HTML 中的字体的扩展。我不明白为什么这会切断文本,有时只有几行,有时大部分内容,有时所有内容都丢失了

extension NSAttributedString 

  func changehtmlFont(_ text: NSAttributedString) -> NSAttributedString 
  let newAttributedString = NSMutableAttributedString(attributedString: (text))
  newAttributedString.enumerateAttribute(NSAttributedStringKey.font, in: NSMakeRange(0, newAttributedString.length), options: [])  value, range, stop in
  guard let currentFont = value as? UIFont else 
  return
  
  //USE FOR FACE OPTIONS
  let fontDescriptor = currentFont.fontDescriptor.addingAttributes([UIFontDescriptor.AttributeName.family: "Optima", UIFontDescriptor.AttributeName.face: "Bold"])
  //let fontDescriptor = currentFont.fontDescriptor.addingAttributes([UIFontDescriptorFamilyAttribute: "Optima"])
  if let newFontDescriptor = fontDescriptor.matchingFontDescriptors(withMandatoryKeys: [UIFontDescriptor.AttributeName.family]).first 
  let newFont = UIFont(descriptor: newFontDescriptor, size: 32.0) //use size: currentFont.pointSize for default font size
  newAttributedString.addAttributes([NSAttributedStringKey.font: newFont], range: range)
  
  
  return newAttributedString
  


故事板层次结构:

UITextLabel 约束(Superview 是 UIScrollView):

更新的图像:

滚动前的屏幕视图:

到达标签底部时的屏幕视图:

【问题讨论】:

【参考方案1】:

滚动视图需要有明确的内容大小。为此,其子视图应具有宽度/高度(至少其中之一)。

您可以将 UILabel 的宽度设置为屏幕宽度(减去您想要的任何边距)。并将其高度设置为任何默认值,将高度约束优先级设置为950。然后将UILabel的垂直内容拥抱和压缩优先级设置为1000。

【讨论】:

非常感谢。我设置了缺少的约束(高度)并且视图没有滚动,然后我意识到我没有设置拥抱和压缩优先级。一旦我这样做了,视图就会滚动,但文本仍然被截断 我添加了视图的图像以确保我们在同一页面上......我想我们是 你能追加项目吗? 你的堆栈溢出用户名在 GitHub 上是否相同?很高兴将您添加为合作者 是的,是Demosthese【参考方案2】:

我从未使用过故事板,所以我无法告诉您要检查哪些框,但如果您正确使用自动布局,则无需在滚动视图中明确设置任何高度(当然,除非您有视图需要高度)——不是内容大小,不是动态标签,什么都没有。

只要UILabel(或滚动视图中最底部的视图)锚定到滚动视图的底部,就可以了。

someLabel.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor).isActive = true

如果您还正确地将最顶部的视图锚定到滚动视图的顶部,自动布局将为您处理内容大小(还有更多规则,但这是一般前提)。至于标签,让自动布局也为您调整大小。

someLabel.text = someLongString
someLabel.numberOfLines = 0
someLabel.translatesAutoresizingMaskIntoConstraints = false
scrollView.addSubview(someLabel)
someLabel.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor, constant: 16).isActive = true
someLabel.topAnchor.constraint(equalTo: someView.bottomAnchor, constant: 32).isActive = true
someLabel.widthAnchor.constraint(equalTo: view.widthAnchor, constant: -32).isActive = true
someLabel.sizeToFit()

你不需要做更多的事情。

【讨论】:

非常感谢。就是这样,文本标签锚定在滚动视图的底部。对于笑容和笑声,我尝试在代码中设置它,但结果是相同的 :( 内容大小被正确处理,直到标签的最底部。一个结果有超过 300 行文本,只有 2 行被截断。另一个有 120 和 1 行被切断这是非常奇怪的行为 我添加了视图的图像以确保我们在同一页面上......我想我们是

以上是关于TextLabel 在 ScrollView 中被截断的主要内容,如果未能解决你的问题,请参考以下文章

在 UITableViewCell 中叠加 textLabel 和 UIImageView

在 UITableViewCell 中设置 textLabel 的宽度

iPhone UITableViewCell:重新定位 textLabel

如何在数组中添加多个 cell.textLabel.text?

在 UITableViewCell 中编辑 TextLabel [重复]

UITableViewCell textlabel 内容不显示任何内容