TextLabel在ScrollView中截断

时间:2017-12-17 16:00:43

标签: ios swift uiscrollview ios-autolayout textlabel

我有一个包含scrollview内部动态文本的文本标签。从标签底部切下几行文字。我已经使用自动布局在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
  }

}

故事板层次结构:

Storyboard Hierarchy

UITextLabel约束(Superview是UIScrollView):

Text Label Constraints

更新的图片:

滚动前的屏幕视图:

enter image description here

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

enter image description here

2 个答案:

答案 0 :(得分:1)

scrollview需要具有明确的内容大小。要做到这一点,它的子视图应该有宽度/高度(至少其中一个)。

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

enter image description here

enter image description here

答案 1 :(得分:1)

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

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

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

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

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

你不需要做任何事情。