iOS简单的键盘弹出输入框上移

本文介绍了在iOS开发中,如何避免键盘弹出遮挡输入框的问题,通过手动实现简单动画效果,包括添加键盘通知、获取当前编辑的UITextField、计算位置以及视图上移和键盘收起的处理。这种方法适用于一般场景,对于有特定需求的项目可能需进一步定制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前项目中遇到键盘弹出遮挡输入框时, 都是使用三方库DaiDodgeKeyboard进行界面上移动画, 这个三方库很方便, 但是有时候会出现一些莫名的Bug, 所以自己动手实现了一个简单的效果,基本实现了键盘弹出的动画效果, 可能还要具体需求具体分析, 不过一般场景已经够用,

1.添加测试UITextfield,添加一下键盘的通知, 并记得移除

// 添加

- (void)viewDidLoad {
[super viewDidLoad]; 
elf.view.backgroundColor=[UIColor whiteColor];

  //添加UItextfield
_editingTextField=[[UITextField alloc]init];

CGFloat textX =100;
CGFloat textY =500;
CGFloat textW =100;
CGFloat textH =50;
_editingTextField.frame=CGRectMake(textX, textY, textW, textH);
_editingTextField.placeholder=@"测试!!!";
[self.view addSubview:_editingTextField];

[self.editingTextField resignFirstResponder];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
 }

//移除

 - (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil];
   }
2.写一个方法取到编辑状态下的textfield
    - (void)getIsEditingView:(UIView *)rootView {
for (UIView *subView in rootView.subviews) {
    if ([subView isKindOfClass:[UITextField class]]) {
        if (((UITextField *)subView).isEditing) {
            self.editingTextField = (UITextField *)subView;
            return;
        }
    }
    [self getIsEditingView:subView];
}
    }
3.计算已经拿到的textfield在屏幕中的位置
    - (CGFloat)screenViewYValue:(UIView *)textfield {
CGFloat y = 0;
for (UIView *view = textfield; view; view = view.superview) {
    y += view.frame.origin.y;
    if ([view isKindOfClass:[UIScrollView class]]) {
        // 如果父视图是UIScrollView则要去掉内容滚动的距离
        UIScrollView* scrollView = (UIScrollView*)view;
        y -= scrollView.contentOffset.y;
    }
}
return y;
    }
4.最后针对拿到的这个位置来进行视图上移处理, 也就是通知执行的方法
    - (void)keyboardWillShow:(NSNotification *)noti {
// 拿到正在编辑中的textfield
[self getIsEditingView:self.view];
// textfield的位置
CGFloat viewY = [self screenViewYValue:self.editingTextField];
// 键盘的Y值
NSDictionary *userInfo = [noti userInfo];
NSValue *value = [userInfo objectForKey:UIKeyboardFrameEndUserInfoKey];
CGFloat keyboardEndY = value.CGRectValue.origin.y;
// 动画
NSNumber *duration = [userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey];
[UIView animateWithDuration:duration.doubleValue animations:^{
    if (viewY+50 > keyboardEndY) {
        CGRect rect = self.view.frame;
        rect.origin.y += keyboardEndY - (viewY+50);
        self.view.frame = rect;
    }
}];
    }
5.键盘收起方法就比较简单了, 直接复位即可
    - (void)keyboardWillHide:(NSNotification *)noti {
CGRect rect = self.view.frame;
rect.origin.y = 0;
self.view.frame = rect;
   }

有什么不懂的可以留言哦~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值