UITextField 监听

- (void)creatTextField {
    NSArray *titles = @[@"登录",@"注册"];
    for (int i = 0; i < 2; i++) {
        UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(10, 30+40*i, 300, 30)];
        textField.borderStyle = UITextBorderStyleLine;
        textField.tag = 101+i;
        //设置代理
        textField.delegate = self;
        
        textField.clearButtonMode  = UITextFieldViewModeAlways;
        if (i == 1) {
            textField.secureTextEntry = YES;
        }
        
        [self.view addSubview:textField];
        [textField release];
        
        UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];
        button.frame = CGRectMake(40+140*i, 400, 100, 50);
        [button setTitle:titles[i] forState:UIControlStateNormal];
        [button addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];
        button.tag = 201+i;
        [self.view addSubview:button];
    }
    //UITextField 成为第一响应者 就会 弹出键盘
    
    UITextField *text1 = (UITextField *)[self.view viewWithTag:101];
    //成为第一响应者
    [text1 becomeFirstResponder];
    
    /**
     1.点击TextField会成为第一响应者
     2.通过代码 [text1 becomeFirstResponder];
     
     收键盘 就是 取消textField的第一响应
     */
}
- (void)btnClick:(UIButton*)button  {
    kDebugPrint;
    [self hiddenKeyboard];
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [self hiddenKeyboard];
}

#pragma mark - UITextFieldDelegate
//点击return键的时候调用
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    //取消第一响应
    [textField resignFirstResponder];
    NSLog(@"return 键被点击");
    kDebugPrint;
    return YES;
}


#pragma mark - 取消第一响应
- (void)hiddenKeyboard {
    UITextField *text1 = (UITextField *)[self.view viewWithTag:101];
    UITextField *text2 = (UITextField *)[self.view viewWithTag:102];
    [text1 resignFirstResponder];//取消第一响应
    [text2 resignFirstResponder];
}


- (void)viewDidLoad
{
    [super viewDidLoad];
    
    /*
     键盘在弹出和收起的时候 都会向系统发送通知,那么这时我们只需要把这个通知接收到了处理一下就可以了
     
     我们的每个app有且只有一个通知中心(单例对象),当一个对象要发通知的时候 都是通过系统通知中心 进行广播,我们只需要提前在通知中心注册一个观察者 专门来监听这个广播通知就可以了
     
     1.先在代码入口注册一个观察者
     2.接收到通知之后 观察者就可以去处理这个通知
     */
    //必须先注册观察者
    NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
    //注册观察者
    /**
     第一个参数 任意类型对象地址
       2       第一个参数的行为 SEL
       3       通知的名字
       4       谁发的通知  nil表示 可以接收任意对象发送的指定通知
     一旦 键盘弹出 观察者就可以收到这个广播,让self调用 keyboardShow:
     
     */
    //监听弹键盘通知
    [nc addObserver:self selector:@selector(keyboardShow:) name:UIKeyboardWillShowNotification object:nil];
    //监听收键盘通知
    [nc addObserver:self selector:@selector(keyboardHidden:) name:UIKeyboardWillHideNotification object:nil];
    
    [self creatTextField];
}
#pragma mark - 接收到通知调用的函数
- (void)keyboardShow:(NSNotification *)nf {
    NSLog(@"弹键盘");
    NSDictionary *dict = nf.userInfo;
    NSLog(@"dict:%@",dict);
    
    //获取弹键盘时间
    //double t = [dict[@"UIKeyboardAnimationDurationUserInfoKey"] doubleValue];
    double t = [dict[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
    
    UIButton *button1 = (UIButton *)[self.view viewWithTag:201];
    UIButton *button2 = (UIButton *)[self.view viewWithTag:202];
    /*
     ^{ }
     block 代码块 相当于一个无名函数 匿名函数
     block 主要用于回调
     */
    [UIView animateWithDuration:t animations:^{
        //修改的view的属性放在这里block中
        button1.frame = CGRectMake(40, 200, 100, 50);
        button2.frame = CGRectMake(180, 200, 100, 50);
    } completion:^(BOOL finished) {
        //动画完成之后 回调这个block
        NSLog(@"动画完成");
    }];

}
- (void)keyboardHidden:(NSNotification *)nf {
    NSLog(@"收键盘");
    UIButton *button1 = (UIButton *)[self.view viewWithTag:201];
    UIButton *button2 = (UIButton *)[self.view viewWithTag:202];
    
    //收键盘的时候按钮回去
    [UIView animateWithDuration:0.25 animations:^{
        //修改的view的属性放在这里block中
        button1.frame = CGRectMake(40, 400, 100, 50);
        button2.frame = CGRectMake(180, 400, 100, 50);
    } completion:^(BOOL finished) {
        //动画完成之后 回调这个block
        NSLog(@"动画完成");
    }];
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值