用NSAttributedString实现简单的图文混排-----(确实几个需要注意的地方都注意到了就好了。)

iOS7以后 因为TextKit的强大 可以用NSAttributedString很方便的实现图文混排(主要是利用了NSTextAttachment)。
关于Textkit的牛逼之处 可以参考objcio上的文章( https://objccn.io/issue-5-1/

我用NSAttributedString仿写了一个知乎的输入框(低仿就是有个功能而已)效果如图:

demo在这里:( https://github.com/Phelthas/TEST_XMLCommon   的第四个)
 
 
有几个需要注意的地方 值得记录一下:
1textView有个 typingAttributes属性 可以让输入的文字自动变成NSAttributedString 根本不用自己去设置AttributedText;
 
2 textView有个 selectedRange属性 就是指当前的光标的位置 可以用来确定插入图片的位置;
 
3 如果打断点观察textView.text可以发现 插入的图片被替换成一个特殊的UTF8字符“\U 0000fffc” 这个字符在iOS设备上不会显示 不是空格 不是换行
     但是 它是存在的!!!它有location 有length(就是1) 在整个字符串中有位置(NSRage) 所以应该把它当成一个占位的字符来看待!
     有了这个占位字符 其实比没有要方便 方便上传服务器 方便从服务器获取数据 方便与其他平台共通数据;
     如果没有 还要自己记录图片的位置 这时候如果有修改 就要更新所有图片的位置 很麻烦。。。
 
4 NSTextAttachment要设置bounds属性 否则图片会按图片自己的尺寸显示 如果图片太大就会显示不全
     这里可以把图片裁一下显示 上传图片的时候 根据需求上传原图或者裁剪过的图片就行 可以让UI更流畅
 
5 可以用
string enumerateAttribute:NSAttachmentAttributeNameinRange :NSMakeRange( 0,  string.length) options: 0usingBlock:
这个方法来确定最后的attributedString最终包含的图片 比每次插入图片的时候记录位置要方便的多~
 
6 知乎是在插入图片的时候就把图片上传到服务器了 所以把用户打字的这段时间也利用起来了 不用最后点发布的时候再让用户等图片上传 虽然有时候可能会多浪费点流量(用户删图片的时候) 但是我感觉为了提升的用户体验这是值得的~
 
7 如果从服务器取数据的话 显示的时候其实不能用同样的方式显示 因为图片肯定是需要异步加载的 所以这时候还是要用常规的方法来做 就是一堆文字和图片的显示;可以直接用label和imageView排列组合 也可以用一个tableView来显示
 
8 textView和textField有一个 inputAccessoryView属性 是自动跟着键盘动的 如果不是需要一直显示的输入框 用这个属性要比监听键盘通知要方便很多~
 
9 图片的占位字符“\U 0000fffc”其实是有 Attributes样式的 所以有时候删除了图片后的字符 再输入的时候 新的显示可能就是默认的 Attributes样式了 所以比较保险的做法是给占位字符也add正文的 Attributes样式 不知道有没有更好的办法~
 
暂时就这些 等想到再补充~
有什么问题 欢迎讨论~ 
 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值