IOS关于不同字体和不同颜色的选择

在项目中,用到一个功能,就是不同文字和不同颜色字体选择,

界面如下:,效果如下:

 

这个功能主要用到了textview的几个代理办法,其中一个重要的问题就是,在英文下和英文下的不同判断方式,以及是否有追加字:

字体,颜色,字符用语封装起来,便于后续操作,

 

在项目中,每个字符用一个对象保存在数组中。

我们知道,中文在保存的时候占用两个字符,英文咱占用一个,所以在回调方法的时候会掉用两次

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text,

这个方法的用法是这样子的,删除和修改回条用这个方法的 粘贴什么的夜会掉用这个方法 点击键盘的自述的时候会条用 点击默认追加的字不会条用这个方法,插入是用文本替换字符串 删除时用空字符串替换文本,当输入中文的时候 中国的时候 会出现条用8次 但是在文本与中之显示zhong guo9个字符的现象出现 其中多出现一个字符 空格  这个时候 使用textViewDidChange来进行判断数据的信息,其实做法是用text替换掉range中间的字符串

 

所有代理方法的用法:

///

///@brief 准备编辑 最先条用

///

- (BOOL)textViewShouldBeginEditing:(UITextView *)textView

{

    FLOG_METHOD;

    

    NSLog(@"%@---",textView.text);

    return YES;

}

 

///

///@brief 准备结束 顺序3

///

- (BOOL)textViewShouldEndEditing:(UITextView *)textView

{

    FLOG_METHOD;

    

    NSLog(@"%@---",textView.text);

    return YES;

}

 

///

///@brief 开始编辑 顺序2

///

- (void)textViewDidBeginEditing:(UITextView *)textView

{

    FLOG_METHOD;

    NSLog(@"%@---",textView.text);

}

 

///

///@brief 结束 顺序4

///

- (void)textViewDidEndEditing:(UITextView *)textView

{

    FLOG_METHOD;

    NSLog(@"%@---",textView.text);

}

 

///

///@brief 删除和修改回条用这个方法的 粘贴什么的夜会掉用这个方法 点击键盘的自述的时候会条用 点击默认追加的字不会条用这个方法

///插入是用文本替换字符串 删除时用空字符串替换文本

///当输入中文的时候 中国的时候 会出现条用8次 但是在文本与中之显示zhong guo9个字符的现象出现 其中多出现一个字符 空格  这个时候 使用textViewDidChange来进行判断数据的信息

///其实做法是用text替换掉range中间的字符串

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text

{

    FLOG_METHOD;

    

    NSInteger location = range.location;

    

    NSLog(@"%@---%ld",textView.text,(long)textView.text.length);

    

    //删除字符串

    if([text isEqualToString:@""] && range.length > 0){

 

        for(NSInteger i = range.length - 1; i >= 0; i--)

            [_currentcolorarray removeObjectAtIndex:(location + i)];

        

        NSLog(@"删除字符个数 %ld  位置:%ld", (long)range.length, (long)location);

        return YES;

    }

    

    //替换字符串 替换的是那几个字符串呢? 如果有多的部分自动补缺

    if(![text isEqualToString:@""] && range.length > 0){

        NSInteger islast = 0;

        

        if(_currentcolorarray.count == 0 || textView.text.length == range.length + range.location)

            islast = 1;

        else

            islast = 0;

        

        //先删掉 在添加

        [_currentcolorarray removeObjectsInRange:NSMakeRange(range.location, range.length)];

        

        //现在添加  是插入还是增加

        if(islast == 0){

            NSInteger firstposition = range.location;

            

            for(NSInteger i = 0; i < range.length; i++){

                NSString* temptext = [text substringWithRange:NSMakeRange( i, 1)];

                

                ColorTextObject* temp = [[ColorTextObject alloc] init];

                

                temp.text = temptext;

                temp.fontsize = _selectfontsize;

                temp.selectcolor = _selectcolorindex;

                

                const CGFloat *components = CGColorGetComponents(_selectcolor.CGColor);

                

                temp.redComponent = components[0];

                temp.greenComponent = components[1];

                temp.blueComponent = components[2];

                temp.alphaComponent = components[3];

                

                [_currentcolorarray insertObject:temp atIndex:firstposition++];

            }

        }else{//增加

            

            for(NSInteger i = 0; i < range.length; i++){

                ColorTextObject* temp = [[ColorTextObject alloc] init];

                NSString* temptext = [text substringWithRange:NSMakeRange( i, 1)];

                

                temp.text = temptext;

                temp.fontsize = _selectfontsize;

                temp.selectcolor = _selectcolorindex;

                

                const CGFloat *components = CGColorGetComponents(_selectcolor.CGColor);

                

                temp.redComponent = components[0];

                temp.greenComponent = components[1];

                temp.blueComponent = components[2];

                temp.alphaComponent = components[3];

             

                [_currentcolorarray addObject:temp];

            }

        }

        

        return YES;

    }

    

    return YES;

}

 

