0

我在滚动视图中有一个包含动态文本的文本标签。几行文本从标签底部被剪掉。我已经使用自动布局在 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):

文本标签约束

更新的图像:

滚动前的屏幕视图:

在此处输入图像描述

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

在此处输入图像描述

4

2 回答 2

3

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

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

在此处输入图像描述

在此处输入图像描述

于 2017-12-17T16:11:32.167 回答
1

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

只要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()

你不需要做任何比这更多的事情。

于 2017-12-17T17:12:58.857 回答