在表情键盘的图文混排中,会有很多细节问题。有的时候不理解其中的原因是很难改正的。本文主要是整理我遇到的各种问题及解决方案,供大家分享。如果你以前也遇到过类似的问题可以用我的方法修正了,希望能够对博友们有所帮助。本文使用swift语言,OC的可能看不惯,但大多方法基本是一样的就是语法不同。

上期回顾:关于微博编辑页面添加表情键盘

如果你不是在董铂然博客园看到本文,请点击查看原文。

1.默认每添加一个表情是添加到最后,但是我们想添加到光标位置

默认做法(其中的str是通过点击某个表情通过代理传来的表情字符串)

//         会把用户选择的表情,拼接到最后!textView.text = textView.text + (str ?? "")!

如果想插入到光标位置

            // 在用户光标位置插入表情文本textView.replaceRange(textView.selectedTextRange!, withText: str!)

2.添加后的图标大小不一样。

解决方法:给所有的range设置一个统一的格式

           // 设置整个属性字符串中的文本属性let range = NSMakeRange(0, strM.length)// 让 可变的属性文本 的字体 和 textView 的保持一致!strM.addAttribute(NSFontAttributeName, value: textView.font, range: range)

3.因为前面用的是替换文本,所以在中间插入表情之后,光标会跳到段落末尾

解决方法:提前记录光标的位置,然后在替换完文本位置之后再复原光标位置

在恢复光标的时候应该是location+1,如果不加1就是插入后光标在表情的前面

            // 记录光标位置 location 对应光标的位置var location = textView.selectedRange.location// 直接替换文本结果会导致光标移动到文本末尾textView.attributedText =  strM// 重新设置光标位置textView.selectedRange = NSMakeRange(location + 1, 0)

4.但是textView里显示的是textView.AttrubuteText。富文本是对象无法直接发送出去。

解决方法:

①首先在每次点击表情时把textView.AttrubuteText 打印出来 可以看到大批量的打印,输出的是字典。区分后可以看出如果是表情,在字典里有NSAttachment的键值。而文本没有

②通过以上那点的区别,遍历这个大批量打印,打印出dict和Range,把所有的文本和表情都区分开

打印是:

③利用这个思路,写一个textAttrubute的子类,并在这个方法中给表情对应的文本符号赋值,以后后来取用

import UIKitclass SXEmoteTextAttachment: NSTextAttachment {// 表情对应的文本符号var emoteString: String?/// 返回一个 属性字符串class func attributeString(emoticon: Emoticon, height: CGFloat) -> NSAttributedString {var attachment = SXEmoteTextAttachment()attachment.image = UIImage(contentsOfFile: emoticon.imagePath!)attachment.emoteString = emoticon.chs// 设置高度attachment.bounds = CGRectMake(0, -4, height, height)// 2. 带图像的属性文本return NSAttributedString(attachment: attachment)}
}

④在点击某个图片时,调用方法返回一个属性字符串 ,在这一句调用.attributeString时已自动将表情转化成文本符号

        var attributeString = SXEmoteTextAttachment.attributeString(emoticon, height: font.lineHeight)

⑤定义一个result用于记录拼接后的字符串

    /// 返回文本框中转换完成后的字符串 - (将表情图片转换成表情符号)func fullText() -> String {var result = String()let textRange = NSMakeRange(0, attributedText.length)attributedText.enumerateAttributesInRange(textRange, options: NSAttributedStringEnumerationOptions.allZeros, usingBlock: { (dict, range, _) -> Void inif let attachment = dict["NSAttachment"] as? SXEmoteTextAttachment {// 图片result += attachment.emoteString!} else {result += (self.attributedText.string as NSString).substringWithRange(range)}})println("微博文本:\(result)")return result}

⑥最后就是在发微博的时候修改下参数,不是发textView.AttrubuteText 也不是发textView.text .而是发拼接后的

    /// 发微博@IBAction func sendStatus(sender: UIBarButtonItem) {let urlString = "https://api.weibo.com/2/statuses/update.json"if let token = AccessToken.loadAccessToken()?.access_token{// 这里调用fullText方法 返回记录并拼接后的let params = ["access_token":token,"status":textView.fullText()]let net = NetworkManager.sharedManagernet.requestJSON(.POST, urlString, params){ (result, error) -> () inSVProgressHUD.showInfoWithStatus("微博发送成功")self.dismissViewControllerAnimated(true, completion: nil)}}}

⑦到此就完成了,编辑微博内显示,和发送微博时的文本分开治理,互不冲突。

5.取消发布时,撰写微博控制器快速就缩回了,回到了首页键盘才缓慢缩回。

解决方法:

    /// 取消按钮点击事件@IBAction func cancel(sender: UIBarButtonItem) {/// 为了更好的用户体验先缩键盘再缩文本框self.textView.resignFirstResponder()dismissViewControllerAnimated(true, completion: nil)}

6.在输入框中,表情和文字在水平方向上并不是对齐状态,上下有差值

解决方法:微调

            let height = textView.font.lineHeightattachment.bounds = CGRectMake(0, -4, height, height)

7.只有在输入文字时,placeholder和发送按钮才会隐藏和点亮。点击插入图片时没有反应

解决方法:手动让用户在输入图片时也调用代理方法

在图片点击代理方法emoticonsViewControllerDidSelectEmoticon里

        // 手动调用代理方法 - 是否能够插入文本if textView(textView, shouldChangeTextInRange: textView.selectedRange, replacementText: str!) {/// 设置输入框的文字if emoticon.chs != nil {/// 从分类的方法中取textView.setTextEmoticon(emoticon)// 手动调用 didChage 方法textViewDidChange(textView)}else if emoticon.emoji != nil {/// 默认是把表情拼接到最后, 用这行代码是在光标位置插入文本textView.replaceRange(textView.selectedTextRange!, withText: emoticon.emoji!)}}

