我有一个Swift应用程序,它将UIImageView设置为屏幕的一部分大小(使用自动约束设置到它上面的边距和控件),我使用ImageView的高度和宽度值创建3个额外的UIImageViews以编程方式将它们放在原始图像的顶部。我正在建立一个讲台,并在讲台顶部放置三个适当位置的图像。然后,我通过创建常量let conImageHeight = 0.4 * self.imgPodium.frame.height
来计算每个附加图像的高度和宽度。但是,我无法获得原始图像的可靠高度和宽度。
最初我使用的self.imgPodium.bounds.height
非常适合iPhone 6模拟器屏幕尺寸,但是当我尝试在iPad模拟器上运行该应用程序时,它保留了iPhone的大小值。图像本身改变了大小,但当我使用println()
bounds
高度和宽度时,我得到了iPhone图像的值。
然后我改变并使用self.imgPodium.frame.height
,但这并没有改变任何事情。
在通过自动约束定位后,是否有更好的方法来获取UIImageView(或任何控件)的高度和宽度?
感谢。
我已经看过的问题但没有帮助:
Change UIImageView size and position programmatically in Swift
how to check screen size of iphone 4 and iphone 5 programmatically in swift
UIImageView Bounds, Frame
Cocoa: What's the difference between the frame and the bounds?
How to resize an UIImageView (swift)
答案 0 :(得分:4)
在viewDidLoad
中,子视图已加载并初始化但尚未布局。因此,例如,他们的frame
属性尚无效,可能是在首先设计UI时在Xcode中设置的属性 - 但是不可靠。您应该在可以确定布局已经发生的地方进行自定义布局:例如viewWillLayoutSubviews
或viewDidLayoutSubviews
。当布局以某种方式需要改变时,也会调用这两种方法。在viewDidAppear
中,布局已经完成,因此您也可以进行布局。但是,当布局因界面旋转而发生变化时,此代码将不会被调用。并且在呈现的viewController再次被解雇后它将被调用。 (不是你想要的)。
在这两种情况下:在viewDidLoad
中设置创建新的imageView并在viewWillLayoutSubviews
或viewDidLayoutSubviews
进行布局!