UIImageView在不同设备上保留情节提要“预览屏幕边界”-框架不会根据屏幕大小进行更新

时间:2018-11-07 04:27:48

标签: ios swift xcode autolayout

当我在模拟器中运行我的应用程序时,故事板预览选择手机的高度和重量仍然可以得到。

不应该选择哪种模拟器?

例如: 故事板预览,选择iPhoneSE,然后选择图像视图

体重= 96

高度= 92

故事板预览,选择iPhone8,然后选择图像视图

体重= 112.5

高度= 108.5

但是当我进行情节提要预览时,无论选择哪种iPhone 8,iPhoneX ...,都选择iPhoneSE和模拟器...

体重= 96

高度= 92

为什么?

当我选择不同的故事板预览时,最奇怪的是同一台模拟器,我得到了不同的大小...

print(self.img.frame.height)
print(self.img.frame.width)

2 个答案:

答案 0 :(得分:0)

如果添加了leading, trailing, top and bottom约束,则将在不同的屏幕尺寸上获得不同的imageView尺寸,并且如果希望imageView在每个屏幕上都具有固定的尺寸,则可以使用centerX和{ {1}}定位约束,并添加恒定的宽度和高度

  

示例1

image with adjustable width and height

  

示例2

添加imageView的宽度和高度

enter image description here

添加centerX和centerY约束

enter image description here

  

说明

centerY中,图片的宽度和高度将是动态的;在Example 1中,imageView的高度和宽度将是相同的,无论使用哪种设备进行显示

答案 1 :(得分:0)

我遇到了完全相同的问题,并且我认为在上面的描述中并没有很好地理解它。要重新创建它,请执行以下步骤:

设置:

1)在Xcode中启动一个新的“单视图应用”。我目前正在使用Xcode 10.2.1

2)进入情节提要,并添加带有某种backgroundColor的UIView对象,以使其可见

3)给此新视图一些自动约束,例如前导,尾随,centerY和纵横比为1:1。只要确保不给它固定的高度或宽度即可。

4)在ViewController.swift中,为此UIView添加IBOutlet变量(例如“ myView”)并进行连接,以便于引用。

5)在viewDidLoad()中,添加一个打印语句,以实现

print("Bounds of myView: \(myView.bounds)")

测试问题:

现在,回到界面生成器中,将预览或底部的“查看为”设置为“ iPhone SE”之类的内容。然后,在顶部选择模拟器的位置,还选择“ iPhone SE”。现在运行该应用。

在控制台中,您将看到带有视图边界的打印语句,并且一切在视觉上看起来都很好。

现在,将Interface Builder的预览“查看方式”选项更改为“ iPhone 8”之类的内容,但将模拟器选项保留在iPhone SE上 再次,在“ iPhone SE”模拟器中运行该应用程序。

就像以前一样,由于自动布局,外观上一切正常。但是,控制台中打印的边界信息是 different 。而是与“ iPhone 8”或在Interface Builder中选择用于预览的任何设备匹配。

举一个更加明显的例子,为Interface Builder选择类似iPad Pro的东西,然后再次在iPhone SE模拟器上运行它。再次从视觉上看一切正常,但控制台中的bounds信息已消失。它与Interface Preview绑定,而不与要测试的设备绑定。

当您编写代码时使用对象的边界信息时,这些问题会在没有固定宽度和高度的自动布局约束下出现。

解决方案:

ViewController.swift的{​​{1}}方法之后添加以下内容

viewDidLoad()

现在,无论我们在Interface Builder中使用哪种预览选项,模拟器都将在生命周期中的这一点记录正确的边界信息。

因此,对于任何在代码中使用override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() print("Bounds of myView in viewDidLayoutSubviews: \(myView.bounds)") } bounds属性的项目,例如本示例中的视图,都应将任何限制边界的代码置于{{1 }}方法。