View Controller生命周期介绍:何时使用viewDidLayoutSubviews
作为iOS开发人员,我们总是担心自己缺乏知识,有时我们感到自己的技能不足。 我们对所有程序员说,您足够了解并且对自己耐心,因为您在日常工作或编码方面的嗜好继续保持卓越。
许多不同的开发人员总是会列出很多清单,说很多不同的事情,我们作为iOS开发人员首先应该知道。 但是多少钱够了? 今天,我们将专注于小事情,这些小事情将有助于使我们更加清晰地了解,以建立更牢固的基础。 我们将首先了解在新项目中每天使用的那些小代码。 我相信,小的小事情将使我们对大的事情有更大的了解。
在本教程中,我们将解决viewDidLoad
, viewDidAppear
和viewDidLayoutSubviews
之间的差异。 到本教程结束时,我们希望您比以前有更好的理解,并能够有效地使用上述方法。
我将尝试使用许多不同的方式来解释这些方法,因为有时很难理解一条语句,这是我们大多数人都理解的真正斗争。 您可能会看到重复的解释,我将尝试用不同的词来解释,以帮助您从不同的角度理解它。
您应该现在就熟悉该方法,或者至少对每次运行代码时的作用有一个大概的了解。 每次创建项目时,您都会看到此代码。 如果您不这样做,那完全没问题。
Apple在viewDidLoad
上给出的定义提到, 在将控制器的视图加载到内存之后调用该定义。 简而言之,它是第一个加载的方法。
您可能正在考虑在什么条件下可以充分利用此方法? 答案是,基本上您希望应用程序首先加载。 例如,您可能想要不同的背景颜色,而不是白色,则可能选择蓝色。
你们中有些人可能有使用这种方法的经验,并且对它有些了解,而有些人可能会发现这种新方法。 无论您的经验如何,您至少会在项目中使用其中之一。
苹果将其定义为“通知视图控制器其视图已添加到视图层次结构中。 换句话说,它基本上意味着在向用户显示屏幕时将调用此方法。
viewDidAppear
和viewDidLoad
之间的区别是,每次您在屏幕上着陆时都会调用viewDidAppear
,而viewDidLoad
仅在应用加载时被调用一次。 让我向您展示一个简单的实验,以帮助您了解其工作原理。
我将使用一种更现实的方式进行解释。 您将在viewDidAppear
看到,我通过添加300将viewDidAppear
的位置创建在屏幕外部,并且我正在使用动画将图像从屏幕外部移动到屏幕底部中心。
到目前为止,您应该已经了解并理解,通过上述示例, viewDidAppear
被重复调用,而viewDidLoad
仅被调用一次。
苹果对此表示了很好的解释,称其被通知来通知视图控制器其视图刚刚布置了其子视图 。 换句话说,每次更新,旋转或更改视图或其bounds change
时,都会调用viewDidLayoutSubviews
。 此处的关键字是界限变化。
但是要知道,使用viewDidLayoutSubviews
,它仅在对视图应用了所有自动布局或自动调整大小的计算之后才会发生。 这意味着,每次视图大小更改并且重新计算视图布局时,都会调用viewDidLayoutSubviews
方法。
每次构建应用程序时, viewDidLayoutSubviews
都会在viewDidLoad
之后发生,因为请记住, viewDidLayoutSubviews
是在应用布局计算时发生的。 然后,当您旋转应用程序时, viewDidLayoutSubviews
将再次发生,并且这仅适用于纵向到横向以及横向到纵向。 而不是从左景观到右景观。 您可以通过转到硬件>方向使用模拟器来玩它。
但是,让我们考虑一下。 真正的用途是什么? 下图说明了使用viewDidLayoutSubviews
的区别和结果。 您可以通过不实现viewDidLayoutSubviews
来尝试以下示例,并且可以看到如下所示的差异。 注意宽度的变化。
现在,我将通过几件事来说明该方法的过程。
- 这将打印出按钮的初始位置
- 这会将初始位置替换为新位置
- 这是将在屏幕上加载的按钮的坐标
viewDidLoad
加载的值 - 您会看到
viewDidLoad
位置被viewDidLoad
的值覆盖,并且当您将屏幕旋转到纵向时,您会看到宽度的变化
现在您可能想到的最后一个问题是,何时覆盖该方法。 我可以肯定,根据您以前看到的示例,您可能已经注意到viewDidLayoutSubviews
将始终覆盖viewDidLoad
。
最后,如果您仍然难以理解,我希望最后一个示例将向您展示viewDidLoad
, viewDidAppear
和viewDidLayoutSubviews
工作方式的比较。 甚至可以重新阅读一遍,亲身体验。 我已将代码上传到GitHub,以防您想查看和理解代码。
关于作者:
Kelvin Tan是一位自学成才的iOS移动开发人员,目前正在其网站www.daddycoding.com上积极编写教程。 他来自马来西亚,讲四种不同的语言。 如有任何疑问,请随时与他联系。
该文章首先在AppCoda.com上发布。
在社交媒体平台上关注我们:
面子书:facebook.com/AppCodamobile/
Twitter:twitter.com/AppCodaMobile
Instagram的:instagram.com/AppCodadotcom