UITextView 光标定位

在使用UITextView的时候, 如何在光标的位置插入字符 或者 图片? 以下Demo为你解答:

应用背景:键盘自定义emoji表情

#pragma mark - KVO
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
  //    NSString *newFaceName = change[@"new"];
      NSString *newFaceName = [change objectForKey:NSKeyValueChangeNewKey];
    
      if (!newFaceName || [newFaceName isKindOfClass:[NSNull class]]) {
          return;
      }
      // 在光标位置插入表情
      [self textWithString:newFaceName];
//    [self attributedTextWithString:newFaceName];
    
}

#pragma mark - text && attributedText
- (void)textWithString:(NSString *)newFaceName
{

      // 1.1 获取当前输入的文字
      NSMutableString *string = [NSMutableString stringWithString:_txView.text];
    
      // 1.2 获取光标位置
      NSRange rg = _txView.selectedRange;
      if (rg.location == NSNotFound) {
        
          // 如果没找到光标,就把光标定位到文字结尾
          rg.location = _txView.text.length;
      }
    
      // 1.3 替换选中文字
      [string replaceCharactersInRange:rg withString:newFaceName];
    
      _txView.text = string;
    
      // 1.4 定位光标
      _txView.selectedRange = NSMakeRange(rg.location + newFaceName.length, 0);
}

// _txView.attributedText  && 虽然能在发送微博时显示图片
// 但是由于plist 文件中的 png名字与官方不一样
// 所以发送出去的内容微博不能识别 emoji 表情
- (void)attributedTextWithString:(NSString *)newFaceName
{

      // 1.1 获取当前输入的文字
      NSMutableAttributedString *attributedText = [[NSMutableAttributedString alloc] init];
      // 1.1.1 拼接之前的文字(图片和文字)
      [attributedText appendAttributedString:_txView.attributedText];
    
      // 1.2 获取光标位置
      NSRange rg = _txView.selectedRange;
      if (rg.location == NSNotFound) {
        
        // 如果没找到光标,就把光标定位到文字结尾
        rg.location = _txView.text.length;
      }
    
      // 1.3 替换选中文字
      // 1.3.1 加载图片
      NSTextAttachment *attachment = [[NSTextAttachment alloc] init];
      attachment.image = [UIImage imageNamed:newFaceName];
      CGFloat attchWH = _txView.font.lineHeight;
      attachment.bounds = CGRectMake(0, -3, attchWH, attchWH);
    
      NSAttributedString *attributedString = [NSAttributedString attributedStringWithAttachment:attachment];
    
      // 1.3.2 拼接图片
      [attributedText insertAttributedString:attributedString atIndex:rg.location];
    
      // 1.3.3 设置字体大小,_txView.font--> null ?!
  //    NSRange range = NSMakeRange(0, attributedText.length);
  //    [attributedText addAttribute:NSFontAttributeName value:_txView.font range:range];
    
      // 1.3.4 替换文字
      _txView.attributedText = attributedText;
    
      // 1.4 定位光标
      _txView.selectedRange = NSMakeRange(rg.location + 1, 0);
}

利用KVO监听输入的emoji表情

if (!_faceView) {
  _faceView = [[FaceView alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth, 0)];

  [_faceView.faceImgView addObserver:self forKeyPath:kFaceNameKVO options:NSKeyValueObservingOptionNew context:nil];
}

部分Demo:GitHub FaceViewDemo


转载于:https://www.cnblogs.com/knightguang/p/9605912.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值