记一次 contentInsetAdjustmentBehavior 引发的bug
注:本文同步发布于微信公众号:stringwu的互联网杂谈记一次 contentInsetAdjustmentBehavior 引发的bug
1 背景
项目中使用到了UILable来展示相关的文本内容,但内容的大小不确定,有可能会超过屏幕的大小,因此需要在外层嵌套一个UIScrollView来保证内容可以被完全展现给用户,在UILabel确定相关的高度后,再通过设置UIScrollView的contentSize 来限定UIScrollView的滚动范围,保证全部内容可被浏览。
2 实现代码
2.1 伪代码
class CustomView: UIView {
let scrollView: UIScrollView
let titleLabel: UILabel = UILabel()
.......
required init() {
scrollView = UIScrollView.init(frame: CGRect.init(x: 0, y: 0, width: 350, height: screen.height ))
.........
self.addSubview(scrollView)
self.scrollView.addSubview(titleLabel)
}
.....
override func layoutSubviews() {
super.layoutSubviews()
//让titleLabel 距离顶部的距离为30
titleLabel.frame = CGRect.init(x: 0, y: 30, width: self.scrollView.frame.width - 5, height: 80)
titleLabel.textAlignment = NSTextAlignment.left
titleLabel.lineBreakMode = NSLineBreakMode.byWordWrapping
titleLabel.numberOfLines = 0
titleLabel.sizeToFit()
//设置scrollView的可滚动范围为 titleLabel的高度加上上面的距离30
scrollView.contentSize = CGSize(width: 0, height: titleLabel.frame.height + 30)
..............
}
............
}
2.2 现象
在按照2.1的方式实现之后,发现titleLabel距离顶部的距离远远不止30那么少,估计都有60了,根本没有达到实际想要的效果,而且不同机器上表现出来还不一样。

