解决键盘遮挡UITextField问题

来源:互联网 发布:数控加工中心编程g代码 编辑:程序博客网 时间:2024/05/17 18:01

////  ViewController.m//  UITextFieldScrollDemo////  Created by WeiZhen_Liu on 13-7-19.//  Copyright (c) 2013年 WeiZhen_Liu. All rights reserved.//#import "ViewController.h"@interface ViewController (){    UITextField *_textField;}@end@implementation ViewController- (void)viewDidLoad{    // self.view.frame:  0, 20, 320, 548    [super viewDidLoad];    NSLog(@"%f, %f", self.view.center.x, self.view.center.y);    NSLog(@"self.view.frame.size.height: %f", self.view.frame.size.height);    // 假设是iPhone5之后,则打印548.000000 去掉了状态栏的 20    _textField = [[UITextField alloc] init];        // 先假设是英文键盘    // [_textField setFrame:CGRectMake(20, self.view.frame.size.height-216-30, 280, 30)];    // 216是键盘高,30是textField高    [_textField setFrame:CGRectMake(20, 352-20-30, 280, 30)];    // 352是键盘originY,20是状态栏高,30是textField高    // 键盘的originY是相对于整个屏幕)        _textField.borderStyle = UITextBorderStyleBezel;    [self.view addSubview:_textField];    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didReceiveKeyBoardWillShowNotification:) name:UIKeyboardWillShowNotification object:nil];}- (void)didReceiveKeyBoardWillShowNotification:(NSNotification *)notification{    NSLog(@"************************");    NSDictionary *userInfo = [notification userInfo];    NSLog(@"%@", userInfo);    /**    {    English key board:        UIKeyboardAnimationCurveUserInfoKey = 0;        UIKeyboardAnimationDurationUserInfoKey = "0.25";                               UIKeyboardBoundsUserInfoKey = "NSRect: {{0, 0}, {320, 216}}";                   UIKeyboardCenterBeginUserInfoKey = "NSPoint: {160, 588}";        UIKeyboardCenterEndUserInfoKey = "NSPoint: {160, 372}";        UIKeyboardFrameBeginUserInfoKey = "NSRect: {{0, 480}, {320, 216}}";        UIKeyboardFrameChangedByUserInteraction = 0;        UIKeyboardFrameEndUserInfoKey = "NSRect: {{0, 264}, {320, 216}}";         }    */        /**     {     Chinese key board:         UIKeyboardAnimationCurveUserInfoKey = 0;         UIKeyboardAnimationDurationUserInfoKey = 0;         UIKeyboardBoundsUserInfoKey = "NSRect: {{0, 0}, {320, 252}}";                   UIKeyboardCenterBeginUserInfoKey = "NSPoint: {160, 390}";         UIKeyboardCenterEndUserInfoKey = "NSPoint: {160, 354}";         UIKeyboardFrameBeginUserInfoKey = "NSRect: {{0, 264}, {320, 216}}";         UIKeyboardFrameChangedByUserInteraction = 0;         UIKeyboardFrameEndUserInfoKey = "NSRect: {{0, 228}, {320, 252}}";          }     */    NSLog(@"--> %@", [userInfo objectForKey:UIKeyboardFrameEndUserInfoKey]);    NSValue *value = [userInfo objectForKey:UIKeyboardFrameEndUserInfoKey];    CGFloat keyBoardOriginY = value.CGRectValue.origin.y;                          NSLog(@"键盘originY:%f", keyBoardOriginY);        CGFloat keyBoardHeight = value.CGRectValue.size.height;    NSLog(@"键盘height: %f", keyBoardHeight);        NSNumber *duration = [userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey];    // CGFloat offSet = self.view.frame.size.height-keyBoardHeight-CGRectGetMaxY(_textField.frame);    CGFloat offSetY = CGRectGetMaxY(_textField.frame)-(self.view.frame.size.height-keyBoardHeight);    if (offSetY > 0) {   // 如果键盘遮挡了textField            [UIView animateWithDuration:duration.doubleValue animations:^{            self.view.frame = CGRectMake(0, 20-offSetY, self.view.frame.size.width, self.view.frame.size.height);            // self.view.center = CGPointMake(self.view.center.x, self.view.center.y-offSetY);            // 这样设其实是可以的,但是好像是apple的bug,第一次从英文切换到中文时,            // 但是这个didReceiveKeyBoardWillShowNotification:方法会调多次,所以不能这样做        }];    } else {   // 从中文到英文         [UIView animateWithDuration:0.25f animations:^{            [self.view setFrame:CGRectMake(0, 20, self.view.frame.size.width, self.view.frame.size.height)];        }];    }}- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{    [_textField resignFirstResponder];    [UIView animateWithDuration:0.25f animations:^{        [self.view setFrame:CGRectMake(0, 20, self.view.frame.size.width, self.view.frame.size.height)];    }];}- (void)dealloc{    [_textField release];    [super dealloc];}@end



原创粉丝点击