螢幕快照 2017-08-31 下午5.14.12.png
螢幕快照 2017-08-31 下午5.14.25.png
//
// TextVDealVC.m
// WeiMiQuan
//
// Created by baiwei on 2017/8/31.
// Copyright © 2017年 佰微. All rights reserved.
//
#import "TextVDealVC.h"
#import "IQKeyboardManager.h"
#define inputViewH (HeightScreen(49, six))// 輸入框高
#define inputVY (kScreenHeight - 64 - inputViewH)// 輸入框在最底部時的Y
#define scrollVH (kScreenHeight - 64 - inputViewH)// 最大的scrollV的高
#define litleMargin HeightMacroScreen(15)// 間距
#define imageBtnWH WidMacroScreen(200)// 加好按鈕的高寬
#define fileBtnH WidMacroScreen(150)// 檔案按鈕的高
#define TextVY (Px30Distance) // textV的Y
#define TextVMaxH (scrollVH - litleMargin * 2 - imageBtnWH - TextVY)// 最大的textv的高
@interface TextVDealVC ()
<
UITextViewDelegate
>
{
CGFloat currentScroolH ;
CGFloat currentInputVY;
CGFloat currentTextVH;
CGFloat minTextVH;
}
/** 整個背景scrollV*/
@property (nonatomic,strong) UIScrollView *scroolV;
/** 輸入textv*/
@property (nonatomic,strong) UITextView *textV;
/** 新增圖片按鈕*/
@property (nonatomic,strong) UIButton *imageBtn;
/** 輸入框背景view*/
@property (nonatomic,strong) UIView *inputView;
/** 檔案按鈕*/
@property (nonatomic,strong) UIButton *fileBtn;
@end
@implementation TextVDealVC
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
// 鍵盤處理
[IQKeyboardManager sharedManager].enableAutoToolbar = NO;
[IQKeyboardManager sharedManager].enable = NO;
[self.textV becomeFirstResponder];
}
- (void)viewDidLoad {
[super viewDidLoad];
self.automaticallyAdjustsScrollViewInsets = NO;
//增加監聽,當鍵盤出現或改變時收出訊息
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWillShow:)
name:UIKeyboardWillShowNotification
object:nil];
//增加監聽,當鍵退出時收出訊息
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWillHide:)
name:UIKeyboardWillHideNotification
object:nil];
// 初始化值
currentScroolH = scrollVH;
currentInputVY = inputVY;
currentTextVH = HeightMacroScreen(300);
minTextVH = HeightMacroScreen(300);
// 介面
[self initUserInterface];
// 資料
[self initData];
}
#pragma mark -- Action
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
[super touchesBegan:touches withEvent:event];
[self.textV resignFirstResponder];
}
// 圖片按鈕點選事件
-(void)imageBtnClick{
}
//計算評論框文字的高度
- (float) heightForTextView: (UITextView *)textView WithText: (NSString *) strText{
CGSize constraint = CGSizeMake(textView.contentSize.width, CGFLOAT_MAX);
CGRect size = [strText boundingRectWithSize:constraint
options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading)
attributes:@{NSFontAttributeName: [UIFont systemFontOfSize:Px28FontSize]}
context:nil];
return size.size.height + HeightMacroScreen(25);
}
// 根據內容長度 實時改變textV的高度
-(void)changeTextVheight:(UITextView *)textView heightT:(CGFloat) heightT{
CGRect frame = textView.frame;
float height;
if ([textView.text isEqual:@""]) {
if (![textView.text isEqualToString:@""]) {
height = [ self heightForTextView:textView WithText:[textView.text substringToIndex:[textView.text length] - 1]];
}else{
height = [ self heightForTextView:textView WithText:textView.text];
}
}else{
height = heightT;
}
if (height > currentTextVH) {
frame.size.height = height;
[UIView animateWithDuration:0.5 animations:^{
textView.frame = frame;
} completion:nil];
currentTextVH = height;
[self layout];
}else if (height < minTextVH && frame.size.height > minTextVH){
height = minTextVH;
frame.size.height = height;
[UIView animateWithDuration:0.5 animations:^{
textView.frame = frame;
} completion:nil];
currentTextVH = height;
[self layout];
}else if(height < minTextVH){
currentTextVH = minTextVH;
[self layout];
}else if (height < currentTextVH && height > minTextVH){
currentTextVH = height;
[self layout];
}
}
#pragma mark -- NSNotificationCenter Action
//當鍵盤出現或改變時呼叫
- (void)keyboardWillShow:(NSNotification *)aNotification
{
[self changgeYOrH:aNotification keyBoardShow:YES];
}
//當鍵盤隱藏或改變時呼叫
-(void)keyboardWillHide:(NSNotification *)aNotification
{
[self changgeYOrH:aNotification keyBoardShow:NO];
}
// 根據鍵盤的顯示情況 改變檢視的 y h
-(void)changgeYOrH:(NSNotification *)aNotification keyBoardShow:(BOOL)keyBoardShow{
//獲取鍵盤的高度
NSDictionary *userInfo = [aNotification userInfo];
NSValue *aValue = [userInfo objectForKey:UIKeyboardFrameEndUserInfoKey];
CGRect keyboardRect = [aValue CGRectValue];
CGFloat y = keyboardRect.origin.y;
int height = keyboardRect.size.height;
if (keyBoardShow == NO) {
if (y > inputVY) {
y = inputVY;
}
self.inputView.frame = CGRM(0, inputVY, kScreenWidth, inputViewH);
self.scroolV.frame = CGRM(0,0, kScreenWidth,scrollVH);
currentScroolH = scrollVH;
currentInputVY = inputVY;
if (self.fileBtn.hidden == YES) {
if (currentTextVH < TextVMaxH) {
currentTextVH = TextVMaxH;
}
}else{
if (currentTextVH < (TextVMaxH - litleMargin - fileBtnH)) {
currentTextVH = (TextVMaxH - litleMargin - fileBtnH);
}
}
}else{
CGFloat inputViewY = ((inputVY - height));
[UIView animateWithDuration:0.2 animations:^{
self.inputView.frame = CGRM(0,inputViewY , kScreenWidth, inputViewH);
CGFloat scrollVHH = (scrollVH - height);
if (self.fileBtn.hidden != YES) {
scrollVHH += (litleMargin + fileBtnH);
}
self.scroolV.frame = CGRM(0,0, kScreenWidth,scrollVHH);
minTextVH = (scrollVH - height - litleMargin * 2 - imageBtnWH - TextVY);
CGFloat height = [self heightForTextView:self.textV WithText:self.textV.text];
[self changeTextVheight:self.textV heightT:height];
currentScroolH = scrollVHH;
currentInputVY = inputViewY;
}];
}
[self layout];
}
#pragma mark -- UITextViewDelegate
- (void)textViewDidChange:(UITextView *)textView{
if (textView.markedTextRange != nil) {
return;
}
NSRange range = [textView selectedRange];
if (textView == self.textV) {
if (textView.text.length > 10000) {
textView.text = [textView.text substringToIndex:10000];
}
}
CGFloat height = [self heightForTextView:textView WithText:[NSString stringWithFormat:@"%@",textView.text]];
[self changeTextVheight:textView heightT:height];
textView.selectedRange = range;
}
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
if (textView.markedTextRange != nil) {
CGFloat height = [self heightForTextView:textView WithText:[NSString stringWithFormat:@"%@%@",textView.text,text]];
[self changeTextVheight:textView heightT:height];
return YES;
}
if (textView == self.textV) {
if (textView.text.length >= 10000) {
if (text.length > 0) {
[MBProgressHUD showMoreLine:@"字數超過10000字" view:nil];
return NO;
}
}
}
CGFloat height = [self heightForTextView:textView WithText:[NSString stringWithFormat:@"%@%@",textView.text,text]];
[self changeTextVheight:textView heightT:height];
return YES;
}
#pragma mark -- 資料
-(void)initData{
}
#pragma mark -- 介面
-(void)initUserInterface{
self.navigationItem.title = @"傳送至";
// 整個背景scrollV
UIScrollView *scroolV = [[UIScrollView alloc]init];
[self.view addSubview:scroolV];
self.scroolV = scroolV;
// 輸入textv
UITextView *textV = MakeTextView(Px28FontSize, BlackColor);
textV.scrollEnabled = NO;
textV.backgroundColor = kTenFontColor;
textV.delegate = self;
[scroolV addSubview:textV];
self.textV = textV;
// 新增圖片按鈕
UIButton *imageBtn = MakeImageButtonWith(@"home_add_circle");
[imageBtn addTarget:self action:@selector(imageBtnClick) forControlEvents:UIControlEventTouchUpInside];
MakeLineWithId(imageBtn, LitleLineH, kTenFontColor);
[scroolV addSubview:imageBtn];
self.imageBtn = imageBtn;
// 檔案按鈕
UIButton *fileBtn = MakeButton(ThemeColor);
[scroolV addSubview:fileBtn];
self.fileBtn = fileBtn;
// self.fileBtn.hidden = YES;
// 輸入框背景view
self.inputView = [[UIView alloc]initWithFrame:CGRM(0,inputVY , kScreenWidth, inputViewH)];
MakeLineWithId(self.inputView, LitleLineH, kNineFontColor);
self.inputView.backgroundColor = [UIColor whiteColor];
// 設定陰影
self.inputView .layer.shadowColor = [UIColor grayColor].CGColor;
self.inputView .layer.shadowOffset = CGSizeMake(0, -3);
self.inputView .layer.shadowOpacity = 0.1;
[self.view addSubview:self.inputView];
// 佈局
[self layout];
}
#pragma mark -- 佈局
-(void)layout{
// 整個背景scrollV
self.scroolV.frame = CGRM(0, 0, kScreenWidth, currentScroolH);
// 輸入textv
self.textV.frame = CGRM(Px30Distance, Px30Distance, kScreenWidth - Px30Distance * 2, currentTextVH);
// 新增圖片按鈕
self.imageBtn.frame = CGRM(Px30Distance, CGRectGetMaxY(self.textV.frame) + litleMargin, imageBtnWH, imageBtnWH);
// 檔案按鈕
self.fileBtn.frame = CGRM(Px30Distance,CGRectGetMaxY(self.imageBtn.frame) + litleMargin, kScreenWidth - Px30Distance * 2, fileBtnH);
// 輸入框背景view
self.inputView.frame = CGRM(0, currentInputVY, kScreenWidth, inputViewH);
if (self.fileBtn.hidden == YES) {
self.scroolV.contentSize = CGSizeMake(kScreenWidth, CGRectGetMaxY(self.imageBtn.frame) + litleMargin);
}else{
self.scroolV.contentSize = CGSizeMake(kScreenWidth, CGRectGetMaxY(self.fileBtn.frame) + litleMargin);
}
CGFloat offsetY = CGRectGetMaxY(self.imageBtn.frame) + litleMargin - currentInputVY;
if (offsetY<0) {
offsetY=0;
}
self.scroolV.contentOffset = CGPointMake(0, offsetY);
}
@end