UI效果iOS技术专题iOS常见的一些界面demo

UITextView输入时高度自适应(优化增强版)

2016-09-10  本文已影响4970人  横爬介士

接上篇这段时间比较忙,说好的给写一个UITextView的demo,但是无奈一直没有时间,今天终于抽时间完成了,基本要求的功能都具备。

1.png

首先回答一下@RicoCL的问题,一眨眼已经将近40天了,实在是不好意思,其实原理很简单,只要在当前文字高度 >= textView最大高度时,将textView的scrollEnable设置为YES即可,删除时,在当前文字高度 < textView最大高度时,设置为NO即可。

效果图镇楼

输入框效果图.gif

1 需求分析

平时经常用到UITextView时,经常会有这么几个问题:

针对上面的几个需求,逐一分析:

2 代码展示

demo中的注释比较项目,有需要的可以直接调至文末直接下载。
CMInputView.h文件

#import <UIKit/UIKit.h>

typedef void(^CM_textHeightChangedBlock)(NSString *text,CGFloat textHeight);

@interface CMInputView : UITextView

/**
 *  占位文字
 */
@property (nonatomic, strong) NSString *placeholder;

/**
 *  占位文字颜色
 */
@property (nonatomic, strong) UIColor *placeholderColor;

/**
 *  占位符字体大小
 */
@property (nonatomic,strong) UIFont *placeholderFont;

/**
 *  textView最大行数
 */
@property (nonatomic, assign) NSUInteger maxNumberOfLines;

/**
 *  文字高度改变block → 文字高度改变会自动调用
 *  block参数(text) → 文字内容
 *  block参数(textHeight) → 文字高度
 */
@property (nonatomic, strong) CM_textHeightChangedBlock textChangedBlock;
/**
 *  设置圆角
 */
@property (nonatomic, assign) NSUInteger cornerRadius;

- (void)textValueDidChanged:(CM_textHeightChangedBlock)block;

@end

CMTextView.m文件中核心代码的实现

- (void)textDidChange
{
    // 根据文字内容决定placeholderView是否隐藏
    self.placeholderView.hidden = self.text.length > 0;
    
    NSInteger height = ceilf([self sizeThatFits:CGSizeMake(self.bounds.size.width, MAXFLOAT)].height);
    
    if (_textH != height) { // 高度不一样,就改变了高度
        
        // 当高度大于最大高度时,需要滚动
        self.scrollEnabled = height > _maxTextH && _maxTextH > 0;
        
        _textH = height;
        
        //当不可以滚动(即 <= 最大高度)时,传值改变textView高度
        if (_textChangedBlock && self.scrollEnabled == NO) {
            _textChangedBlock(self.text,height);
            
            [self.superview layoutIfNeeded];
            self.placeholderView.frame = self.bounds;

        }
    }
}

3 使用注意

_placeholderView的初始化是在_placeholder的setter方法中实现的,其中font的设置是与UITextViewfont是同等大小的,因此placeholder属性的设置需要在设置UITextViewfont之后才会生效,否则为系统默认字体大小;当然,不需要先后顺序,通过placeholderFont属性的设置也可以实现。

Demo下载 请戳这里 欢迎star

上一篇下一篇

猜你喜欢

热点阅读