方案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