ios - 对象框架在运行时缩放,但保留恒定值,使得以编程方式放置项目变得困难/不准确

标签 ios objective-c storyboard autolayout uikit

我正在为运行 iOS 8 及更高版本的设备构建一个 iPhone 应用程序,因此该应用程序必须与 4S 之后的所有 iPhone 兼容。

首先,在 Storyboard文件中,我创建了一个与 4S 屏幕大小相同的 View 。在该 View 中,我添加了一个 3 行网格,每行 4 个矩形。我添加了 Autolayout 约束,目前一切都运行良好。没有与放错 View 或约束冲突等相关的错误或警告。矩形在所有 iPhone 模拟器上都能很好地缩放。

当我尝试以编程方式创建和放置按钮时,我的问题就来了。我的网格中的方 block 是需要放置这些按钮的占位符。因此,当我创建一个新按钮并设置它的框架时,我将它设置为等于网格上其中一个矩形的框架。当我在 4S 模拟器上运行该应用程序时,它工作正常,但在所有其他模拟器(具有更大的屏幕)上,按钮没有出现在正确的位置。

似乎正在发生的事情是,每个矩形在 Storyboard编辑器中都有一个设置的 X 和 Y 值,并且当应用程序在任何模拟器中运行时,X 和 Y 值保持不变,即使 View 本身正在缩放。

更清楚地说,假设插槽 #2 的 x 值为 150,y 值为 200。每当我尝试通过将按钮的框架设置为插槽 #2 的框架来将按钮放置在插槽 #2 中并且然后运行应用程序,按钮的 X 和 Y 值始终分别设置为 150 和 200,而不是缩放以补偿设备屏幕尺寸的变化。插槽 #2 本身可以正确缩放,但设置为缩放 #2 框架的按钮无论如何都被放置在 150/200。

有没有人经历过这种情况,如果有,您知道我如何让按钮的框架与屏幕上的其他元素一起缩放吗?

如果我没说清楚,请告诉我。也许我可以张贴一些图片来说明我的意思。

编辑:添加一些图片:

在 4S 模拟器上运行。该卡出现在它应该在网格中的位置 Image on the 4S Simulator. The card appears where it's supposed to in the grid

这是在 6+ 模拟器上。如您所见,如果我在 4S 模拟器上运行该卡,它的显示位置基本上与它完全相同。不过,当我创建它时,我将它的框架设置为等于网格上第二个正方形的框架。

On the 6+ Simulator. As you can see, the card appears basically exactly where it would if I were running it on the 4S simulator. When I created it, though, I set it's frame equal to the frame of the second square on the grid.

最佳答案

你需要使用自动布局来定位/调整大小,这样无论屏幕有多大,它们都会有相同的相对排列。 “设置框架”是自动布局的对立面。不要设置任何框架;始终使用自动布局。

或者您可以使用帧,但时间就变得至关重要。您需要等到 viewDidLayoutSubviews 之后,因为只有到那时网格才会具有它出现时的实际尺寸。如果您过早设置卡片的框架(例如在 viewDidLoad 中),您将使用 nib 网格大小,而不是运行时网格大小。

关于ios - 对象框架在运行时缩放,但保留恒定值,使得以编程方式放置项目变得困难/不准确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33990708/

相关文章:

ios - 如何在 Swift、SpriteKit 中将矩形附加到圆形并与其一起旋转

ios - 如何遍历结构的静态常量?

objective-c - 我们可以将标签栏放在顶部>吗?

ios - 如何像 Ola 应用程序一样在 Google map 上移动标记

iOS Xcode (swift) - 如何在 unwind segue 后执行代码

xaml - 通过绑定(bind)更改 TextBox 文本时启动 Storyboard

ios - 通过向上滑动和向下滑动使 UIView 出现和消失 - Swift

ios - UINavigationController 状态恢复(无 Storyboard)

ios - 在 iOS 6 中无法使用相机扫描 PDF 417 条码

ios - 使用 Storyboard发送到实例的无法识别的选择器