美文网首页
iOS 实现一个最简单的文本聊天框(自动根据内容改变高度)

iOS 实现一个最简单的文本聊天框(自动根据内容改变高度)

作者: JohnayXiao | 来源:发表于2018-01-30 11:40 被阅读148次
    IMG_4719.PNG IMG_4720.PNG

    .h文件

    #import <UIKit/UIKit.h>
    
    @protocol XJAutoHeightInputTextViewDelegate <NSObject>
    
    @optional
    - (void)postBtnClick:(UITextView *)textView complection:(void(^)(BOOL isDone))complectionBlock;
    
    @end
    
    @interface XJAutoHeightInputTextView : UIView
    
    @property (nonatomic,strong)id <XJAutoHeightInputTextViewDelegate> delegate;
    
    -(instancetype)initWithDelegate:(id)delegate;
    
    @end
    

    .m文件

    #import "XJAutoHeightInputTextView.h"
    
    //所有的宏在这里,自行删除
    #define XJ_ScreenWidth   [UIScreen mainScreen].bounds.size.width
    #define XJ_ScreenHeight  [UIScreen mainScreen].bounds.size.height
    
    // iPhone X
    #define  XJ_iPhoneX (XJ_ScreenWidth == 375.f && XJ_ScreenHeight == 812.f ? YES : NO)
    
    #define XJ_StatusBarHeight (XJ_iPhoneX ? 44.f : 20.f)
    #define XJ_NavigationBarHeight  (XJ_iPhoneX ? 88.f : 64.f)
    #define XJ_TabbarHeight         (XJ_iPhoneX ? (49.f+34.f) : 49.f)
    #define XJ_safeBottomMargin   (XJ_iPhoneX ? 34.f : 0.f)
    
    
    @interface XJAutoHeightInputTextView()<UITextViewDelegate>
    @property (nonatomic,weak)UITextView * textView;
    /**总共字数*/
    @property (nonatomic,weak)UILabel * numberLable;
    /**默认提示语*/
    @property (nonatomic,weak)UILabel * apleLable;
    @property (nonatomic,strong)UILabel *sendLable;
    @property (nonatomic, assign) CGRect keyBordFrame;
    
    @end
    
    
    @implementation XJAutoHeightInputTextView
    
    -(instancetype)initWithDelegate:(id)delegate
    {
        if (self = [super init])
        {
            self.delegate = delegate;
            self.frame = CGRectMake(0, XJ_ScreenHeight - XJ_TabbarHeight, XJ_ScreenWidth, 49);
            self.backgroundColor = [UIColor whiteColor];
            UITextView * textView = [[UITextView alloc] initWithFrame:CGRectMake(15, 4.5, self.bounds.size.width/1.3, 40)];
            self.textView = textView;
            //颜色自行设置啊。。。
            //        textView.backgroundColor = grayBgColor();
            textView.layer.cornerRadius = textView.frame.size.height / 2.0;
            textView.layer.masksToBounds = YES;
            textView.delegate = self;
            textView.scrollEnabled=  NO;
            textView.keyboardType = UIKeyboardTypeDefault;
            textView.returnKeyType = UIReturnKeySend;
            textView.autoresizingMask = UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth;
            textView.font=[UIFont fontWithName:@"Arial" size:18.0];
            textView.textAlignment = NSTextAlignmentLeft;
            //        textView.textColor = [UIColor colorWithHexString:@"5d6573"];
            textView.autoresizingMask = UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth;;
            
            [self addSubview:textView];
            UILabel * apleLabel = [[UILabel alloc] initWithFrame:CGRectMake(20, textView.frame.origin.y-2, textView.bounds.size.width-30, textView.bounds.size.height)];
            apleLabel.text = @" 请输入评论";
            apleLabel.textAlignment = NSTextAlignmentLeft;
            apleLabel.textColor = [UIColor colorWithRed:170/255.0 green:170/255.0 blue:170/255.0 alpha:0.8];
            apleLabel.font = [UIFont fontWithName:@"Arial" size:17.0];
            self.apleLable = apleLabel;
            [self addSubview:apleLabel];
            
            UILabel * sendLable = [[UILabel alloc] initWithFrame:CGRectMake(CGRectGetMaxX(textView.frame) , 4.5, 60, 40)];
            sendLable.textAlignment = NSTextAlignmentCenter;
            sendLable.text = @"发送";
            //        sendLable.textColor = grayDarkTextColor();
            sendLable.font = [UIFont fontWithName:@"Arial" size:16.0];
            sendLable.userInteractionEnabled = YES;
            UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(done)];
            [sendLable addGestureRecognizer:tap];
            self.sendLable = sendLable;
            [self addSubview:sendLable];
            
            UILabel * numberLable = [[UILabel alloc] initWithFrame:CGRectMake(CGRectGetMaxX(textView.frame), (self.bounds.size.height - 40), 60, 20)];
            numberLable.textAlignment = NSTextAlignmentCenter;
            numberLable.textColor = [UIColor colorWithRed:170/255.0 green:170/255.0 blue:170/255.0 alpha:1];
            numberLable.text = @"140/140";
            numberLable.font = [UIFont fontWithName:@"Arial" size:12.0];
            self.numberLable = numberLable;
            [self addSubview:numberLable];
            numberLable.hidden = YES;
            
            [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
            [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
            [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textDidChanged:) name:UITextViewTextDidChangeNotification object:nil];
        }
        return self;
    }
    
    /**键盘出现*/
    - (void)keyboardWillShow:(NSNotification*)notification
    {
        CGRect keyboardRect = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
        self.keyBordFrame = keyboardRect;
        
        [UIView animateWithDuration:0.3 animations:^{
            
            self.frame = CGRectMake(0, XJ_ScreenHeight - keyboardRect.size.height - self.bounds.size.height, XJ_ScreenWidth, self.bounds.size.height);
            
        }];
        
    }
    /**键盘下落*/
    - (void)keyboardWillHide:(NSNotification*)notification
    {
        [UIView animateWithDuration:0.38 animations:^{
            
            self.frame = CGRectMake(0, XJ_ScreenHeight - self.bounds.size.height - XJ_safeBottomMargin, XJ_ScreenWidth, self.bounds.size.height);
            
        }completion:^(BOOL finished) {
            
        }];
    }
    
    
    -(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
    {
        if ([text isEqualToString:@"\n"]) {
            
            [self done];
            return YES;
            
        } else{
            
            NSString *new = [textView.text stringByReplacingCharactersInRange:range withString:text];
            
            if (new.length) {
                
                self.apleLable.hidden = YES;
                
            }else{
                
                self.apleLable.hidden = NO;
            }
            
            NSInteger lenth= [new length];
            if (lenth >140)
            {
                return NO;
                
            }else{
                
                NSInteger numb = 140 - lenth;
                self.numberLable.text = [NSString stringWithFormat:@"%ld/140",numb];
            }
            
            NSInteger res = 140-[new length];
            
            if(res >= 0)
            {
                return YES;
                
            }else{
                
                NSRange rg = {0,[text length]+res};
                
                if (rg.length>0) {
                    
                    NSString *s = [text substringWithRange:rg];
                    [textView setText:[textView.text stringByReplacingCharactersInRange:range withString:s]];
                }
                return NO;
            }
        }
    }
    
    /**监听文字改变 换行时要更改输入框的位置*/
    - (void)textDidChanged:(NSNotification *)notif
    {
        static CGFloat maxHeight = 40.0f;
        CGRect frame = self.textView.frame;
        CGSize constraintSize = CGSizeMake(frame.size.width, MAXFLOAT);
        CGSize size = [self.textView sizeThatFits:constraintSize];
        maxHeight = size.height <= 40 ? 40 : size.height;
        CGFloat heightSelf = maxHeight + 9;
        
        [UIView animateWithDuration:0.38 animations:^{
            
            self.frame = CGRectMake(0, XJ_ScreenHeight - self.keyBordFrame.size.height - heightSelf, XJ_ScreenWidth, heightSelf);
            
            self.textView.frame = CGRectMake(15, 4.5, frame.size.width, maxHeight);
            
            self.sendLable.frame = CGRectMake(CGRectGetMaxX(self.textView.frame), (self.bounds.size.height - 44.5), 60, 40);
            
            if (maxHeight <= 40) {
                
                self.numberLable.hidden = YES;
                
            } else self.numberLable.hidden = NO;
        }];
    }
    
    //发送
    - (void)done
    {
        [self.textView resignFirstResponder];
        
        if ([self.delegate respondsToSelector:@selector(postBtnClick:complection:)]) {
            
            [self.delegate postBtnClick:self.textView complection:^(BOOL isDone) {
                
                [self.textView resignFirstResponder];
                self.frame = CGRectMake(0, XJ_ScreenHeight - XJ_TabbarHeight, XJ_ScreenWidth, 49);
                
                self.textView.frame = CGRectMake(15, 4.5, self.bounds.size.width/1.3, 40);
                
                self.sendLable.frame = CGRectMake(CGRectGetMaxX(self.textView.frame), 4.5, 60, 40);
                self.textView.text = @" ";
                self.apleLable.hidden = NO;
                self.numberLable.text = @"140";
                self.numberLable.hidden = YES;
            }];
        }
    }
    
    
    #pragma mark - setter
    -(void)dealloc //移除通知
    {
        [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil];
        [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil];
        [[NSNotificationCenter defaultCenter] removeObserver:self name:UITextViewTextDidChangeNotification object:nil];
    }
    
    @end
    
    
    
    

    相关文章

      网友评论

          本文标题:iOS 实现一个最简单的文本聊天框(自动根据内容改变高度)

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