//
// 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
iOS - 计算UITextView 高度 UIScrollView滚动到具体位置
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- //这种计算更好 让选中的 item居中 算出item的重点偏离屏幕中心的距离//1.第一种 如果item的...
- 华为近日清退了一批34岁以上的中年员工,都是程序员,原因很容易想得到,中年人精力和创造力方面弱很多,而稀少的管理岗...
- 在这投资一套公寓绝对首选,高新芯,高新一小一中,万达one,地铁双线, 下周一4号开始排号,好位置好户型先到先得,...