文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

iOS UITextView如何实现类似微博的话题、提及用户效果

2023-07-02 00:37

关注

这篇文章主要介绍“iOS UITextView如何实现类似微博的话题、提及用户效果”,在日常操作中,相信很多人在iOS UITextView如何实现类似微博的话题、提及用户效果问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”iOS UITextView如何实现类似微博的话题、提及用户效果”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

#话题#

最终效果是:

iOS UITextView如何实现类似微博的话题、提及用户效果

iOS UITextView如何实现类似微博的话题、提及用户效果

1.高亮

基本思路是:使用正则匹配出成对的#,再利用UITextView的富文本实现高亮效果。

func refreshTopicStyle() {                let regex = try! NSRegularExpression(pattern: "此处填写正则表达式",                                             options:[NSRegularExpression.Options.caseInsensitive])        // 注意点        let totalRange = NSMakeRange(0, (inputTextView.attributedText.string as NSString).length)        let results = regex.matches(in: inputTextView.attributedText.string,                                    options: NSRegularExpression.MatchingOptions.init(rawValue: 0),                                    range: totalRange)        let attributedString: NSMutableAttributedString = NSMutableAttributedString(string: inputTextView.attributedText.string)        attributedString.setAttributes(normalAttributes, range: totalRange)                for result in results {            attributedString.setAttributes(topicAttributes, range: result.range)        }        inputTextView.attributedText = attributedString    }

这有一个注意点,计算 totalRange 前,先将 String 转成了 NSString,这是因为此处 NSRange 中的 length 需要的是 UTF-16 长度,也就是与 NSString 的 length 定义一致,而 Swift 中的 String 没有 length 只有 count,指的是字符数,当文本中出现 emoji 表情时,二者就不一致了。

iOS UITextView如何实现类似微博的话题、提及用户效果

当然,也有一些其他办法来处理,如:

let lengthA = inputTextView.textStorage.lengthlet lengthB = inputTextView.attributedText.string.utf16.count

2.点击事件

实现高亮部分的点击事件,目前有3种实现方案:

其中,第二种只限于在非编辑状态(即 textView.isEditable = false)下的点击,故排除,①、③均可,本文采用第一种,主要实现如下:

inputTextView.addTapGesture(self, handler: #selector(tapAttributedText(tap:)))@objc private func tapAttributedText(tap: UITapGestureRecognizer) {    guard tap.isKind(of: UITapGestureRecognizer.self), let textView = tap.view as? UITextView else {        return    }    let layoutManager = textView.layoutManager    var tapLocation = tap.location(in: textView)    tapLocation.x -= textView.textContainerInset.left    tapLocation.y -= textView.textContainerInset.top    let characterIndex = layoutManager.characterIndex(for: tapLocation,                                                      in: textView.textContainer,                                                      fractionOfDistanceBetweenInsertionPoints: nil)    for result in getCheckResult(format: Constants.TopicRegularExpression, text: inputTextView.attributedText.string) {        if result.range.location < characterIndex, characterIndex < result.range.location + result.range.length {            // 此处响应点击事件            MBProgressHUD.showOnlyText(to: self.view, title: "美好时光")            return        }    }    inputTextView.becomeFirstResponder()}

@提及用户

iOS UITextView如何实现类似微博的话题、提及用户效果

iOS UITextView如何实现类似微博的话题、提及用户效果

1.高亮

本来准备用正则匹配的,但因为只允许选取的用户名高亮,纯手动输入的不高亮,所以使用正则匹配就不合理了,这里采用实时记录、更新已选取用户名位置的方式实现。

/// 用来保存已选取用户信息的结构体struct UserInfo {    /// 用户名    var userName: String    /// 位置信息    var range: NSRange    /// 用于临时替换的等长字符串    var placeholder: String}

因为#话题#@提及用户可以同时存在,所以需要考虑可能互相影响的问题,比如@提及用户中间可能出现#,导致前后话题的正则匹配发生错乱。

解决方案是:先使用一个@开头且与@提及用户等长的字符串替换@提及用户,再执行#话题#的正则匹配,最后再换回来。

2.整体删除

删除操作分为两步:第一次点删除仅选中整个用户名(提醒用户是整体删除);第二次点删除才真的删除文本。

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {    if text == "" {        for (num, user) in usersArray.enumerated() { // usersArray 用于存放已选取的用户信息            // ②删除选中的用户名            if textView.selectedRange.location <= user.range.location && NSMaxRange(user.range) <= NSMaxRange(textView.selectedRange) {                textView.replace(textView.selectedTextRange ?? UITextRange(), withText: "")                return false            }            // ①选中用户名            if textView.selectedRange.length == 0 && (textView.selectedRange.location == user.range.location + user.range.length) {                textView.selectedRange = user.range                return false            }        }    }}

到此,关于“iOS UITextView如何实现类似微博的话题、提及用户效果”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