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

当UIScrollView滚动第一个响应者查看时,我如何修复iOS 14中的错误行为?

在iOS 14中,UIScrollView的滚动行为可能会出现一些错误,特别是在处理第一个响应者(first responder)时。以下是一些基础概念和相关解决方案:

基础概念

  1. UIScrollView:这是一个可以滚动的视图容器,常用于显示比屏幕大的内容。
  2. First Responder:这是UIResponder的一个实例,能够接收和处理用户交互事件,如键盘输入、触摸事件等。

常见问题及原因

在iOS 14中,UIScrollView滚动时可能会遇到以下问题:

  • 滚动时键盘不自动弹出或收起。
  • 滚动后,输入框失去焦点,导致键盘消失。
  • 滚动行为不流畅,有时会出现卡顿。

这些问题通常是由于UIScrollView与键盘事件处理之间的协调问题引起的。

解决方案

以下是一些解决这些问题的方法:

1. 使用NotificationCenter监听键盘事件

通过监听键盘的显示和隐藏事件,可以手动调整UIScrollView的内容偏移量。

代码语言:txt
复制
import UIKit

class ViewController: UIViewController {
    @IBOutlet weak var scrollView: UIScrollView!
    @IBOutlet weak var textField: UITextField!

    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)
            scrollView.contentInset = contentInsets
            scrollView.scrollIndicatorInsets = contentInsets
            
            // Scroll to the active text field
            if let activeTextField = textField {
                let rect = activeTextField.convert(activeTextField.bounds, to: scrollView)
                scrollView.scrollRectToVisible(rect, animated: true)
            }
        }
    }

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

    deinit {
        NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillShowNotification, object: nil)
        NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillHideNotification, object: nil)
    }
}

2. 使用UIScrollViewDelegate优化滚动行为

通过实现UIScrollViewDelegate的方法,可以更精细地控制滚动行为。

代码语言:txt
复制
extension ViewController: UIScrollViewDelegate {
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        // 可以在这里添加自定义的滚动逻辑
    }
}

3. 使用Auto Layout确保布局正确

确保UIScrollView及其子视图的布局使用Auto Layout,这样可以避免因布局问题导致的滚动异常。

应用场景

这些解决方案适用于需要在UIScrollView中处理键盘事件的场景,例如聊天应用、表单填写页面等。

总结

通过监听键盘事件并手动调整UIScrollView的内容偏移量,可以有效解决iOS 14中UIScrollView滚动时的错误行为。同时,合理使用UIScrollViewDelegate和Auto Layout可以进一步优化滚动体验。

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

相关·内容

iOS 中的事件响应

区别在于当触摸事件发生时, 使用第一个方法可以立即控制 UIGestureRecognizer 是否对其处理,且不会修改 UIGestureRecognizer 的状态机;(时机在 手势touchesBegan...当用户在 UIScrollView 的一个子视图上按下时,UIScrollView并不知道用户是想要滑动内容视图还是点击对应子视图,所以在按下的一瞬间, 事件 UIEvent 从 UIApplication...当倒计时结束前,如果用户的手指发生了移动,直接滚动内容视图,不会将该事件传递给对应的子视图; 当倒计时结束时,如果用户的手指位置没有改变,则调用自身的 -touchesShouldBegin:withEvent...,即滚动视图不会再滚动。..., in view: UIView) -> Bool // 在UIScrollView的子类中重写该方法,用于返回是否取消已经传递给子视图的事件,默认当子视图是UIControl时返回NO,否则返回YES

2.8K11

记一次 contentInsetAdjustmentBehavior 引发的bug

这不科学啊,这个只是用来设置可滚动范围的接口啊,难道是我设置的高度太多了?但在尝试设置了多个不同的高度后,发现都没有解决问题。让我有点怀疑人生了。...3.3 排查方向三 在前面排查的方向都没有办法解决问题时,我已经没有其他任何的思绪了,只能去翻阅scrollView的接口文档,查看是否有其他接口会影响到子View的位置情况,发现了一个属性contentInsetAdjustmentBehavior...:自动调整 scrollableAxes:只调整在可滚动方向的 never : 不调整 always :在调整内容时,自己调整 并且在iOS 11以上的系统,该属性的默认值为always,也就是说在你调整它的...#available(iOS 11.0, *) { scrollView.contentInsetAdjustmentBehavior = .never } 真正修复问题的代码其实就只有一行...,但排查到问题实际花费了我一天的时间,在学习iOS的道路上还任重道远

