iOS-文本内容展开/收起实现方案

方案1:YYLabel

问题:YYLabel继承于UIView不支持项目本身的自定义表情,UILabel能正常显示自定义表情,pass

if self.model?.textDisplayType == 1 { // 展开
    contentLabel.truncationToken = truncationToken
} else { // 收起
    attrStr.append(moreAttStr)
}
contentLabel.attributedText = attrStr
// @discussion It only support the attributes declared in CoreText and YYTextAttribute.不支持自定义表情

方案2:UILabel

思路:手动获取label的显示字符个数,自己处理展示逻辑+点击逻辑

1.展示逻辑:

手动获取label的显示字符个数

2.点击逻辑:

1.用UITextView的链接,有点瑕疵。
具体为:点击一下会出现灰色背景色,长按会出现一个菜单,还有剪切复制菜单。

attributedString.addAttributes([NSAttributedString.Key.link : "xxx://"], range: range)
func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction){
if URL.scheme == "xxx" {
            print("hhhhhh")
            return false
        }
        return true
}
// 禁用掉其他手势,长按菜单和剪切复制菜单没了,还剩一个点击态灰色背景色
if let gesArr = textView.gestureRecognizers {
            for (idx, ges) in gesArr.enumerated() {
                print(ges.self)
                ges.isEnabled = idx == 0
            }
        }

txtView.isSelectable = false // 同时禁用了可选和超链接跳转
canPerformAction return false // 不显示菜单栏了,但是仍然可选
添加长按手势以屏蔽默认的手势 // 不能屏蔽
添加自定义手势,并禁用掉其他手势 // do work

override func canPrevent(_ preventedGestureRecognizer: UIGestureRecognizer) -> Bool {
        // 点击时走了3次,只有第一次state=ended,后面两次都是failed
        if preventedGestureRecognizer.view is LinkTextView {
            return false
        }
        return true
    }

2.用CoreText的点击
瑕疵:
展开文案没有完全居右
收起的点击区域不太准确
带表情的多行文本展示了2行

3.保底方案
另起一行展开/收起,不追加在内容后面。
遇到问题:展开收起-tabview闪动
禁用掉预估高度,然后手动计算cell高度即可

tableView.estimatedRowHeight = 0.0
tableView.estimatedSectionHeaderHeight = 0.0
tableView.estimatedSectionFooterHeight = 0.0

遇到问题:

1、let line: CTLineRef = CFArrayGetValueAtIndex(lines, 0)
这会产生错误“’ConstUnsafePointer<()&'不能转换为'CTLineRef''. Cast似乎没有改变这个错误
let line: CTLineRef = lines[0]
产生错误“’CFArrayRef’没有名为’subscript’的成员”
改用unsafeBitCast即可
Swift 类型UnsafeRawPointer转化报错

2、ios获取UILabel每行显示的文字
https://www.jianshu.com/p/65a07b6013c7

3、iOS 富文本添加点击事件
https://www.jianshu.com/p/480db0cc7380

4、iOS中CoreText框架探究
https://www.jianshu.com/p/9987e6194b2e

5、展开收起-tabview闪动
禁用掉预估高度,然后手动计算cell高度即可

tableView.estimatedRowHeight = 0.0
tableView.estimatedSectionHeaderHeight = 0.0
tableView.estimatedSectionFooterHeight = 0.0

你可能感兴趣的:(iOS-文本内容展开/收起实现方案)