ios客户端学习-键盘弹出遮住textfield

#pragma mark 键盘控制
/**
 * 键盘展开/收起时,动态调整当前scrollView高度,避免键盘挡住当前textField。
 * @param  showKeyboard    键盘是否弹出
 * @param  UIView       当前textField所在的view,如果是textfield可以更改为uitextfield
 */

- (void)adjustViewForKeyboardReveal:(BOOL)showKeyboard textField:(UIView *)textField
{
    // 获取当前scrollView frame,当键盘弹出时,当前scrollView frame上移一定高度。
    CGRect scrollFrame = self.container.frame;
    // 如果用户通过点击空白区域收起键盘,视图坐标恢复正常。
    if (!textField) {
        scrollFrame.origin.y = 0;
        [self viewChangeOriginYAnimation:scrollFrame];
        return;
    }
    // 键盘弹出,重新计算scrollView y轴。
    if (showKeyboard) {
        float keyboardHeight = keyboardRect.size.height;
        float bottomHeight = kHeightOfMainScreen - CGRectGetMaxY(self.container.frame) + self.container.bounds.size.height - (textField.frame.origin.y - self.container.contentOffset.y)-textField.bounds.size.height;
        if (bottomHeight >= keyboardHeight) {
            return;
        }
        // 计算view Y轴位移量,使得弹出键盘和当前textField的距离等于指定值。
        scrollFrame.origin.y -= (keyboardHeight-30) + kTextFieldPadding - bottomHeight;
    }
    // 当键盘收起时,当前视图frame Y轴置为0。
    else {
        scrollFrame.origin.y = 0;
    }
    [self viewChangeOriginYAnimation:scrollFrame];
}

/**
 * view改变y坐标时,增加动画效果。
 * @param viewFrame view视图的新frame
 */
- (void)viewChangeOriginYAnimation:(CGRect)viewFrame
{
    // 视图上移/下移动画
    [UIView setAnimationDuration:kAnimationDuration];
    self.container.frame = viewFrame;
    [UIView commitAnimations];
}

/** 键盘弹出通知方法,设置全局弹出键盘fame属性,并动态调整当前scrollView高度。 */
- (void)keyboardWillShow:(NSNotification *)notification
{
    // 返回通知关联的用户信息字典,从中取出弹出键盘尺寸信息。
    NSDictionary *userInfo = [notification userInfo];
    // 取键盘frame的value值,从而获取键盘frame。
    NSValue *value = [userInfo objectForKey:UIKeyboardFrameEndUserInfoKey];
    keyboardRect = [value CGRectValue];
    [self adjustViewForKeyboardReveal:YES textField:self.viewTop];
}

/** 键盘收起通知方法,动态调整当前scrollView高度。 */
- (void)keyboardWillHide:(NSNotification *)notification
{
    [self adjustViewForKeyboardReveal:NO textField:self.viewTop];
}

 

在类中定义全局变量

/** 弹出键盘fame */
    CGRect keyboardRect;
    // 获取焦点的textfield所在的view
    UIView *viewTextField;

使用方式:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];

-(void)viewWillDisappear:(BOOL)animated{
     [[NSNotificationCenter defaultCenter]removeObserver:self name:UIKeyboardWillShowNotification object:nil];
}

/** 处理键盘“return”按钮点击事件 */
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    [self adjustViewForKeyboardReveal:NO textField:viewTextField];// viewTextField 为textfield所在view
    return YES;
}

// 获得焦点
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{
    if (textField == textfieldAtView.textField) {
        viewTextField = textfieldAtView;
    }
    return YES;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值