美文网首页iOSiOS Developer控件知识
自定义评论聊天界面输入框-OC

自定义评论聊天界面输入框-OC

作者: 村长大人tardis_cxx | 来源:发表于2017-05-19 12:13 被阅读346次

    iOS UITextView 输入框


    在大多数新闻类、聊天类、帖子类APP界面,都需要用户做输入操作,一般情况下,能够输入的控件,有UITextFieldUITextView,需求就是输入框要像UITextField一样没有输入时单行显示,又要像UITextView一样多行输入。那么这种需求该如何实现呢?
    最近整理笔记,附上以前思路和代码,不足之处还望指教

    思路:

    • 使用UITextView控件,作为输入框
    • 使用通知监听输入文字的改变,来计算UITextView显示的高度
    • 使用block回调输入文本和高度
    • 封装成一个自定义输入控件

    创建TCInputView类,继承自UITextView,并在.h中定义如下属性:

    typedef void(^TCTextHeightChangedBlock)(NSString *text, CGFloat textHeight);
    
    @interface TCInputView : UITextView
    
    @property (nonatomic, copy) TCTextHeightChangedBlock textHeightChangedBlock;
    @property (nonatomic, assign) NSInteger maxNumberOfLines;
    @property (nonatomic, assign) NSUInteger cornerRadius;
    @property (nonatomic, copy) NSString *placeholder;
    @property (nonatomic, strong) UIColor *placeholderColor;
    
    // 当文字改变时应该调用该方法
    - (void)textDidChange;
    
    @end
    

    在.m中创建占位控件:

    - (UITextView *)placeholderView {
        if (!_placeholderView) {
            _placeholderView = [[UITextView alloc] init];
            _placeholderView.scrollEnabled = NO;
            _placeholderView.showsHorizontalScrollIndicator = NO;
            _placeholderView.showsVerticalScrollIndicator = NO;
            _placeholderView.userInteractionEnabled = NO;
            _placeholderView.font = [UIFont systemFontOfSize:17.0];
            _placeholderView.textColor = [UIColor lightGrayColor];
            _placeholderView.backgroundColor = [UIColor clearColor];
        }
        return _placeholderView;
    }
    

    在- init()初始化方法中注册通知:

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textDidChange) name:UITextViewTextDidChangeNotification object:self];
    
    - (void)dealloc {
        [[NSNotificationCenter defaultCenter] removeObserver:self];
    }
    
    

    监听文本输入框的改变,并调用block,回调文字和高度,其实核心代码也在于此:

    - (void)textDidChange {
        self.placeholderView.hidden = self.text.length > 0;
        NSInteger height = ceilf([self sizeThatFits:CGSizeMake(self.bounds.size.width, MAXFLOAT)].height);
        if (self.textH != height) {
            
            if ([UIDevice currentDevice].systemVersion.floatValue < 9.0) {
                self.scrollEnabled = height > self.maxTextH && self.maxTextH > 0;
            }else {
                self.scrollEnabled = height > self.maxTextH && self.maxTextH > 0;
            }
            self.textH = height;
            
            if (self.textHeightChangedBlock && self.scrollEnabled == NO) {
                self.textHeightChangedBlock(self.text, height);
                [self.superview layoutIfNeeded];
                self.placeholderView.frame = self.bounds;
            }else {}
        }
    }
    
    

    这只是其中一部分关键代码,如果还有不明白的可以下载我github工程看看,如有不足之处,请指正,O(∩_∩)O谢谢!

    效果图.png

    相关文章

      网友评论

      • 8c7f71888754:你好我用了这份demo,其中有些问题需要请教一下,方便的话加我QQ 1927813567

      本文标题:自定义评论聊天界面输入框-OC

      本文链接:https://www.haomeiwen.com/subject/vhlyxxtx.html