缩放 UIView 及其所有子项

Posted

技术标签:

【中文标题】缩放 UIView 及其所有子项【英文标题】:Scale UIView and all its children 【发布时间】:2013-01-19 19:12:29 【问题描述】:

我有一个带有大约 50 个 UIButton 的 UIView。所有按钮的位置都以像素为单位,相对于我的主 UIView 的左上角。

视图中使用的所有(背景)图像均以更高分辨率提供。当我将我的应用从 iPhone 移植到 iPad 时,我想增加 UIView 的有效像素大小。

现在我正在寻找一种将整个 UIView 放大 2 倍的方法。在不破坏内部元素位置的情况下是否可能?

仅供参考,UIView 是在 XCode 中的 NIB 文件中设计的。但我不介意它是否可以通过编程方式完成。

【问题讨论】:

如您希望按钮保持在其原始位置或与父视图一起拉伸? 50 个按钮?听起来像是最终用户的噩梦。你想做一个计算器吗? 按钮也必须升级。所以他们的宽度和高度必须加倍,因为他们的父母也加倍。 -- 别担心,这不是用户的噩梦。该应用程序显示了一个体育场,您可以单击每个区域并从那里获取图像。 只需将按钮框架的宽度和高度设置为新值 - 这不会影响按钮的原点。 不确定这是不是你想要的self.view.transform = CGAffineTransformScale(CGAffineTransformIdentity, 2, 2); 【参考方案1】:

对于 Swift 4.0,缩放 2 倍:

myView.transform = CGAffineTransform.identity.scaledBy(x: 2, y: 2)

【讨论】:

【参考方案2】:

Swift 3.0 更新

self.view.transform = CGAffineTransform(scaleX: 2.0, y: 2.0)

【讨论】:

【参考方案3】:

我最终使用了

self.view.transform = CGAffineTransformScale(CGAffineTransformIdentity, 2, 2);

它允许我保留在 Interface Builder 中创建的设计。

不幸的是,在这种情况下,图像的清晰度会受到影响,但与以编程方式编写整个设计脚本相比,这是一个很小的代价。

【讨论】:

稍微简单一点:self.view.transform = CGAffineTransformMakeScale(2, 2); 这最终会如何影响视图的框架?在窗口太窄而无法容纳完整菜单的多任务处理的情况下,我有兴趣使用相同的方法来缩小菜单。转换属性的文档包含以下警告。 “如果此属性不是恒等变换,则框架属性的值未定义,因此应被忽略。” developer.apple.com/library/ios/documentation/UIKit/Reference/… 只是在这里吐口水,还没试过,但也许与其直接使用transform属性,不如在当前帧本身上使用CGRectApplyAffineTransform,因此帧会相应更新,仍然可以信任在其他依赖它的逻辑中。 UIView 在应用缩放转换后没有居中。我有什么遗漏吗?我想在缩小 UIView 后将其居中。 斯威夫特 4:myView.transform = CGAffineTransform.identity.scaledBy(x: 2, y: 2)【参考方案4】:

您可以首先以编程方式创建这些按钮,例如使用CGRectMake 方法创建这些按钮,并将宽度和高度声明为 X 和 Y,如果 ipad 被检测到原点,它也应该分别改变,可能太近会导致重叠

编辑:这完全取决于你的逻辑,我也不确定

【讨论】:

确实如此,但我已经在NIB 的iPhone 应用程序中拥有了我的按钮。我希望有一个比现在以编程方式创建所有按钮更短的解决方案。 @andreas 我不确定是否有这样的解决方案可以分别调整大小,但据我所知,以编程方式创建总是会更好,因为您可以随时修改代码 我同意。我决定以图形方式进行操作的原因是完美对齐的难度。使用 Interface Builder 更容易。

以上是关于缩放 UIView 及其所有子项的主要内容,如果未能解决你的问题,请参考以下文章

使 UIImageView 及其 UIImage 按比例缩放而无需额外的填充

使用渐变缩放 UIView

不允许子视图随视图缩放?

在 UIView 内缩放图像而不改变边界?

UIView 中断约束的缩放

在方向更改时自动缩放 UIView 以按比例缩放以适合父视图