///

///@brief 添加英文数据信息 是直接添加的

///

-(void)addEnglishTextView:(UITextView*)textView location:(NSInteger)location

{

    FLOG_METHOD;

    

    NSLog(@"英文---------%@----------%ld",textView.text,(long)location);

    

    if(_waitindex == 0){//英文的输入 直接添加或者插入数据信息

        NSString* tempstring = textView.text;

        NSString* temp = [tempstring substringWithRange:NSMakeRange(location - 1, 1)];

        

        ColorTextObject* object = [[ColorTextObject alloc] init];

        object.text = temp;

        object.fontsize = _selectfontsize;

        object.selectcolor = _selectcolorindex;

        

        const CGFloat *components = CGColorGetComponents(_selectcolor.CGColor);

        

        object.redComponent = components[0];

        object.greenComponent = components[1];

        object.blueComponent = components[2];

        object.alphaComponent = components[3];

        

        if(location == textView.text.length)

            [_currentcolorarray addObject:object];

        else

            [_currentcolorarray insertObject:object atIndex:(location - 1)];

        

        _lastposition = location;

        return;

    }

    

    NSLog(@"----------------%ld",(long)_waitnumber);

    

    if(_waitnumber > 1)

        _waitnumber--;

    

    for(NSInteger i = 0; i < location - _lastposition; i++){

        NSString* tempstirng = textView.text;

        NSString* temp = [tempstirng substringWithRange:NSMakeRange( _lastposition + i, 1)];

        

        ColorTextObject* object = [[ColorTextObject alloc] init];

        object.text = temp;

        object.fontsize = _selectfontsize;

        object.selectcolor = _selectcolorindex;

        

        const CGFloat *components = CGColorGetComponents(_selectcolor.CGColor);

        

        object.redComponent = components[0];

        object.greenComponent = components[1];

        object.blueComponent = components[2];

        object.alphaComponent = components[3];

        

        if(location == textView.text.length)

            [_currentcolorarray addObject:object];

        else

            [_currentcolorarray insertObject:object atIndex:(_lastposition + i)];

    }

    

    _lastposition = location;

    _waitnumber = 0;

    return;

}

 

///

///@brief 添加英文数据信息 是直接添加的

///

-(void)addChineseTextView:(UITextView*)textView location:(NSInteger)location

{

    FLOG_METHOD;

    

    _waitindex = 1;//有中文的

    _waitnumber++;//表示中文的个数

}

 

///

///@brief 输入框改变了 改变的话 条用顺序2

///

- (void)textViewDidChange:(UITextView *)textView

{

    FLOG_METHOD;

    

    NSInteger location = textView.selectedRange.location;

    UITextRange* textrange = textView.markedTextRange;

    

    if(textrange == nil)

        [self addEnglishTextView:textView location:location];

    else//中文  但是会使用了两次这个数据信息

        [self addChineseTextView:textView location:location];

    

    [self showInView];

}

所有代理就在这里了,然后再在界面上显示出来,就达到想要的效果了。

 再发几张效果图:

 

posted on 2016-10-11 09:14  无情风91  阅读(1209)  评论(0编辑  收藏  举报

导航