3 问题的分析
在发现实现的效果没有达到想要的效果后,就开始进入问题的分析排查阶段。
3.1 排查方向一
一开始就是怀疑自己代码实现有问题,可能是其他地方也设置了距离顶部的top值,因此就尝试缩减给予titleLable的初始的y值
//titleLabel.frame = CGRect.init(x: 0, y: 30, width: self.scrollView.frame.width - 5, height: 80)
titleLabel.frame = CGRect.init(x: 0, y: 10, width: self.scrollView.frame.width - 5, height: 80)
把titleLable的初始y值从30逐渐缩小于10,但测试发现不管怎样改这个初始的y值,实现的效果其实都差不多,根本没有办法缩小其距离顶部的距离。因此就排除了初始y值设置不对引起的距离过大的猜测。
3.2 排查方向二
在发现不是初始y值的影响后,就猜测大概率是父View的影响,仔细查看了父View的设置代码后,发现其并没有设置顶部Top的距离,一行行代码排查后,怀疑是ContentSize的设置引起的,故注释掉了设置ContentSize的那一行设置:
override func layoutSubviews() {
super.layoutSubviews()
...........
//设置scrollView的可滚动范围为 titleLabel的高度加上上面的距离30
//scrollView.contentSize = CGSize(width: 0, height: titleLabel.frame.height + 30)
..............
}
注释掉这一行代码后,发现问题消失了,但由于没有设置scrollview的contentSize,整体scrollView没有办法滚动了。这不科学啊,这个只是用来设置可滚动范围的接口啊,难道是我设置的高度太多了?但在尝试设置了多个不同的高度后,发现都没有解决问题。让我有点怀疑人生了。
3.3 排查方向三
在前面排查的方向都没有办法解决问题时,我已经没有其他任何的思绪了,只能去翻阅scrollView的接口,查看是否有其他接口会影响到子View的位置情况,发现了一个属性contentInsetAdjustmentBehavior,这个属性是在iOS11以上的系统才有的,并且在官方文档里的解释就是“决定内容偏移量的调整行为”,它的类型为UIScrollView.ContentInsetAdjustment,主要有几个值:
- automatic :自动调整
- scrollableAxes: 只调整在可滚动方向的
- never : 不调整
- always : 在调整内容时,自己调整
并且在iOS 11以上的系统,该属性的默认值为always,也就是说在你调整它的contentSize时,系统会自动帮你调整子View的偏移量,这其实也解释了在排查方向二时出现的现象:调整了contenSize时,整体的偏移量会多出很多的问题。
4 最终解决方式
在经历了多个怀疑方向的排查后,终于排查到了真正的问题所有,最终是通过禁用scrollview的contentInsetAdjustmentBehavior 属性来解决问题:
if #available(iOS 11.0, *) {
scrollView.contentInsetAdjustmentBehavior = .never
}
真正修复问题的代码其实就只有一行,但排查到问题实际花费了我一天的时间,在学习iOS的道路还任重道远
记一次 contentInsetAdjustmentBehavior 引发的bug的更多相关文章
- SQL Server 字段类型 decimal(18,6)小数点前是几位?记一次数据库SP的BUG处理
原文:SQL Server 字段类型 decimal(18,6)小数点前是几位?记一次数据库SP的BUG处理 SQL Server 字段类型 decimal(18,6)小数点前是几位? 不可否认,这是 ...
- Spring 循环引用(一)一个循环依赖引发的 BUG
Spring 循环引用(一)一个循环依赖引发的 BUG Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.html) Spring 循环 ...
- 安卓微信overflow-x overflow-y引发的bug
今天xgo文章图片页上线用微信扫页面发现一个bug,页面可以双击放大缩小. 找了半天原因,发现是图片描述设置了overflow-y引发的bug. 建议在微信场景里满屏显示不能滚动的页面里慎用overf ...
- QByteArray引发的bug
QByteArray引发的bug 在接收UDP数据的函数里,有如下代码片段 if(0x10 == data.size() && 0xCA == (unsigned char)data. ...
- [BUG]自己的bug自己解,记一次在变量使用过程引发的bug
[实现的功能要求]在短信编辑界面,将所有的emoji表情全部插入到编辑区域,其中表情共有5页,每遍历完一页时需要自动翻页重新获取表情并插入,在第5页中只有10个表情 下面先看看这段代码,大家能否看出有 ...
- 记一次解决CSS定位bug思路
事因 网站中的遮罩层大都有一个问题,就是在这个遮罩层中滑动,里面的内容也会跟着滑动,我是这样想的,既然都有这个问题,干脆写一个通用的插件出来,省的每个还得单独处理.如果是单独处理这个问题是比较好解决的 ...
- 一个由public关键字引发的bug
先来看一段代码: @Service @Slf4j public class AopTestService { public String name = "真的吗"; @Retrya ...
- 记一个界面刷新相关的Bug
今天遇到一个比较有意思的bug, 这里简单记录下. Bug的症状是通过拖拉边框把我们客户端主窗口拖小之后,再最大化,会发现窗口显示有问题, 看起来像是刷新问题, 有些地方显示的不对了. 这里要说明的是 ...
- 一次关于使用status作为变量引发的bug及思考
这个bug出现在一年前,当时自己大学还没毕业,刚刚进入一家公司实习.那个时候还没有用seajs或者requirejs那样的模块化管理的库,也没有用一个自执行的函数将要执行的代码包裹起来,于是bug就在 ...
- 公用表表达式(CTE)引发的改变执行顺序同WHERE条件顺序引发的bug
以下模拟一下CTE出错 /*测试环境 Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64) Apr 2 2010 15:48:46 Copyr ...
随机推荐
- Ubuntu中Conda建立环境和删除环境
网上说的很全面了,这里我把我遇到的一些问题和解决方案罗列出来,以便未来的学习和了解. 博客的好处就体现出来了,下次你再用这个东西,就直接打开你的博客照抄就行了,不用东搜西搜了,及其方便,这种碎片化的东 ...
- 基于Hadoop实现的对历年四级单词的词频分析(入门级Hadoop项目)
前情提要:飞物作者屡次四级考试未能通过,进而恼羞成怒,制作了基于Hadoop实现的对历年四级单词的词频分析项目,希望督促自己尽快通过四级(然而并没有什么卵用) 项目需求:Pycharm.IDEA.Li ...
- php几种常用的算法
1 <?php 2 3 // 选择排序 4 5 function select_sort($arr) 6 7 { 8 9 $count = count($arr); 10 11 for ($i ...
- CCF网站提供的资源
1. 电子刊物,如<CCF通讯> 实时更新:http://www.ccf.org.cn/dl/publications/ 过往期刊:http://history.ccf.org.cn/si ...
- KVM的基本使用
1. 虚拟化介绍 虚拟化是云计算的基础.简单的说,虚拟化使得在一台物理的服务器上可以跑多台虚拟机,虚拟机共享物理机的 CPU.内存.IO 硬件资源,但逻辑上虚拟机之间是相互隔离的. 物理机我们一般称为 ...
- 一文搞懂 ARM 64 系列: PACISB
1 PAC AMR64提供了PAC(Pointer Authentication Code)机制. 所谓PAC,简单来说就是使用存储在芯片硬件上的「密钥」,一个「上下文」,与「指针地址」进行加密计算, ...
- CodeForces - 1398C Good Subarrays
CodeForces - 1398C 挺简单的题目,但是没有想到还是整理一下 方法1 把每个元素都减1,那么满足题意的就是一段和的值是0,然后维护前缀和,如果发现这个前缀和之前出现过,就说明有满足题意 ...
- Windows 使用 Intel(R) Arc(TM) GPU 推理ONNX 模型
这不刚换了一个笔记本电脑,Thinkpad T14P,带有Intel ARC GPU,今天我们来尝试用这个GPU来推理ONNX模型. 环境安装 查阅了相关文档,最好使用py310环境,其他版本可能存在 ...
- []JSR 133 (Java Memory Model) FAQ
JSR 133 (Java Memory Model) FAQ Jeremy Manson and Brian Goetz, February 2004 内容列表 究竟什么是内存模型? 其它语言,像C ...
- AtCoder Beginner Contest 378
Contest Link 还得加练. A & B & C & D 不具备任何思维含量. Submission A Submission B Submission C Submi ...