iOS TextView占位符、高度自适应、限制最大高度、限制字数

热门标签

,

特别声明:文章多为网络转载,资源使用一般不提供任何帮助,特殊资源除外,如有侵权请联系!

1.占位符

drawRect绘制占位符,设置字体或颜色及字符变更时调用setNeedsDisplay


- (void)drawRect:(CGRect)rect {
    // 如果有输入文字,就直接返回,不画占位文字
    if (self.hasText) return;
    //设置文字属性
    NSMutableDictionary *attributes = [NSMutableDictionary dictionary];
    attributes[NSFontAttributeName] = self.font;
    attributes[NSForegroundColorAttributeName] = self.placeholderColor ? self.placeholderColor : [UIColor grayColor];

    //画文字
    CGFloat x = 5;
    CGFloat width = rect.size.width -2 * x;
    CGFloat y = 8;
    CGFloat height = rect.size.height - 2 * y;
    CGRect placeholderRect = CGRectMake(x, y, width, height);
    [self.placeholder drawInRect:placeholderRect withAttributes:attributes];
}

2.高度自适应,高度随内容变化

    float textViewHeight = [textView sizeThatFits:CGSizeMake(textView.frame.size.width, MAXFLOAT)].height;
    CGRect frame = textView.frame;
    frame.size.height = textViewHeight;
    textView.frame = frame;

3.限制行数,或者说是限制高度


static const CGFloat TEXTVIEW_MAX_HEIGHT = 92.5;
- (void)textViewDidChange:(UITextView *)textView{
    [self setNeedsDisplay];
    float textViewHeight = [textView sizeThatFits:CGSizeMake(textView.frame.size.width, MAXFLOAT)].height;
    if (textViewHeight>TEXTVIEW_MAX_HEIGHT) {
        textView.text = self.oldEditText;
        [self textViewDidChange:textView];
        return;
    }
    [self calculateTextView:textView textViewHeight:textViewHeight];
}

- (void)calculateTextView:(UITextView *)textView textViewHeight:(CGFloat)textViewHeight{
    CGRect frame = textView.frame;
    frame.size.height = textViewHeight;
    textView.frame = frame;
    _oldEditText = textView.text;
}

我保留了textView的旧的_oldEditText,超出高度时,字符不应该变化。

4.限制字数,一个汉字当两个英文

//获得字符长度:一个汉字两个字符
- (NSInteger)getTextLength:(NSString*)text
{
    NSStringEncoding encoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
    NSData* data = [text dataUsingEncoding:encoding];
    NSInteger length = [data length];
    return length;
}

OC中textView是按输入的字符个数来计算的,需要手动转换。

//textView限制字数
- (void)restrictionInputTextView:(UITextView *)textView maxNumber:(NSInteger)maxNumber{
    NSString *toBeString = textView.text;
    NSInteger toBeStringLength = [self getTextLength:textView.text];
    NSString *lang = textView.textInputMode.primaryLanguage; // 键盘输入模式
    if([lang isEqualToString:@"zh-Hans"]) { //简体中文输入,包括简体拼音,健体五笔,简体手写
        UITextRange *selectedRange = [textView markedTextRange];
        //获取高亮部分
        UITextPosition *position = [textView positionFromPosition:selectedRange.start offset:0];
        //没有高亮选择的字,则对已输入的文字进行字数统计和限制
        if(!position) {
            if(toBeStringLength > maxNumber) {
                textView.text = [toBeString substringToIndex:maxNumber];
            }
        } else{ //有高亮选择的字符串,则暂不对文字进行统计和限制
        }
    } else{ //中文输入法以外的直接对其统计限制即可,不考虑其他语种情况
        if(toBeStringLength > maxNumber) {
            //防止表情被截段
            textView.text = [self subStringWith:toBeString index:maxNumber];
        }
    }
}

//防止原生emoji表情被截断

- (NSString *)subStringWith:(NSString *)string index:(NSInteger)index{
    NSString *result = string;
    if (result.length > index) {
        NSRange rangeIndex = [result rangeOfComposedCharacterSequenceAtIndex:index];
        result = [result substringToIndex:(rangeIndex.location)];
    }
    return result;
}

这一段摘自网络:一行代码解决UITextFiled和UITextView限制字数和输入特殊字符

5.当键盘遮挡输入内容时,view自动弹起

计算textView的底部高度+键盘的高度,如果大于键盘的y值,对view做一个往上偏移的动画。当取消响应时再下移,保证输入框不被键盘遮挡。

 

标签:

未经允许不得转载:作者:SheaYang, 转载或复制请以 超链接形式 并注明出处 技术Dog|博客
原文地址:《iOS TextView占位符、高度自适应、限制最大高度、限制字数》 发布于2019-11-03

分享到:
赞(0) 打赏

评论 抢沙发

2 + 1 =


iOS TextView占位符、高度自适应、限制最大高度、限制字数

长按图片转发给朋友

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

Vieu4.0主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。

登录

忘记密码 ?