如何实现AppStore查看更多的方法

UITextView-More

使用UITextKit 实现“更多”的折叠效果

预览

主要代码

获取最后一行Rect

1
2
3
4
5
6
7
8
var lastRect = CGRect.zero
layoutManager.enumerateEnclosingRects(forGlyphRange: NSRange(location: 0, length: textStorage.string.characters.count), withinSelectedGlyphRange: NSRange(location: NSNotFound, length: 0), in: textContainer, using: { [weak self] (rect, isStop) in
guard let _self = self else { return }
var newRect = rect
newRect.origin.y += _self.textContainerInset.top
lastRect = newRect
})
print(lastRect)

增加 exclusionPaths

1
textContainer.exclusionPaths = [UIBezierPath.init(rect: rect)]

备注

  • UITextView默认携带左右边距,通过UITextView.textContainer.lineFragmentPadding获取
  • UITextView默认携带上下左右边距(UITextView.textContainerInset),其中左右和lineFragmentPadding相加
  • 此处并没有对TruncateTextView进行过多的设置,主要是因为继承在UITextView下,GIF中的这部分设置放在了ViewController.swift
  • 此处使用的是frame,可以在UIView.sizeToFit()之后获取到UIViewSize。约束也大抵如此

  • 感谢乐逍遥提供的例子,才找到了open func truncatedGlyphRange(inLineFragmentForGlyphAt glyphIndex: Int) -> NSRange方法😂