首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

仅当键盘阻止UITextField / UITextView时才向上移动UIView

基础概念

在iOS开发中,UITextFieldUITextView 是常用的文本输入控件。当这些控件获得焦点并弹出键盘时,如果它们位于屏幕的底部,键盘可能会遮挡住输入框,导致用户无法看到他们正在输入的内容。为了解决这个问题,通常需要将包含这些控件的 UIView 向上移动,以便用户可以看到输入框和键盘。

相关优势

  1. 用户体验:确保用户在输入时能够看到他们正在编辑的内容,提高交互的直观性和舒适度。
  2. 可用性:避免因为键盘遮挡而导致的输入错误或需要额外操作来查看输入内容。

类型

  • 自动调整:系统可以根据键盘的高度自动调整视图的位置。
  • 手动调整:开发者可以通过监听键盘事件来手动调整视图的位置。

应用场景

  • 表单填写:在填写表单时,特别是当输入框位于页面底部时。
  • 聊天应用:在聊天界面中,输入框通常位于底部,需要随着键盘的弹出而移动。

实现方法

以下是一个简单的示例代码,展示如何在 UITextFieldUITextView 获得焦点时向上移动 UIView

代码语言:txt
复制
import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var textField: UITextField!
    @IBOutlet weak var containerView: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 注册键盘事件通知
        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(_:)), name: UIResponder.keyboardWillShowNotification, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(_:)), name: UIResponder.keyboardWillHideNotification, object: nil)
    }

    @objc func keyboardWillShow(_ notification: Notification) {
        if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
            let contentInsets = UIEdgeInsets(top: 0.0, left: 0.0, bottom: keyboardSize.height, right: 0.0)
            containerView.contentInset = contentInsets
            containerView.scrollIndicatorInsets = contentInsets
            
            // 确保文本框在可视区域内
            var aRect = self.view.frame
            aRect.size.height -= keyboardSize.height
            if !aRect.contains(textField.frame.origin) {
                self.containerView.scrollRectToVisible(textField.frame, animated: true)
            }
        }
    }

    @objc func keyboardWillHide(_ notification: Notification) {
        let contentInsets = UIEdgeInsets.zero
        containerView.contentInset = contentInsets
        containerView.scrollIndicatorInsets = contentInsets
    }

    deinit {
        // 移除监听
        NotificationCenter.default.removeObserver(self)
    }
}

可能遇到的问题及解决方法

问题:视图移动后无法正确恢复原位。

原因:可能是在键盘隐藏时没有正确重置视图的位置或内边距。

解决方法:确保在 keyboardWillHide 方法中正确地将视图的内边距设置为零,并且如果有滚动视图,也要相应地调整其指示器内边距。

通过上述方法,可以有效地解决键盘遮挡输入框的问题,提升应用的用户体验。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

iOS学习——tableview中带编辑功能的cell键盘弹出遮挡和收起问题解决

最近在项目中经常用到UITableView中的cell中带有UITextField或UITextView的情况,然后在这种场景下,当我们点击屏幕较下方的cell进行编辑时,这时候键盘弹出来会出现遮挡待输入的...2.1 UITextField或UITextView点击之后的详细流程   在对cell进行封装和自定义的时候,我们需要考虑我们的UITextField或UITextView从点击编辑框到结束编辑的整个过程是怎么样的...下面的流程就是UITextField或UITextView在整个编辑过程中的详细流程步骤: 在成为第一响应者之前,文本框调用其代理的textFieldShouldBeginEditing:  方法来允许或阻止其第一响应者...  在前面的2.1的UITextField或UITextView点击之后的详细流程分析中我们知道,在点击文本之后弹出键盘时会发送一个UIKeyboardWillShowNotification的通知,...= frame.origin.y + frame.size.height - (self.view.frame.size.height - kbSize.height); //将试图的Y坐标向上移动

3.9K80

iOS学习——键盘弹出遮挡输入框问题解决方案

