返回顶部
首页 > 资讯 > 精选 >iOS UITextView如何实现类似微博的话题、提及用户效果
  • 128
分享到

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

2023-07-02 00:07:46 128人浏览 独家记忆
摘要

这篇文章主要介绍“iOS UITextView如何实现类似微博的话题、提及用户效果”,在日常操作中,相信很多人在ioS UITextView如何实现类似微博的话题、提及用户效果问题上存在疑惑,小编查阅了各式资料,整理出简

这篇文章主要介绍“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种实现方案:

  • 直接给UITextView添加点击事件

  • 通过设置LinkAttribute,利用超文本链接的点击实现

  • 重写UITextViewtouches...方法

其中,第二种只限于在非编辑状态(即 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如何实现类似微博的话题、提及用户效果”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

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

本文链接: https://lsjlt.com/news/338666.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • iOS UITextView 实现类似微博的话题、提及用户效果
    目录#话题#1.高亮2.点击事件@提及用户1.高亮2.整体删除最近接了一个需求,在发布动态的时候,增加类似微博的#话题#、@提及用户的效果,在此做一简要记录。 #话题# 最终效果是:...
    99+
    2024-04-02
  • iOS UITextView如何实现类似微博的话题、提及用户效果
    这篇文章主要介绍“iOS UITextView如何实现类似微博的话题、提及用户效果”,在日常操作中,相信很多人在iOS UITextView如何实现类似微博的话题、提及用户效果问题上存在疑惑,小编查阅了各式资料,整理出简...
    99+
    2023-07-02
  • Android如何实现类似iOS风格的对话框
    这篇文章将为大家详细讲解有关Android如何实现类似iOS风格的对话框,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。分享一个简单的常用的对话框类,按照国际惯例,先上图布局简单,先上布局。一个标题,一个内...
    99+
    2023-05-30
    android ios
  • Android实现类似IOS右滑返回的效果(原因分析及解决办法)
    使用类库SwipeBackLayout https://github.com/Issacw0ng/SwipeBackLayout 出现的问题: 1. 主Activity返回...
    99+
    2022-06-06
    IOS Android
  • 如何使用纯CSS实现类似悬浮窗口的效果
    悬浮窗口是在网页设计中经常使用的一种效果,它可以提供快速访问功能或者展示重要的信息。本文将介绍如何使用纯CSS来实现类似悬浮窗口的效果,包括具体的代码示例。首先,我们需要在HTML中创建一个容器元素,用于承载悬浮窗口的内容。可以是一个div...
    99+
    2023-10-21
    实现 纯CSS 悬浮窗口
  • CSS3中input框如何实现类似Google登录的动画效果
    这篇文章给大家分享的是有关CSS3中input框如何实现类似Google登录的动画效果的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 用css3将input框写出类似Google登录页面的动画效果效果一...
    99+
    2023-06-08
  • 如何在web页面中实现类似excel固定表头或标题行的效果
    这篇文章将为大家详细讲解有关如何在web页面中实现类似excel固定表头或标题行的效果,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。 如果没有报表工具或者使用的开源报表工具中没有固定表头功能...
    99+
    2023-06-03
  • Vue如何实现类似头条效果的横向滚动导航条
    这篇文章主要讲解了“Vue如何实现类似头条效果的横向滚动导航条”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Vue如何实现类似头条效果的横向滚动导航条”吧!  cube-ui 所提供的组件中...
    99+
    2023-07-04
  • 如何进行C语言猜凶手及类似题目的实现
    这期内容当中小编将会给大家带来有关如何进行C语言猜凶手及类似题目的实现,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。描述:日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。以下为4个...
    99+
    2023-06-26
  • Vue.js+cube-ui如何实现类似头条效果的横向滚动导航条
    这篇文章主要介绍Vue.js+cube-ui如何实现类似头条效果的横向滚动导航条,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!对于这样的效果,在各大移动端项目中几乎是随处可见,为什么...
    99+
    2024-04-02
  • Android如何模仿实现微博详情页滑动固定顶部栏的效果
    这篇文章主要介绍了Android如何模仿实现微博详情页滑动固定顶部栏的效果,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。先来看下我们今天要实现的效果:滑动固定顶部栏效果图这段...
    99+
    2023-05-30
    android
  • 微信开发中如何实现提示在浏览器打开的效果
    这篇文章主要为大家展示了“微信开发中如何实现提示在浏览器打开的效果”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“微信开发中如何实现提示在浏览器打开的效果”这篇文...
    99+
    2024-04-02
  • vue刷新页面时如何实现去闪烁提升用户体验效果
    小编给大家分享一下vue刷新页面时如何实现去闪烁提升用户体验效果,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!首先在最外层div...
    99+
    2024-04-02
  • 【小程序】小程序如何实现滑动翻页(类似刷短视频的交互效果)
    在微信小程序中实现上下滑动翻页的效果其实非常简单,可以说一学就会。 这篇文章将非常详细地教大家如何实现这一交互: 数据准备 首先我们在 Page 的 data 属性中添加两个变量: data: { ...
    99+
    2023-09-12
    小程序
  • 如何使用ES6的class类继承实现绚丽小球效果
    今天小编给大家分享一下如何使用ES6的class类继承实现绚丽小球效果的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。介绍本效...
    99+
    2023-06-17
  • 如何实现系统之外的字体引用及过渡效果
    这篇文章主要讲解了“如何实现系统之外的字体引用及过渡效果”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何实现系统之外的字体引用及过渡效果”吧!代码如下:<span ><s...
    99+
    2023-06-08
  • 如何使用ES6的class类继承来实现绚丽小球效果
    目录介绍实现步骤创建canvas画布环境书写小球类Ball实现继承球类(Ball)的MoveBall类实例化小球index.js完整代码总结介绍 本效果采用Canvas画布绘制,再...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作