ios - iOS 在运行时不正确的帧大小
问题描述
我有UIImageView
一个控制器的根视图,我将它设置为屏幕宽度的 90%,并给它一个纵横比作为设置尺寸的约束。
在代码中,我试图在运行时对 UIImageView 的大小做一些事情,但是当我得到 UIImageView 的frame.size.height
orframe.size.width
时,它们显然是错误的而且太小了。
起初我在访问大小,viewDidLoad()
之后我发现很多帖子建议在viewWillLayoutSubviews()
、viewDidLayoutSubviews()
或 viewWillAppear()
不幸的是,我已经尝试了所有这些,但这些上下文似乎都没有提供正确的价值。我怀疑它可能与自动布局有关,但我不太确定如何解决这个问题。任何关于为什么会这样的见解将不胜感激
解决方案
viewDidLoad
为时过早。此时,视图具有它们在情节提要中给出的框架。同上viewWillAppear
。
在viewWillLayoutSubviews
中,视图控制器的顶级视图具有正确的框架,但其后代没有。
在viewDidLayoutSubviews
中,视图控制器的直接子视图具有正确的帧,但更远的后代(“孙子”等)没有。
如果图像视图是视图控制器视图的直接子视图,那么它的框架在viewDidLayoutSubviews
.
如果图像视图是一个更远的后代,那么您无法在视图控制器中覆盖任何方法,该方法将在图像视图的框架更新后但在图像视图在屏幕上可见之前调用。在这种情况下,有两个选项:
创建一个自定义子类
UIView
作为图像视图的父视图。当 superviewlayoutSubviews
运行时,在它调用 之后super.layoutSubviews
,图像视图的框架是最新的。创建一个隐藏
UIView
的,它是视图控制器顶级视图的直接子视图。使用约束使这个隐藏视图的框架与图像视图的框架完全匹配。隐藏视图参与布局,所以当viewDidLayoutSubviews
被调用时,这个隐藏视图的框架是最新的,并且与图像视图的框架最终将是相同的(除了隐藏视图的框架在顶级视图的几何中,这可能不同于图像视图的超级视图的几何形状)。
推荐阅读
- java - 更有效的处理方法?
- java - 使用 Parcelable 有什么好处?
- html - 我可以在 CSS Grid 中用作主网格容器吗?
- javascript - 如何使用跨度标签附加速度控制Javascript onmousemove,因此每个附加跨度标签都没有空间
- registration - 具有低(且无法识别)特征的点云注册
- java - Android Java MVC结构
- spring-boot - 在非 spring-boot 应用程序中从 spring-boot-actuator 公开缓存端点
- asp.net-mvc - 带有 Javascript 变量的 MVC Url Helper
- sql - SQL Inner Join 组合结果中的行 - 结果太少
- c - 在 execve sys_call 中处理用户 argv 的问题