• iOS @功能的部分实现思路


    需求描述

    1. 发布信息时,通过键盘键入@符号,或者点选相关功能键,唤醒@列表,进行选择

    2.选择结束后,输入栏改色显示相关内容

    3.删除时,整体删除@区块,且不能让光标落在@区块之间

    实现步骤

    1. 键入@符号,触发相关功能

     1 - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text{
     2     //判断键入的字符
     3     if ([text isEqualToString:@"@"]) {
     4         //触发相关功能
     5         //[self pickRemaidBtnClick];
     6         return NO;
     7     }
     8 
     9     return YES;
    10 }

    2. @区块颜色修改

    (1)使用到的正则表达式

    #define kATRegular @"@[\u4e00-\u9fa5\w\-\_]+ "

    (2)获取匹配到的区块下标数组

    + (NSArray *) getMatchsWithStr : (NSString *) text {
        // 找到文本中所有的@
        NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:kATRegular options:NSRegularExpressionCaseInsensitive error:nil];
        NSArray *matches = [regex matchesInString:text options:NSMatchingReportProgress range:NSMakeRange(0, [text length])];
        return matches;
    }

    (3)修改文本颜色

    -(void)textViewDidChange:(UITextView *)textView {
        NSArray *matchs = [RemaidUserUtils getMatchsWithStr:textView.text];
        //改色
        [textView.textStorage addAttribute:NSForegroundColorAttributeName value:[UIColor colorWithHexString:@"#333333"] range:NSMakeRange(0, textView.text.length)];
        for (NSTextCheckingResult *match in matchs)
        {
            [textView.textStorage addAttribute:NSForegroundColorAttributeName value:BLUECOLOR range:NSMakeRange(match.range.location, match.range.length - 1)];
        }
    }

    3.删除时整体删除@区块

    - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text{
    
        if ([text isEqualToString:@""])
        {
            NSRange selectRange = textView.selectedRange;
            if (selectRange.length > 0)
            {
                //用户长按选择文本时不处理
                return YES;
            }
            
            // 判断删除的是一个@中间的字符就整体删除
            NSMutableString *string = [NSMutableString stringWithString:textView.text];
            NSArray *matches = [RemaidUserUtils getMatchsWithStr:string];
            
            BOOL inAt = NO;
            NSInteger index = range.location;
            for (NSTextCheckingResult *match in matches)
            {
                NSRange newRange = NSMakeRange(match.range.location + 1, match.range.length - 1);
                if (NSLocationInRange(range.location, newRange))
                {
                    inAt = YES;
                    index = match.range.location;
                    [textView.textStorage replaceCharactersInRange:match.range withString:@""];
                    textView.selectedRange = NSMakeRange(index, 0);
                    [self textViewDidChange:textView];
                    return NO;
                    break;
                }
            }
        }
        
        return YES;
    }

    4.不允许光标落在@区块之间

    - (void)textViewDidChangeSelection:(UITextView *)textView {
        // 光标不能点落在@词中间
        NSRange range = textView.selectedRange;
        if (range.length > 0)
        {
            // 选择文本时可以
            return;
        }
        
        NSArray *matches = [RemaidUserUtils getMatchsWithStr:textView.text];
        
        for (NSTextCheckingResult *match in matches)
        {
            NSRange newRange = NSMakeRange(match.range.location + 1, match.range.length - 1);
            if (NSLocationInRange(range.location, newRange))
            {
                if (range.location == match.range.location + 1) {
                    textView.selectedRange = NSMakeRange(match.range.location + match.range.length, 0);
                } else {
                    textView.selectedRange = NSMakeRange(match.range.location , 0);
                }
                break;
            }
        }
    }

    BY: chu

  • 相关阅读:
    vscode .vue文件中不能提示html代码
    vscode不能提示已经定义的类名和id?
    vue常用指令
    移动端性能陷阱和硬件加速
    关于样式的获取问题
    “'npm' 不是内部或外部命令,也不是可运行的程序”
    JavaScript之闭包问题
    Sublime Text 套件介紹:Pretty JSON
    教你解决Sublime Text中文乱码问题
    C# 连接Mysql 字符串
  • 原文地址:https://www.cnblogs.com/widgetbox/p/11957484.html
Copyright © 2020-2023  润新知