为什么键盘弹出时调用scrollRectToVisible方法不生效?
可能的原因及对应解决方案
- 坐标系转换错误
scrollRectToVisible方法要求传入的rect是基于scrollView自身坐标系的,你当前直接传入的blikCodeView.frame是该视图相对于它直接父视图的坐标。如果blikCodeView不是scrollView的直接子视图,传入的坐标就完全错误,scrollView无法定位到正确的位置。
解决方案:先做坐标系转换再执行滚动:
let targetRect = blikCodeView.convert(blikCodeView.bounds, to: scrollView) scrollView.scrollRectToVisible(targetRect, animated: true)
scrollView的contentInset未适配键盘高度
键盘弹出后会遮挡scrollView的底部区域,如果你没有将scrollView的contentInset.bottom和scrollIndicatorInsets.bottom设置为键盘高度,scrollView的可滚动范围不会包含被键盘遮挡的区域,自然无法滚动到被遮挡的视图位置。
解决方案:监听键盘弹出事件,拿到键盘高度后先更新scrollView的内边距,再执行滚动操作。调用时机或布局未更新
即使你是在键盘完全弹出的回调中执行,也可能存在布局未刷新的问题:如果使用AutoLayout布局,此时blikCodeView的frame可能还未更新为最新值,或者scrollView的布局还未同步。
解决方案:滚动前先触发布局刷新,或者将滚动逻辑放到主队列异步执行,等待当前布局周期结束:
view.layoutIfNeeded() DispatchQueue.main.async { scrollView.scrollRectToVisible(targetRect, animated: true) }
- scrollView基础属性配置错误
检查以下基础配置是否符合预期:scrollView.isScrollEnabled是否为truescrollView.contentSize的高度是否足够容纳blikCodeView的位置,若contentSize小于scrollView的可视高度,scrollView本身就无法滚动- scrollView的上下约束是否正确,没有被键盘直接遮挡整个视图
内容的提问来源于stack exchange,提问作者kunass2
相关产品推荐
相关产品推荐