其中的textViewDidChange 是用来控制按钮状态

    func textViewDidChange(textView: UITextView) {let fullText = self.textView.fullText()self.textView.placeHolderLabel!.hidden = !fullText.isEmptysendButton.enabled = !fullText.isEmpty}

8.在控制最大输入数时一个表情如“[花心]” 占了8个字节

原来是

        // 微博文字通常限制 140 个字if textView.text.lengthOfBytesUsingEncoding(NSUTF8StringEncoding) + text.lengthOfBytesUsingEncoding(NSUTF8StringEncoding) > 140 {return false}

改成

        // 微博文字通常限制 140 个字if (self.textView.fullText() as NSString).length + (text as NSString).length > 140 {return false}

如果你不是在董铂然博客园看到本文,请点击查看原文。

欢迎关注!

浅析微博编辑页面图文混排中遇到的问题相关推荐

  1. Word图文混排中图片的高级处理技巧

    Word图文混排中图片的高级处理技巧 1.插入联机图片 2.图片的处理方式 1.插入联机图片 2.图片的处理方式

  2. WORD(WPS)中把图文混排中的所有图片对齐

    在WORD中,如何把所有图文混排中的所有图片对齐,可以这样: 1.查找-替换,输入^g 然后展开格式-段落:

  3. (一一二)图文混排中特殊文字的点击与事件处理

    在上一篇文章(一一一)图文混排基础 -利用正则分割和拼接属性字符串中提到了对attributedText的特殊处理,将其中的话题.URL都用红色进行了表示,如下图所示: 本节要实现的功能是这样的att ...

  4. 图文混排中,在textView的指定光标下插入文字或图片

    override func viewDidLoad() { super.viewDidLoad()           demoTextView.text = "我是大帅比,真的是一个大帅比 ...

  5. 计算机基础图文混排教案,中职《Word图文混排》教学设计|word图文混排教学设计...

    摘 要 文章举例说明了中等职业学校计算机教学中的<word图文混排>教学设计并通过此设计实现了图文混排在实际生活中的应用,培养及提高了学生团结合作.分析问题和解决问题的能力,特别是应用计算 ...

  6. Unity UGUI图文混排(七) -- 下划线

    之前更新超链接的时候,忘了搭配实现一个下划线的功能,这篇文章就是来补上这一个功能,时间有点长,一方面没有很好的思路,一方面也没多少时间. 先在网上收集了一下下划线的实现操作,一种是在文本下再创建一个文 ...

  7. Unity UGUI图文混排源码(三) -- 动态表情

    这里是根据图文混排源码(二)进一步修改的,其他链接也不贴了,就贴一个链接就好了,第一次看这文章的同学可以先去看看其他几篇文章 Unity UGUI图文混排源码(二):http://blog.csdn. ...

  8. 03-CSS操作--CSS操作规范(书写技巧)+通栏布局+标签的注意事项+三大类标签+边距合并问题+图文混排+图像签名+水平居中+垂直居中

    一.CSS操作规范 1.CSS书写技巧 (1)最外层是一个<div id="bigDiv">,将所有元素都包进去 (2)去除<body>的外边距(body{ ...

  9. 大一计算机ppt4.3实训内容,沪科教版信息技术七年级下册4.3《图文混排》PPT课件4.ppt...

    <沪科教版信息技术七年级下册4.3<图文混排>PPT课件4.ppt>由会员分享,可在线阅读,更多相关<沪科教版信息技术七年级下册4.3<图文混排>PPT课件4 ...

最新文章

  1. leetcode算法题--Wiggle Subsequence
  2. 在div中设置文字与内部div垂直居中
  3. ai怎么调界面大小_科研论文作图系列-从PPT到AI (一)
  4. 【数据结构与算法】【算法思想】分治算法
  5. 数据结构第六篇——顺序存储结构与链式存储结构的特点
  6. Windows10和Ubuntu双系统下用windows引导Ubuntu
  7. Spring Cloud 子项目介绍
  8. post方式加载iframe
  9. 用html写QQ邮箱注册页面,制作简易QQ邮箱登录页面
  10. 电脑登陆出现此工作站和主域间的信任关系失败
  11. less 自适应高度_使用HTML5和Less框架3的自适应Web设计
  12. HTTP学习笔记(适合初学)2
  13. matlab gui invalid handle无效axes guidat handles等等
  14. st25dv--NFC学习
  15. 为什么HDFS中的块如此之大?
  16. 光盘制作软件UltraISO软碟通-原版下载+正版注册码
  17. 强大的Android系统,可自由修改手机型号、SDK版本号等信息。
  18. 高校软件测试实验室建设误区
  19. MATLAB学习笔记0:学习须知
  20. sparksql Error in query: resolved attribute(s)报错分析

热门文章

  1. C语言实现直接插入排序算法
  2. 鸿合hiteboard驱动_鸿合盛视HiteBoard软件使用
  3. 代码块(Java )
  4. Ioc的来由与Ioc基本概念及Ioc使用实现
  5. 热烈祝贺中国芯终于走在世界的前列
  6. 采用位图存储40亿条qq号,用来记录登录状态
  7. 计算机类论文投稿格式,计算机论文发表期刊投稿格式范文参考.PDF
  8. NFS故障:Stale NFS file handle的解决一例
  9. 解决RocketMQ org.apache.rocketmq.remoting.execption.RemotingConnectException:connect to <null> failed
  10. ps去除人像脸上的油光