注:本文同步发布于微信公众号:stringwu的互联网杂谈记一次 contentInsetAdjustmentBehavior 引发的bug

1 背景

项目中使用到了UILable来展示相关的文本内容,但内容的大小不确定,有可能会超过屏幕的大小,因此需要在外层嵌套一个UIScrollView来保证内容可以被完全展现给用户,在UILabel确定相关的高度后,再通过设置UIScrollViewcontentSize 来限定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)
..............
}

注释掉这一行代码后,发现问题消失了,但由于没有设置scrollviewcontentSize,整体scrollView没有办法滚动了。这不科学啊,这个只是用来设置可滚动范围的接口啊,难道是我设置的高度太多了?但在尝试设置了多个不同的高度后,发现都没有解决问题。让我有点怀疑人生了。

3.3 排查方向三

在前面排查的方向都没有办法解决问题时,我已经没有其他任何的思绪了,只能去翻阅scrollView的接口,查看是否有其他接口会影响到子View的位置情况,发现了一个属性contentInsetAdjustmentBehavior,这个属性是在iOS11以上的系统才有的,并且在官方文档里的解释就是“决定内容偏移量的调整行为”,它的类型为UIScrollView.ContentInsetAdjustment,主要有几个值:

  • automatic :自动调整
  • scrollableAxes: 只调整在可滚动方向的
  • never : 不调整
  • always : 在调整内容时,自己调整

并且在iOS 11以上的系统,该属性的默认值为always,也就是说在你调整它的contentSize时,系统会自动帮你调整子View的偏移量,这其实也解释了在排查方向二时出现的现象:调整了contenSize时,整体的偏移量会多出很多的问题。

4 最终解决方式

在经历了多个怀疑方向的排查后,终于排查到了真正的问题所有,最终是通过禁用scrollviewcontentInsetAdjustmentBehavior 属性来解决问题:

    if #available(iOS 11.0, *) {
scrollView.contentInsetAdjustmentBehavior = .never
}

真正修复问题的代码其实就只有一行,但排查到问题实际花费了我一天的时间,在学习iOS的道路还任重道远

记一次 contentInsetAdjustmentBehavior 引发的bug的更多相关文章

  1. SQL Server 字段类型 decimal(18,6)小数点前是几位?记一次数据库SP的BUG处理

    原文:SQL Server 字段类型 decimal(18,6)小数点前是几位?记一次数据库SP的BUG处理 SQL Server 字段类型 decimal(18,6)小数点前是几位? 不可否认,这是 ...

  2. Spring 循环引用(一)一个循环依赖引发的 BUG

    Spring 循环引用(一)一个循环依赖引发的 BUG Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.html) Spring 循环 ...

  3. 安卓微信overflow-x overflow-y引发的bug

    今天xgo文章图片页上线用微信扫页面发现一个bug,页面可以双击放大缩小. 找了半天原因,发现是图片描述设置了overflow-y引发的bug. 建议在微信场景里满屏显示不能滚动的页面里慎用overf ...

  4. QByteArray引发的bug

    QByteArray引发的bug 在接收UDP数据的函数里,有如下代码片段 if(0x10 == data.size() && 0xCA == (unsigned char)data. ...

  5. [BUG]自己的bug自己解,记一次在变量使用过程引发的bug

    [实现的功能要求]在短信编辑界面,将所有的emoji表情全部插入到编辑区域,其中表情共有5页,每遍历完一页时需要自动翻页重新获取表情并插入,在第5页中只有10个表情 下面先看看这段代码,大家能否看出有 ...

  6. 记一次解决CSS定位bug思路

    事因 网站中的遮罩层大都有一个问题,就是在这个遮罩层中滑动,里面的内容也会跟着滑动,我是这样想的,既然都有这个问题,干脆写一个通用的插件出来,省的每个还得单独处理.如果是单独处理这个问题是比较好解决的 ...

  7. 一个由public关键字引发的bug

    先来看一段代码: @Service @Slf4j public class AopTestService { public String name = "真的吗"; @Retrya ...

  8. 记一个界面刷新相关的Bug

    今天遇到一个比较有意思的bug, 这里简单记录下. Bug的症状是通过拖拉边框把我们客户端主窗口拖小之后,再最大化,会发现窗口显示有问题, 看起来像是刷新问题, 有些地方显示的不对了. 这里要说明的是 ...

  9. 一次关于使用status作为变量引发的bug及思考

    这个bug出现在一年前,当时自己大学还没毕业,刚刚进入一家公司实习.那个时候还没有用seajs或者requirejs那样的模块化管理的库,也没有用一个自执行的函数将要执行的代码包裹起来,于是bug就在 ...

  10. 公用表表达式(CTE)引发的改变执行顺序同WHERE条件顺序引发的bug

    以下模拟一下CTE出错 /*测试环境 Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64) Apr 2 2010 15:48:46 Copyr ...

随机推荐

  1. ClearCLIP:倒反天罡,删除两个组件反而可以提升密集预测性能 | ECCV'24

    来源:晓飞的算法工程笔记 公众号,转载请注明出处 论文: ClearCLIP: Decomposing CLIP Representations for Dense Vision-Language I ...

  2. Spring SPI、Solon SPI 有点儿像(Maven 与 Gradle)

    一.什么是 SPI SPI 全名 Service Provider interface,翻译过来就是"服务提供接口".基本效果是,申明一个接口,然后通过配置获取它的实现,进而实现动 ...

  3. My SQL 下载和安装图文解说

    一.下载My SQL 官网下载地址:https://downloads.mysql.com/archives/installer/ 选择需要下载的版本,点击download.本文选择下载的版本是8.0 ...

  4. git reset 之后切换到原来的commit

    git reset的语法: git reset [--hard|soft|mixed|merge|keep] [<commit>或HEAD] 作用:将当前分支reset到指定的commit ...

  5. C#中的Math.Round

    开发者为了实现小数点后 2 位的四舍五入,编写了如下代码, var num = Math.Round(12.125, 2); 代码非常的简单,开发者实际得到的结果是12.12, 这与其所预期的四舍五入 ...

  6. IPC-7093A-CN 中文 2020底部端子元器件(BTCs)设计和组装工艺的实施

    IPC-7093A 标准为实施底部端子元器件(BTCs)提供了基本的设计和组装指南.具体而言,IPC-7093A 提供了与 BTCs 相关的关键设计.材料.组装.检查.维修.质量和可靠性问题的指南. ...

  7. StarRocks 物化视图刷新流程及原理

    前段时间给 StarRocks 的物化视图新增了一个特性,那也是我第一次接触 StarRocks,因为完全不熟悉这个数据库,所以很多东西都是从头开始了解概念. 为了能顺利的新增这个特性(具体内容可以见 ...

  8. 离线快速LCA(最近公共祖先) Tarjan算法

    离线快速LCA(最近公共祖先) Tarjan算法 前言 对于 OIer 来说,LCA 一直是处理树上问题的好帮手,无论是倍增还是树剖都有着优秀的 \(\log n\) 的复杂度.不过由于我们(数据规模 ...

  9. Nuxt.js 应用中的 webpack:change 事件钩子

    title: Nuxt.js 应用中的 webpack:change 事件钩子 date: 2024/11/24 updated: 2024/11/24 author: cmdragon excerp ...

  10. Java线程:线程的调度-守护线程——Java线程:线程的调度-合并——Java线程:新特征-障碍器——Java线程:大总结

    Java线程:线程的调度-守护线程   守护线程与普通线程写法上基本么啥区别,调用线程对象的方法setDaemon(true),则可以将其设置为守护线程.   守护线程使用的情况较少,但并非无用,举例 ...