在iOS或Android等移动端开发过程中,经常遇到很多需要我们输入信息的情况,例如登录时要输入账号密码、查询时要输入查询信息、注册或申请时需要填写一些信息等都是通过我们键盘来进行输入的,在iOS开发过程中...UITextField的整个输入过程分为如下7个步骤(如下过程,textfield换成textView即是TextView的响应过程): 在成为第一响应者之前,文本框调用其代理的  方法来允许或阻止其第一响应者...textFieldDidEndEditing: 二 键盘的弹出与收起 2.1 弹出键盘的控制   关于键盘的弹出与收起问题,从上面的响应过程分析可知,键盘的弹出对于UITextField和UITextView...  还是在之前的分析中,我们知道在键盘弹出和收起时,系统都会发出对应的通知,所以我们可以在收到键盘弹出的时候判断键盘的位置和当前输入文本框的位置,如果有遮挡,就将当前视图进行一个向上平移,在收到键盘回收的通知时就平移到原先的位置...CGFloat offSet = frame.origin.y + 140 - (self.view.frame.size.height - kbSize.height); //将试图的Y坐标向上移动

3.7K60
  • 【iOS 开发】基本 UI 控件详解 (UIButton | UITextField | UITextView | UISwitch)

    设置下面的属性; -- Placeholder 属性 : 设置 "请输入密码" 提示字符串; -- Clear Button 属性 : 设置 "Appear while editing" 选项, 当编辑时出现取消按钮...触摸背景关闭虚拟键盘 (1) 修改 Custom Class  修改背景类别 :  -- 修改原因 : 默认的背景控件时 UIView, 该控件没有 IBAction 事件, 因此需要将背景控件设置为...UITextView 简介 (1) UITextView 继承结构 UITextView 继承结构简介 :  -- 基类 : 继承了 UIScrollView : UIView 控件, 默认这些控件都自带滚动条...: " 方法 : 选中 UITextView 控件内文本时激发该方法; 4....UITextView 虚拟键盘关闭 (1) 需求分析 UITextView 与 UITextField 中使用的虚拟键盘对比 :  -- UITextField 虚拟键盘 : 右下角的键是 Done,

    6.9K20

    编码篇-iOS开发中的奇巧小伎

    22、当使用-performSelector:withObject:withObject:afterDelay:方法时,需要传入多参数问题 23、比较两个CGRect/CGSize/CGPoint是否相等...33、获取手机RAM容量 34、在UITextView中显示html文本 35、选中textField或者textView所有文本(我这里以textView为例) 36、隐藏UITextView/UITextField...光标 37、当UITextView/UITextField中没有文字时,禁用回车键 38、通知监听APP生命周期 39、获取collectionViewCell在屏幕中的frame 40、UITextField.../UITextField光标 textField.tintColor = [UIColor clearColor]; 37、当UITextView/UITextField中没有文字时,禁用回车键 textField.enablesReturnKeyAutomatically...// 设置某个键盘颜色 textField.keyboardAppearance = UIKeyboardAppearanceAlert; // 设置工程中所有键盘颜色 [[UITextField

    5.4K10

    UI篇-UIResponder之事件传递和响应精析

    其中涉及到了UIView中的两个方法(可以重写),当hitTest返回YES才会调用这个View的 Touch事件,因为如果返回NO,则当前View被排除在相应链之外了。 ?...程序寻找能够处理事件的对象,事件就在响应者链中向上传递。 ?...某些时候,当您的代码正在执行动画时,可能希望关闭事件的传递。 在view添加单击手势之后,原来的touchesEnded方法就无效了。touchesBegin 还是生效的。...我们在使用UITextView和UITextField的时候,可以通过它们的inputAccessoryView属性给输入时呼出的键盘加一个附属视图,通常是UIToolBar,用于回收键盘。...但是当我们要操作的视图不是UITextView或UITextField的时候,inputAccessoryView就变成了readonly的。

    2.5K30

    ios学习——键盘的收起

    在开发过程中,我们经常会用到UITextField、UITextView等文本框,然后这些文本框在点击之后会自动成为第一响应者(FirstResponder),并自动弹出软键盘。...具体解决方案有两种: 1、在当前页面设置点击事件,当点击事件发生时,注销当前视图的第一响应者或者设置当前摄入结束。...当点击事件发生在非选中区域时,则键盘会自动回收: 1 //在viewDidLoad中 添加点击手势,为了关闭键盘的操作 2 UITapGestureRecognizer *tap1 = [[UITapGestureRecognizer...2、利用键盘上的 回车键 来进行设置当前UITextField、UITextView等文本框不是第一响应者,这种方法对UITextField、UITextView的应用不一样,需要区别进行。   ...; //UITextViewDelegate代理,当键盘输入变化时调用,可以通过该方法判断输入的内容 - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange

    1.9K60

    【 iOS 应用开发 】 UIKit 控件 ( UIView 属性 | storyboard 设置 | 模拟器 | 拖线关联 | tag | 软键盘操作 | 颜色值 | 代码生成控件 | 动画设置 )

    属性; 10.退出软键盘 : ① 谁触发谁关闭 调用UITextField 的 resignFirstResponser 方法, ② 调用 根节点 [self.view endEditing:YES]...控件 : 弹出数字键盘, 用于接收用户输入的数字; 3.UILabel 控件 : 两个分别显示 + 和 = 符号, 这个不变, 最后一个 Label 标签 用于显示 用户从 UITextField 输入的两个数之和..., 在将结构体赋值给对象 //1.取出 frame 结构体 CGRect frame = self.mainButton.frame; //2.修改结构体中的成员, 向上移动..., 在将结构体赋值给对象 //1.取出 frame 结构体 CGRect frame = self.mainButton.frame; //2.修改结构体中的成员, 向上移动..., 在将结构体赋值给对象 //1.取出 frame 结构体 CGRect frame = self.mainButton.frame; //2.修改结构体中的成员, 向上移动

    5K30

    iOS表情键盘的完整实现

    接下来看一下微博国际版,国际版调起表情键盘时是有光标的,是一个"真正的"键盘,但是想要拖拽光标的时候,很大概率上会触发到保存图片的行为(如下图所示),导致根本没办法拖动光标。 ?...真正的键盘也就是说调起表情键盘时输入框是有光标的,能进行拖拽光标、选中区域等的操作,这样的体验才是与系统键盘一致的。...其实系统已经提供好了接口给我们直接使用,UITextView和UITextField都有的inputView和inputAccessoryView就是用来实现自定义键盘的,这两个属性的定义如下: //..., strong) UIView *inputAccessoryView; 同时系统键盘在 设置->声音->按键音 选项打开且手机非静音状态下输入是有按键的声音的,这个按键音也是可以支持的,只要自定义键盘类遵循...一番查找之后才找到一个比较隐蔽的属性:textDragInteraction,直接设置为NO就能禁止掉NSTextAttachment的拖拽交互。

    2K30

    iOS 文本输入控制(献上框架)

    于是,我写下这篇文章,总结一下关于UITextField和UITextView输入控制的那些事儿,并且还献上一个框架。...若只能输入英文、特殊字符、数字等,就将键盘的索引关掉,并且将键盘种类更改,让用户不能切换到中文键盘(因为中文键盘自带索引,关不掉),方法如下: //关索引 tf.autocorrectionType =...UITextAutocorrectionTypeNo; //换键盘 tf..keyboardType = UIKeyboardTypeASCIICapable; UITextView 的处理方法和 UITextField...大致的结构就是这样,很简单,下面解析一下内部实现(主要实现 UITextField 和 UITextView 差不多)。...况且,UITextField的父类是UIControl,向上追溯也没有类带有delegate属性,也就是说,UITextField的setDelegate:方法实现中理论上是没有关于父类同样delegate

    1.1K120

    iOS UI控件了解一下

    当一个view设置bounds时,会把自己当成一个容器,定义自己的边界大小以及左上角的初始坐标。当子视图添加到此视图时,会根据bounds指定的原点(0,0)计算frame,而非左上角。...在App中UITextField出现频率也比较高; (2)iOS系统借助虚拟键盘实现输入,当点击输入框,系统会自动调出键盘,方便 你进一步操作。...在你不需要输入的时候,可以使用收回键盘的方法,收回弹出的键盘; (3)UITextField和UILabel相比,UILabel主要用于文字显示,不能编辑, UITextField允许用户编辑文字(输入...6)输入控制: UITextField类提供了许多控制输入的API,包括密码模式、键盘样式、自定义键盘等(详见下表) ?...创建UIButton与创建UILabel、UITextField、UIView的步骤很相似。

    2.6K20

    设计iOS中随系统键盘弹收和内容文字长度自适应高度的文本框

    设计iOS中随系统键盘弹收和内容文字长度自适应高度的文本框     文本输入框是多数与社交相关的app中不可或缺的一个控件,这些文本输入框应该具备如下的功能: 1.在键盘为弹起时,输入框悬浮在界面底部...2.当键盘弹起时,输入框位置上移至键盘上方,并且动画应与键盘同步。 3.当输入的文字超出一行时,输入框应想用的进行高度扩展。...4.当输入框的高度达到某一极限值时,输入框高度不应继续扩展,文字区域应该支持滑动。     使用autolayout布局技术加上对键盘的相关监听,可以十分方便的实现上述效果。...//文本控件中文字输入控件     @IBOutlet weak var ourTextField: UITextView!     ...将要改变 @available(iOS 5.0, *) public let UIKeyboardDidChangeFrameNotification: String//键盘frame已经改变 还需要实现当输入框文字长度改变时的回调方法如下

    1.5K20

    解决UITableView中Cell重用机制导致内容出错的方法总结

    上面主要是一个个的UITableViewCell,可以让UITableViewCell响应一些点击事件,也可以在UITableViewCell中加入UITextField或者UITextView等子视图...UITableView中的cell可以有很多,一般会通过重用cell来达到节省内存的目 的:通过为每个cell指定一个重用标识符(reuseIdentifier),即指定了单元格的种类,当cell滚出屏幕时...,会将滚出屏幕的单元格放入 重用的queue中,当某个未在屏幕上的单元格要显示的时候,就从这个queue中取出单元格进行重用。...比如,当一个cell含有一个 UITextField的子类并被放在重用queue中以待重用,这时如果一个未包含任何子视图的cell要显示在屏幕上,就会取出并使用这个重用的 cell显示在无任何子视图的cell...= nil) { [(UIView*)[cell.contentView.subviews lastObject] removeFromSuperview]; } } //...其他代码 } 参考文章:

    2.5K50

    iOS学习——输入验证码界面封装

    实现后的效果大致如下图所示,当四位签到码全部输入时,提交按钮是可以提交的,否则提交按钮失效,不允许提交。 ? ?...验证码输入视图(KLCodeResignView)的最底层用一个透明的UITextField来接收键盘的输入信息,上面则用4个展示视图(KLCodeView)来分别展示输入的验证码信息,所有的展示视图(...所以,KLCodeResignView应该向外提供两个处理入口,验证码输入完成和输入未完成时的操作入口,并在完成时提供输入验证码信息,这里我们采用block的方式进行向外提供操作入口。...这个问题的解决也很简单,因为这个 UILabel的内容是通过一个属性text来进行设置的,所以我们重写text的设置方法就OK了,当设置的text内容不为空时,我们就设置对应的颜色为需要的颜色(蓝色),...我们用属性currIndex来表示当前待输入的展示视图KLCodeView的下标,所以,当输入一个合法的验证码时,currIndex要加1,当删除一个验证码时,currIndex要减1,并且当currIndex

    1.9K30
    领券