当我在模拟器中运行我的应用程序时,故事板预览选择手机的高度和重量仍然可以得到。
不应该选择哪种模拟器?
例如: 故事板预览,选择iPhoneSE,然后选择图像视图
体重= 96
高度= 92
故事板预览,选择iPhone8,然后选择图像视图
体重= 112.5
高度= 108.5
但是当我进行情节提要预览时,无论选择哪种iPhone 8,iPhoneX ...,都选择iPhoneSE和模拟器...
体重= 96
高度= 92
为什么?
当我选择不同的故事板预览时,最奇怪的是同一台模拟器,我得到了不同的大小...
print(self.img.frame.height)
print(self.img.frame.width)
答案 0 :(得分:0)
如果添加了leading, trailing, top and bottom
约束,则将在不同的屏幕尺寸上获得不同的imageView尺寸,并且如果希望imageView在每个屏幕上都具有固定的尺寸,则可以使用centerX
和{ {1}}定位约束,并添加恒定的宽度和高度
示例1
示例2
添加imageView的宽度和高度
添加centerX和centerY约束
说明
在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 }}方法。