我点击完添加任务,然后再按返回键,想要收回键盘,改变约束,发现卡住了,当然如果数据少的话,不存在这个问题
图片和代码如下
UIButton *addCard = UIButton.new;
[footer addSubview:addCard];
[self.arrAddCards addObject:addCard];
[addCard makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(0);
make.bottom.equalTo(0);
make.right.equalTo(0);
make.left.equalTo(0);
}];
[addCard setTitle:@"添加任务" forState:UIControlStateNormal];
[addCard setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[addCard setTitleColor:[UIColor lightGrayColor] forState:UIControlStateHighlighted];
addCard.titleLabel.font = [UIFont systemFontOfSize:15];
addCard.backgroundColor = [UIColor clearColor];
self.addCards = addCard;
// [addCard addTarget:self action:@selector(addCard:) forControlEvents:UIControlEventTouchUpInside];
//使用ReactiveCocoa处理点击事件,相当于上面的addTarget:方法
//addCard点击事件
[[addCard rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) {
NSLog(@"%ld",(unsigned long)self.unNetArr.count);
self.yesOrNo = NO;
//隐藏addCard
addCard.alpha = 0;
//输入框
UITextView *textView = ({
UITextView *view = [UITextView new];
[footer addSubview:view];
[view makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(10);
make.top.equalTo(3);
make.right.equalTo(-10);
make.bottom.equalTo(-44+2);
}];
//因为footer变大,所以改变tableView的contentInset
listTableView.contentInset = UIEdgeInsetsMake(46, 0, 88, 0);
view.font = [UIFont systemFontOfSize:15];
//立即刷新视图
[self layoutIfNeeded];
view;
});
self.textView = textView;
//初始化add按钮
UIButton *add = ({
UIButton *view = [UIButton new];
view.contentHorizontalAlignment=UIControlContentHorizontalAlignmentCenter;
[view setTitle:NSLocalizedString(@"add", nil) forState:UIControlStateNormal];
[view setTitleColor:Global_trelloBlue forState:UIControlStateNormal];
[view setTitleColor:[UIColor lightGrayColor] forState:UIControlStateHighlighted];
[view setTitleEdgeInsets:UIEdgeInsetsMake(0, -40, 0, -80)];
[view.titleLabel setFont:[UIFont fontWithName:@"Arial-Bold" size:18]];
view.titleLabel.font = [UIFont systemFontOfSize:15];
[footer addSubview:view];
[view makeConstraints:^(MASConstraintMaker *make) {
make.right.equalTo(0);
make.bottom.equalTo(-1);
make.width.equalTo(120);
}];
[view sizeToFit];
//初始化后隐藏(为了动画效果)
view.alpha = 0;
//立即刷新
[self layoutIfNeeded];
//add点击事件,创建新的tast
[[view rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) {
//textView判空
if (![textView.text isEqualToString:@""]) {
self.yesOrNo = NO;
AddTaskApi *api = AddTaskApi.new;
//如果在没有task的列添加新的task,t_sort传0
api.t_sort = @(0);
//都上传0
api.t_taskContent = textView.text;
api.t_projectId = @(_project_id.integerValue);
//当前列的id
api.t_panel_id = @(listTableView.model.id.integerValue);
NSLog(@"<><>%@",_project_id);
//判断是否有网
[GLobalRealReachability reachabilityWithBlock:^(ReachabilityStatus status) {
switch (status)
{
case RealStatusNotReachable:
{
NewTasklistModel *model = [[NewTasklistModel alloc]init];
model.unloading = YES;
model.t_taskContent = textView.text;
textView.text = nil;
model.t_sort = @"0";
model.t_id = [_project_id integerValue];
model.t_panel_id = listTableView.model.id;
model.page = idx;
[listTableView.model.task addObject:model];
[self.unNetArr addObject:model];
NSLog(@"%ld",(unsigned long)self.unNetArr.count);
//插入行
[listTableView insertRow:(listTableView.model.task.count-1)inSection:0 withRowAnimation:
UITableViewRowAnimationBottom];
//计算rowHeight
CGFloat rowHeight = [self tableView:listTableView heightForRowAtIndexPath:[NSIndexPath indexPathForRow:listTableView.model.task.count-1 inSection:0]];
//根据当前列高度和rowHeight决定列高度是否增加
//updateConstraints:方法更新autolayout
[listView updateConstraints:^(MASConstraintMaker *make) {
//增加新的rowHeight后list超出允许最大高度,之前不满最大高度
if (listTableView.cellTotalHeight > (kTotalCellMaxHeight+NavAndStatusBarHeight-_keyboardHeight-44) && (listTableView.cellTotalHeight-rowHeight) < (kTotalCellMaxHeight+NavAndStatusBarHeight-_keyboardHeight-44)) {
make.height.equalTo(listView.yyHeight+((kTotalCellMaxHeight+NavAndStatusBarHeight-_keyboardHeight-44)-(listTableView.cellTotalHeight-rowHeight)));
}
//增加新的rowHeight后list没有超过允许最大高度
if (listTableView.cellTotalHeight <= (kTotalCellMaxHeight+NavAndStatusBarHeight-_keyboardHeight-44)) {
make.height.equalTo(listView.yyHeight+rowHeight);
}
}];
//tableView滚动到最底部,显示新添加行
[listTableView scrollToRow:listTableView.model.task.count-1 inSection:0 atScrollPosition:UITableViewScrollPositionBottom animated:NO];
//autolayout动画
[self layoutIfNeeded];
// [listTableView reloadRow:listTableView.model.task.count-1 inSection:0 withRowAnimation:UITableViewRowAnimationBottom];
//改变原列的标题数量
UITextField *sourceListTableHeaderTF=(UITextField *)[self viewWithTag:[listTableView.model.id integerValue]];
sourceListTableHeaderTF.text=[NSString stringWithFormat:@"%@ %ld",listTableView.model.name,(unsigned long)listTableView.model.task.count];
break;
}
case RealStatusUnknown:
{
NewTasklistModel *model = [[NewTasklistModel alloc]init];
model.unloading = YES;
model.t_taskContent = textView.text;
textView.text = nil;
model.t_sort = @"0";
model.t_id = [_project_id integerValue];
model.t_panel_id = listTableView.model.id;
model.page = idx;
[listTableView.model.task addObject:model];
[self.unNetArr addObject:model];
//插入行
[listTableView insertRow:(listTableView.model.task.count-1)inSection:0 withRowAnimation:
UITableViewRowAnimationBottom];
//计算rowHeight
CGFloat rowHeight = [self tableView:listTableView heightForRowAtIndexPath:[NSIndexPath indexPathForRow:listTableView.model.task.count-1 inSection:0]];
//根据当前列高度和rowHeight决定列高度是否增加
//updateConstraints:方法更新autolayout
[listView updateConstraints:^(MASConstraintMaker *make) {
//增加新的rowHeight后list超出允许最大高度,之前不满最大高度
if (listTableView.cellTotalHeight > (kTotalCellMaxHeight+NavAndStatusBarHeight-_keyboardHeight-44) && (listTableView.cellTotalHeight-rowHeight) < (kTotalCellMaxHeight+NavAndStatusBarHeight-_keyboardHeight-44)) {
make.height.equalTo(listView.yyHeight+((kTotalCellMaxHeight+NavAndStatusBarHeight-_keyboardHeight-44)-(listTableView.cellTotalHeight-rowHeight)));
}
//增加新的rowHeight后list没有超过允许最大高度
if (listTableView.cellTotalHeight <= (kTotalCellMaxHeight+NavAndStatusBarHeight-_keyboardHeight-44)) {
make.height.equalTo(listView.yyHeight+rowHeight);
}
}];
//tableView滚动到最底部,显示新添加行
[listTableView scrollToRow:listTableView.model.task.count-1 inSection:0 atScrollPosition:UITableViewScrollPositionBottom animated:NO];
//autolayout动画
[self layoutIfNeeded];
//改变原列的标题数量
UITextField *sourceListTableHeaderTF=(UITextField *)[self viewWithTag:[listTableView.model.id integerValue]];
sourceListTableHeaderTF.text=[NSString stringWithFormat:@"%@ %ld",listTableView.model.name,(unsigned long)listTableView.model.task.count];
break;
}
default:
//发起请求
[api startWithCompletionBlockWithSuccess:^(YTKBaseRequest *request) {
SLog(@"<><>>>%@",request);
NewTasklistModel *model = request.responseModel;
model.unloading = NO;
//存在即失败(接口定义,只在失败时才返回status值)
if (model.status) {
}
else { //添加成功
textView.text = nil;
//更新数据源
[listTableView.model.task addObject:model];
//插入行
[listTableView insertRow:(listTableView.model.task.count-1)inSection:0 withRowAnimation:
UITableViewRowAnimationBottom];
//计算rowHeight
CGFloat rowHeight = [self tableView:listTableView heightForRowAtIndexPath:[NSIndexPath indexPathForRow:listTableView.model.task.count-1 inSection:0]];
//根据当前列高度和rowHeight决定列高度是否增加
//updateConstraints:方法更新autolayout
[listView updateConstraints:^(MASConstraintMaker *make) {
//增加新的rowHeight后list超出允许最大高度,之前不满最大高度
if (listTableView.cellTotalHeight > (kTotalCellMaxHeight+NavAndStatusBarHeight-_keyboardHeight-44) && (listTableView.cellTotalHeight-rowHeight) < (kTotalCellMaxHeight+NavAndStatusBarHeight-_keyboardHeight-44)) {
make.height.equalTo(listView.yyHeight+((kTotalCellMaxHeight+NavAndStatusBarHeight-_keyboardHeight-44)-(listTableView.cellTotalHeight-rowHeight)));
}
//增加新的rowHeight后list没有超过允许最大高度
if (listTableView.cellTotalHeight <= (kTotalCellMaxHeight+NavAndStatusBarHeight-_keyboardHeight-44)) {
make.height.equalTo(listView.yyHeight+rowHeight);
}
}];
//tableView滚动到最底部,显示新添加行
[listTableView scrollToRow:listTableView.model.task.count-1 inSection:0 atScrollPosition:UITableViewScrollPositionBottom animated:NO];
[self layoutIfNeeded];
//autolayout动画
//改变原列的标题数量
UITextField *sourceListTableHeaderTF=(UITextField *)[self viewWithTag:[listTableView.model.id integerValue]];
sourceListTableHeaderTF.text=[NSString stringWithFormat:@"%@ %ld",listTableView.model.name,(unsigned long)listTableView.model.task.count];
}
} failure:^(YTKBaseRequest *request) {
}];
break;
}
}];
}else{
self.yesOrNo = YES;
[footer updateConstraints:^(MASConstraintMaker *make) {
make.height.equalTo(44);
}];
//list减去footer增加的高度(在这里做是为了动效)
[listView updateConstraints:^(MASConstraintMaker *make) {
make.height.equalTo(listView.yyHeight-44);
}];
//tableView的contentInset还原
listTableView.contentInset = UIEdgeInsetsMake(46, 0, 44, 0);
//隐藏textView
textView.alpha = 0;
[UIView animateWithDuration:0.25 animations:^{
//cancel隐藏
view.alpha = 0;
//add隐藏
self.cancel.alpha = 0;
//addCard显示
addCard.alpha = 1;
[self.viewController.navigationController setNavigationBarHidden:NO animated:YES];
[self layoutIfNeeded];
}];
[textView resignFirstResponder];
}
}];
view;
});
self.addView = add;
//初始化cancel按钮
UIView *cancel = ({
UIButton *view = [UIButton new];
view.contentHorizontalAlignment=UIControlContentHorizontalAlignmentCenter;
[view setTitle:NSLocalizedString(@"cancel", nil) forState:UIControlStateNormal];
[view setTitleColor:Global_trelloBlue forState:UIControlStateNormal];
[view.titleLabel setFont:[UIFont fontWithName:@"Arial-Bold" size:18]];
[view setTitleColor:[UIColor lightGrayColor] forState:UIControlStateHighlighted];
[view setTitleEdgeInsets:UIEdgeInsetsMake(0, -80, 0, -40)];
view.titleLabel.font = [UIFont systemFontOfSize:15];
[footer addSubview:view];
[view makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(0);
make.bottom.equalTo(-1);
make.width.equalTo(120);
}];
[view sizeToFit];
view.alpha = 0;
[self layoutIfNeeded];
//cancel点击事件
@weakify(self, view, textView, footer, listView, add, addCard)
[[view rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x)
{
@strongify(self, view, textView, footer, listView, add, addCard)
//footer高度还原
self.yesOrNo = YES;
[textView resignFirstResponder];
// list减去footer增加的高度(在这里做是为了动效)
[footer updateConstraints:^(MASConstraintMaker *make) {
make.height.equalTo(44);
}];
[listView updateConstraints:^(MASConstraintMaker *make) {
make.height.equalTo(listView.yyHeight);
}];
// tableView的contentInset还原
listTableView.contentInset = UIEdgeInsetsMake(46, 0, 44, 0);
// 隐藏textView
textView.alpha = 0;
[UIView animateWithDuration:0.5 animations:^{
//cancel隐藏
view.alpha = 0;
//add隐藏
add.alpha = 0;
//addCard显示
addCard.alpha = 1;
[self.viewController.navigationController setNavigationBarHidden:NO animated:NO];
[self layoutIfNeeded];
}];
}];
view;
});
self.cancel = cancel;
// addCard点击后动效
[footer updateConstraints:^(MASConstraintMaker *make) {
make.height.equalTo(44+44);
}];
[textView updateConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(2);
}];
[listView updateConstraints:^(MASConstraintMaker *make) {
make.height.equalTo(listView.yyHeight+44);
}];
self.contentSize = CGSizeMake(self.contentSize.width, 244);
[UIView animateWithDuration:0.25 animations:^{
[self.viewController.navigationController setNavigationBarHidden:YES animated:YES];
add.alpha = 1;
cancel.alpha = 1;
[self layoutIfNeeded];
}];
//弹出键盘
[textView becomeFirstResponder];
//tableView滚动到最底部,显示新添加行
// [listTableView scrollToBottom];
listTableView.bounces = NO;
if (listTableView.model.task.count>1) {
[listTableView scrollToRow:listTableView.model.task.count-1 inSection:0 atScrollPosition:UITableViewScrollPositionBottom animated:YES];
}
}];
业精于勤,荒于嬉;行成于思,毁于随。