zoukankan      html  css  js  c++  java
  • iOS-UITextField-通知

    二.处理文本框与键盘之间的关系(当键盘弹出遮挡到文本框的时候进行调整)
    原理:
    首先要明白:
    1,键盘隐藏的时候,键盘上边界紧贴屏幕最低端,键盘在屏幕正下方。
    2:键盘弹起的时候,键盘下边界跟屏幕下边界重合,键盘出现在屏幕最下方。
    3:系统自带的键盘高度是固定的216,iOS8之后第三方的键盘,比如百度键盘高度可以任意调整。
    4:当键盘弹起时,有可能会遮挡到文本框,也有可能遮挡不到。当遮挡到的时候需要处理,没遮挡的时候取消处理。
    5:实现处理:(1):需要判断键盘弹起之后frame的Y值与文本框最大Y值的关系。(2):底层试图往上移动的距离 = 二者之间的差值(注意往上移动为负值)。
    步骤:
    1.接收系统发出的的三个通知
    键盘弹起:获取两个Y值,即文本框的最大Y值和键盘弹起之后Y值。修改底层试图的transform。
    键盘隐藏:取消对底层的transform的修改。
    键盘frame值改变:可以获知改变的frame值,我暂时没有用到。
    注意点:

    1.键盘通知名都是系统自己定义好了的,不可改变。

    UIKeyboardWillShowNotification

    UIKeyboardWillHideNotification

    UIKeyboardWillChangeFrameNotification

    2.通知中传的字典类型参数

     UIKeyboardAnimationCurveUserInfoKey = 7;

    UIKeyboardAnimationDurationUserInfoKey ="0.25";                                    键盘弹起或隐藏动画时长 

     UIKeyboardBoundsUserInfoKey = "NSRect: {{0, 0}, {414, 271}}";             键盘的bounds值

     UIKeyboardCenterBeginUserInfoKey = "NSPoint: {207, 871.5}";                 键盘隐藏时中心位置

     UIKeyboardCenterEndUserInfoKey = "NSPoint: {207, 600.5}";                    键盘弹起是中心位置

     UIKeyboardFrameBeginUserInfoKey = "NSRect: {{0, 736}, {414, 271}}";   键盘隐藏时的frame值

     UIKeyboardFrameEndUserInfoKey = "NSRect: {{0, 465}, {414, 271}}";      键盘弹起时的frame值

     UIKeyboardIsLocalUserInfoKey = 1;


    // .m文件中的源码,可以拷贝观看

    //  ViewController.m

    //  Text_文本框通知

    //

    //  Created by mncong on 15/12/4.

    //  Copyright © 2015年 mancong. All rights reserved.

    //

    #import "ViewController.h"

    @interface ViewController () <UITextFieldDelegate>

    {

        UITextField *_tf;

    }

    @end

    @implementation ViewController

    - (void)viewDidLoad {

        [super viewDidLoad];

        self.view.backgroundColor = [UIColor grayColor];

        

        //获取系统发出的键盘弹起的通知。

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

        

        //获取系统发出的键盘隐藏的通知。

        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];

        

        //获取系统发出的键盘frame值改变的通知。

        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardFrameChange:) name:UIKeyboardWillChangeFrameNotification object:nil];

        

        //添加文本框

        [self addTF];

    }

    #pragma mark 添加文本框

    - (void)addTF

    {

        _tf = [[UITextField alloc] init];

        _tf.translatesAutoresizingMaskIntoConstraints = NO;

        _tf.delegate = self;

        _tf.placeholder = @"这里就是万恶的被遮挡的文本框";

        _tf.borderStyle  = UITextBorderStyleLine;

        [self.view addSubview:_tf];

        

        //可以不必在意,我为了实验vfl语句能否获取控件的frame值。可以删掉这两行,再添加frame属性。

        [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[_tf]-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_tf)]];

        [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[_tf(==40)]-100-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_tf)]];

    }

    #pragma mark 键盘弹起

    - (void)keyboardWillShow:(NSNotification *)noti

    {

        NSLog(@"键盘弹起");

        NSDictionary * dict = noti.userInfo;

        NSLog(@"%@",dict);

        

        /**dict:

         {

         UIKeyboardAnimationCurveUserInfoKey = 7;

         UIKeyboardAnimationDurationUserInfoKey = "0.25";

         UIKeyboardBoundsUserInfoKey = "NSRect: {{0, 0}, {414, 271}}";

         UIKeyboardCenterBeginUserInfoKey = "NSPoint: {207, 871.5}";

         UIKeyboardCenterEndUserInfoKey = "NSPoint: {207, 600.5}";

         UIKeyboardFrameBeginUserInfoKey = "NSRect: {{0, 736}, {414, 271}}";

         UIKeyboardFrameEndUserInfoKey = "NSRect: {{0, 465}, {414, 271}}";

         UIKeyboardIsLocalUserInfoKey = 1;

         }

         */

        

        //获取文本框的最大Y值。

        CGFloat tfMaxY = CGRectGetMaxY(_tf.frame);

        

        //获取键盘弹起之后的Y值。

        CGFloat keyboardY = [dict[UIKeyboardFrameEndUserInfoKey] CGRectValue].origin.y;

        

        //获取键盘弹起使用的时间。

        CGFloat duration = [dict[UIKeyboardAnimationDurationUserInfoKey] floatValue];

        

        //判断是否遮挡

        if (tfMaxY > keyboardY) {

            

            //如果遮挡,添加动画,改变view的transform。

            [UIView animateWithDuration:duration animations:^{

                self.view.transform = CGAffineTransformMakeTranslation(0, keyboardY-tfMaxY);

            }];

        }

    }

    #pragma mark 键盘隐藏

    - (void)keyboardWillHide:(NSNotification *)noti

    {

        //获取隐藏时间

        CGFloat duration = [noti.userInfo[UIKeyboardAnimationDurationUserInfoKey] floatValue];

        

        //取消transform的改变量。

        [UIView animateWithDuration:duration animations:^{

            self.view.transform = CGAffineTransformIdentity;

        }];

    }

    #pragma mark frame改变的通知

    - (void)keyboardFrameChange:(NSNotification *)noti

    {

        NSLog(@"键盘frame改变了");

    }

    #pragma mark 键盘的代理方法 点击return

    - (BOOL)textFieldShouldReturn:(UITextField *)textField

    {

        [textField resignFirstResponder];

        return YES;

    }

    @end

    你的一次推荐就是对我莫大的支持。感觉不错,给个推荐或者评论吧。
  • 相关阅读:
    Tensorflow学习笔记1
    强化学习——从最简单的开始入手
    MATLAB R2017a 安装与破解
    C# 理解lock
    Bayer Pattern
    OpenCV参考手册之Mat类详解
    opencv学习之颜色空间转换cvtColor()
    UNICODE下CString转string
    解决VS2013报错fopen、sprintf等函数安全的问题
    Convert between cv::Mat and QImage 两种图片类转换
  • 原文地址:https://www.cnblogs.com/mancong/p/5022043.html
Copyright © 2011-2022 走看看