82320
  • 【IOS开发基础系列】UIScrollView专题

    ScrollView本身不能绘制,除非显示水平和竖直的指示器。滚动视图必须知道内容视图的大小,以便于知道什么时候停止;一般而言,当滚动出内容的边界时,它就返回了。         ...某些对象是用来管理内容显示如何绘制的,这些对象应该是管理如何平铺显示内容的子视图,以便于没有子视图可以超过屏幕的尺寸。就是当用户滚动时,这些对象应该恰当的增加或者移除子视图。          ...一个滚动视图也可以控制一个视图的缩放和平铺。当用户做捏合手势时,滚动视图调整偏移量和视图的比例。当手势结束的时候,管理视图内容显示的对象,就应该恰当的升级子视图的显示。...而前面所说的时,中断touch-down事件,和取消touch事件是俩码事,所以当快速在子视图上移动的时候,当然可以滚动。...tid-248386.html 深入理解iOS开发中的UIScrollView http://mobile.51cto.com/hot-443341.htm IOS学习笔记——iOS组件之UIScrollView

    65530

    UIScrollView

    canCancelContentTouches; //28.自定义默认行为,当手指触摸在显示的内容由子类重写 - (BOOL)touchesShouldBegin:(NSSet *)touches...; //32.一个浮点值 指定目前用于滚动视图的内容的比例因子 @property(nonatomic) CGFloat zoomScale NS_AVAILABLE_IOS(3_0); //33....滚动动画停止时执行代码改变时触发,也就是setContentOffset改变的时候 - (void)scrollViewDidEndScrollingAnimation:(UIScrollView *...; @end UIScrollView的常见属性 @property(nonatomic) CGPoint contentOffset; 这个属性用来表示UIScrollView滚动的位置 (其实就是内容左上角与...的代理方法一般以scrollView开头 如何监听控件的行为 通过addTarget: 只有继承自UIControl的控件,才有这个功能 UIControlEventTouchUpInside : 点击事件

    1.8K60

    iOS面试题-UI篇

    可以响应用户事件,Xcode6之后可以方便的通过视图调试功能查看图层之间的关系 UIView是iOS系统中界面元素的基础,所有的界面元素都继承自它。...如果没有找到指定标识的cell,那么会通过initWithStyle:reuseIdentifier:创建一个cell 当cell离开界面就会被放到缓存池中,以供下次复用 如何高性能的给 UIImageView...如何进行iOS6、7的适配 通过判断版本来控制,来执行响应的代码 功能适配:保证同一个功能在6、7上都能用 UI适配:保证各自的显示风格 // iOS版本为7.0以上(包含7.0) #define iOS7...A的view的部分区域中显示 假设控制器B的view中有一个UIScrollView这样一个子控件 如果此时在控制器B的viewDidLoad中设置UIScrollView的contentSize的话会导致不准确的问题...如果UIWindow对象也不处理,则将事件或消息传递给UIApplication对象 如果UIApplication也不能处理该事件或消息,则将其丢弃 补充:如何判断上一个响应者 如果当前这个view

    2K21

    iOS中高级开发人员跳槽涨薪必备面试问题

    面试 iOS 开发时,切入点很重要,不同的切入点会导致不同的结果,没有找到合适的切入点也无法对应聘者有一个全面的了解。...Selector 是如何被转化为 C 语言的函数调用的? UIScrollView 大概是如何实现的,它是如何捕捉、响应手势的?...当 TableView 的 Cell 改变时,如何让这些改变以动画的形式呈现? 什么是 Method Swizzle,什么情况下会使用?...经验类问题 为什么 UIScrollView 的滚动会导致 NSTimer 失效? 为什么当 Core Animation 完成时,layer 又会恢复到原先的状态?...iOS工程师必看的 20 道 面试题 16道面试官必问你必须会的iOS面试题 失业56天后,靠着这份资料,我从无人问津到手握4个大厂offer 2020年 面向高级开发人员的 iOS面试问题 获取更多面试资料

    1.1K00

    UIScrollView进阶技巧

    UIScrollView是iOS开发中经常用到的UI控件,像图片轮播之类的效果都可以用UIScrollView来实现,当然轮播什么的网上有很多教程了,我就不多说了。...先看一下效果图吧,都来自我自己的项目: ? 栏目置顶.gif ? 隐藏按钮.gif ? 隐藏底栏.gif 先看第一个,是个挺常用的效果。...列表上面是三个栏目按钮和轮播图片,向上滚动时,按钮和图片一起向上,按钮周边区域颜色渐变,然后在到指定位置时(这里是盖住导航栏之后)按钮停住不动,周边颜色也完全变成导航栏的颜色,列表数据还可以继续滚动。...我要做的效果是栏目按钮得盖住导航栏,所以按钮要在-offsetY = menuBtnH - barHeight的时候才会停下。...感兴趣的同学可以看一下我单独为这个效果写的一个简单Demo,clone下来自己跑一下,琢磨琢磨应该就明白了。

    98240

    使用 UICollectionView 实现首页卡片轮播效果

    JUST DO IT 想到滚动,大家首先想到的肯定是用 UIScrollView + UIImageView 的方式来实现,但是 UICollectionView 给我们提供了更好的选择,因为它本身继承自...UIScrollView 然后又支持横向滚动,所以使用 UICollectionView 来实现横向滚动效果是最好不过的。...public var pageControlMargin: CGFloat = 10 // 分页控件大小,注意:当PageControlType不等于自定义类型时,只能影响当前分页控件的大小...,所以要加上控制的逻辑,当我们手动滚动查看图片的时候,定时器就失效,当我们手势拖拽动画结束的时候再重新开启定时器,实现代码如下: override func willMove(toSuperview newSuperview...,代码比较多(比较乱),有的同学可能看的不是很明白,那是因为我展示的代码只是局部的代码片段,主要是想给大家简单的讲述一下我的实现思路,因为用手机看公众号文章如果贴上所有的代码,对于大家的阅读体验是非常不好的

    2.1K20

    IOS5开发-UIScrollView添加单击事件的方法

    UIScrollView在开发中是一个非常常用的控件,UIScrollView具有水平、垂直滚动和缩放效果。但是尽然没有响应单击事件这个事件。而这个事件在日常的交互中是非常需要的。...比如当用于单击或轻触图片的某个位置时,给于一些交互性提示。 下面我将用例子说明一下如何给UIScrollView添加一个单击的响应。...这里说一下IOS的事件委托(Event Delegate)相对C#的事件委托还是不一样的,似乎实现起来没有C#方便。这里就不多说了。...但是这样的写法经过测试在IOS5.0以前的版本可以。但IOS5以后的(包括5)这不能往下传递,这里我也不知道为什么。希望有知道的朋友说一下。...本来我想用UITapGestureRecognizer来实现的,但是直接引发异常。不明白为什么UITapGestureRecognizer不能注册在UIScrollViews上。

    1.9K70

    深入理解RunLoop及在开发中的应用

    一.RunLoop定义 RunLoop:运行循环,简单的说就是处理线程事件和管理线程的一种机制。当子线程的事件结束时,runloop将会自动休眠,app主线程中的runloop处于一直唤醒状态。...; kCFRunLoopCommonModes 占位符,带有Common标记的字符串,比较特殊的一个mode; UIInitializationRunLoopMode 刚启动App时进入的第一个Mode...解决NSTimer在UIScrollView滑动时停止工作的问题 默认情况下,在滚动 tableView、UIScrollView 的时候,NSTimer会停止工作,这是因为在滚动时,RunLoop...例如:UIScrollView+ NSTimer演示滚动时,定时器停止工作 - (void)viewDidLoad { [super viewDidLoad]; UIScrollView...监控应用卡顿 有时我们在滑动列表时,感觉很卡,特别是列表上有很多图片要显示时,如何解决卡顿呢,因为我们现在加载图片用的SDWebImage,源码中已经处理了该问题,所以有时我们滑动列表时很顺畅。

    1.3K20

    TableView优化之快速滑动下的忽略加载

    普通的UIView绘制圆角时并不需要maskToBounds属性。也就是普通的视图圆角对卡顿没有影响。 既然有普通就有特殊:UIImageView和UILabel以及我还没有发现的=。...:(inout CGPoint *)targetContentOffset{ //取出滚动停止时展示的第一个cell的indexPath NSIndexPath *ip = [self indexPathForRowAtPoint...如何获取到TableView快速回到顶部的时间点?...但是可以看到作者并没有在这选择添加顶部可能要展示的cell进needLoadArr数组,那么当他滚动到顶部的时候我们要将顶部的cell进行直接更新,所以通过- scrollViewDidEndScrollingAnimation...version 1.1.3 滚动优化模式添加 高速忽略模式完成 懒加载模式完成 懒加载模式动画隐藏,更加平滑,修复刷新bug。

    1.7K33

    MyLayout&TangramKit 的重大升级!

    那就是当添加或者删除子视图时以及调整了某个子视图的位置和尺寸时就需要重新调整父视图的自适应约束设置。...为此当UIScrollView要和AutoLayout进行结合使用并实现滚动能力的话就不能直接将所有子视图都添加到UIScrollView中去, 而是需要中间建立一个容器视图,首先将容器视图添加到UIScrollView...在设置约束依赖时将容器视图的上下左右分别依赖UIScrollView视图的上下左右边界,如果需要上下滚动则将容器视图中的最底部子视图的底部边界依赖容器视图的底部边界。...2.UIScrollView的滚动 MyLayout&TangramKit对于处理和UIScrollView进行结合时进行特殊处理,当将一个布局视图添加到滚动视图时,布局系统内部会负责处理滚动视图的contentSize...要实现UIScrollView滚动时,只需要在一个滚动视图内添加一个布局视图,然后将所有其他子视图都添加到这个布局视图中去,这个和上面的AutoLayout的处理方式是一样的,最后将布局视图的尺寸自适应属性设置为

    2.1K20

    如何判断 ScrollView、List 是否正在滚动中

    比如在 SwipeCell[3] 中,需要在可滚动组件开始滚动时,自动关闭已经打开的侧滑菜单。遗憾的是,SwiftUI 并没有提供这方面的 API 。...: UIScrollView, willDecelerate decelerate: Bool)手指拖动结束后( 手指离开时 ),调用此方法在 SwiftUI 中,很多的视图控件是对 UIKit( AppKit...当没有事件时,Runloop 会进入休眠状态,而有事件时,Runloop 会调用对应的 Handler。Runloop 与线程是绑定的。...iOS 系统在 macOS 下的 eventTracking 模式中,该方案的表现并不理想屏幕中只能有一个可滚动控件由于任意可滚动控件滚动时,都会导致主线程的 Runloop 切换至 tracing...( 状态已变化为滚动中 ),保持手指处于按压状态并停止滑动,此方式会将此时视为滚动结束,而前两种方式仍会保持滚动中的状态直到手指结束按压IsScrolling我将后两种解决方案打包做成了一个库 —— IsScrolling

    3.8K40

    2018 - iOS 面试题汇总一般面试题BAT面试题

    那么面试题自然还是要看下的,在这我就把我手里收集到的面试题(朋友面试,网上收集等等)进行了汇总,希望可以帮到正在或者准备面试的你,同时我也可以自己在过一遍一般面试题 1.堆和栈的区别 1.内存管理范围...尽量减少不必要的透明 View。 尽量避免渐变效果、图片拉伸和离屏渲染。 当不同的行的高度不一样时,尽量缓存它们的高度值。...runloop是来管理线程的,当线程的runloop被开启后,线程会在执行完任务后进入休眠状态,有了任务就会被唤醒去执行任务。 runloop在第一次获取时被创建,在线程结束时被销毁。...height的时候回触发调用 一个UIScrollView滚动会触发调用 旋转screen会触发调用 改变一个UIView大小的时候会触发superView的layoutSubviews事件 直接调用...讲 讲你的使 场景以及使 时的注意事项 1.给扩展添加属性 2.替换系统方法的的实现 22.讲讲iOS事件响应链的原理 1、响应者链通常是由视图(UIView)构成的; 2、一个视图的下一个响应者是它视图控制器

    6.5K30

    iOS滚动视图UIScrollView使用方法

    = CGSizeMake(320, 460*10); //设置当滚动到边缘继续滚时是否像橡皮经一样弹回 self.scrollView.bounces = YES;...,布尔值确定滚动到最后位置时是否需要减速 - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL...)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView{ } //减速完毕停止滚动时调用,这里的读取contentOffset...ScrollView,在ScrollView中添加了两个Label,两个Label的开始y值不同所以第一个一开始就能看见,而第二个要向下滚动才能看见,如图: 由于截图时间来不及所以第二张图看不到滚动条了...,但是是滚动下来才能看得见: 基本方法代码中的注释已经讲的很清楚了,如果有不太清楚的可以自己试着调一下,也可以一起讨论讨论~ 可以在github上下载我的工程:https://github.com/Cloudox

    1.6K20

    你可能需要为你的 APP 适配 iOS 11

    我用iOS11的模拟器体验了一下Files这个APP的竖屏和横屏,如下图所示: ? ?...UIToolbar and UINavigationBar— Layout 在 iOS 11 中,当苹果进行所有这些新特性时,也进行了其他的优化,针对 UIToolbar 和 UINavigaBar 做了新的自动布局扩展支持...自从引入layout margins,当将一个view添加到viewController时,viewController会修复view的layoutMargins为UIKit定义的一个值,这些调整对外是封闭的...UIScrollView and UITableView的新特性 Scroll Views 如果有一些文本位于UI滚动视图的内部,并包含在导航控制器中,现在一般navigationContollers会传入一个...,当cell高度较小时,会只显示image,不显示title,当cell高度够大时,会同时显示image和title。

    1.7K60

    RDMA - IB SPEC 错误检测和处理以及IntelE810异步事件源码分析

    有关更多信息,请参阅第 1200 页的 17.2.8 自动路径迁移。每次正确确认数据包时,应重新加载重试计数器请求方错误检测 - 远端检测到的错误当响应者向请求者报告错误时,就会发生远程检测错误。...当请求者认为其原始请求消息已在结构中丢失,并重新发送请求消息时,就会发生重复确认消息。如果两条请求消息最终都到达响应者,响应者可能会为每条请求消息生成一条确认消息。...o9-162:此合规性声明已过时,已被 o9-162.1.1 取代:o9-162.1.1:如果 CA 实现可靠数据报服务,则应向请求者和(当涉及接收 WQE 时)响应者的客户端报告响应者 F 类错误。...C9-225:当 CQ 无法访问或已满,并且尝试完成 WQE 时,会发生响应者 G 类错误。受影响的 QP 应移至错误状态,并生成附属异步错误,如第 692 页 11.6.3.2 附属异步错误中所述。...当响应者收到带有 Invalidate 的 SEND 请求(最后带有 Invalidate 的 SEND 或仅带有 Invalidate 的 SEND)时,如果 IETH 中包含无效的 R_Key,则会发生响应者

    15820

    你可能需要为你的 APP 适配 iOS11

    我用iOS11的模拟器体验了一下Files这个APP的竖屏和横屏,如下图所示: (command+向左的箭头让模拟器横屏) 横屏时,在iPhone上,tab上的图标较小,tab bar较小,这样垂直空间可多放置内容...5、UIToolbar and UINavigationBar— Layout 在 iOS 11 中,当苹果进行所有这些新特性时,也进行了其他的优化,针对 UIToolbar 和 UINavigaBar...自从引入layout margins,当将一个view添加到viewController时,viewController会修复view的的layoutMargins为UIKit定义的一个值,这些调整对外是封闭的...来改变safeAreaInsets的值,当你的viewController改变了它的safeAreaInsets值时,有两种方式获取到回调: 三、UIScrollView and UITableView...滑动操作这里还有一个需要注意的是,当cell高度较小时,会只显示image,不显示title,当cell高度够大时,会同时显示image和title。

    2.5K00

    View编程指南(三)

    为了防止这种情况发生,当您隐藏它时,您应该强制您的view退出第一个响应者状态。 如果要为view的可视化转换为隐藏(或相反),您必须使用view的alpha属性进行动画处理。...每个图块代表可滚动内容的一部分。当滚动事件发生时,根view调用其setNeedsLayout方法来启动布局更改。其layoutSubviews方法然后根据发生的滚动量重新定位平铺view。...有关处理事件的信息,请参阅iOS事件处理指南。 当用户与滚动view交互时,大的可滚动区域可能会隐藏并显示切片子view。...有关支持可滚动内容的更多信息,请参阅Scroll View Programming Guide for iOS。 当键盘出现时,您可以重新定位或调整view的大小,使其不会位于键盘下方。...当触摸事件发生时,window将相应的事件对象分派到发生触摸的view。如果你的view对一个事件不感兴趣,它可以忽略它,或者把它传递给响应者链,由另一个对象处理。

    1.8K30
    领券