缩放自定义UIView大小没有AutoLayout效果

时间:2017-03-20 01:36:30

标签: ios swift uiview scaling

问题

如何使用用户定义的大小创建UIView,然后按比例放大/缩小以适合作为UIViewController的子视图?

使用例

我正在开发一个主要专注于在连接到iOS设备的外部显示器上显示自定义UIView的应用程序。应创建自定义视图以本机适合外部监视器。假设外部显示器的分辨率为1920x1080。将创建UIView以适应该大小,然后自动布局将做到这一点。 - 太棒了!

通常,应用程序用户实际上无法看到外部监视器,因此应用程序的另一个重要部分是在iOS设备上提供外部监视器的表示。当然,这些小窗口的分辨率不会与外部显示器相同,只是创建另一个视图并将其粘贴在内部显示器上,因为AutoLayout不会产生相同的结果。

目标

我想知道如何以与外部显示器相同的尺寸编程创建另一个自定义视图实例(因此布局相同),然后 scale 查看上/下以填充a内部显示屏上的子视图。同样,内部显示器上的预览窗口与外部显示器上显示的内容相同也很重要。我知道可能会有一些缩放工件 - 这完全可以。

应用示例

可以在liveevent.software查看相关应用程序。我的问题是参考iPad屏幕上显示的外部显示器和外部显示器的预览。当然,我们已经有了这个工作,但我们正在添加更多功能,并且需要本地预览与运营商的外部预测完全相同,如果消息太长等等...

重要说明

被缩放的UIView不包含任何手势识别器或需要用户交互的其他项目。只是几个UILabels。

问题

当前的“工作”解决方案是创建自定义视图的两个实例,并根据自动布局进行调整。虽然这会粗略估计外部显示的内容,但这并不准确。例如,文本可能会破坏iOS预览窗口中的一行,但不会破坏实际外部显示(因为它的尺寸较大)。

3 个答案:

答案 0 :(得分:2)

取决于"实时"你需要这个,也许你可以拍摄外部UIView的快照?这将产生UIImage,您可以将其分配给内部显示屏上的UIImageView。图像尺寸可以设置为您想要的任何值,UIImageView将处理缩放。

有关如何拍摄视图快照的很多好答案,例如:this one.

答案 1 :(得分:2)

不是创建视图的另一个实例并使用资源来相应地更新用户操作,而是使用snapshotView方法在任何更改时创建视图的快照。在性能方面,snapshotView非常有效,并返回其内容不可编辑的视图对象。这意味着您可以根据希望在第二个屏幕上显示当前视图的精确镜像来缩放它。

SnapshotView方法可能使用gpu资源,让你的CPU可以在第二个屏幕上自由拥有高帧率和性能。

答案 2 :(得分:0)

您可以创建一个具有相同大小的完全重复的UIView,然后使用CGAffineTransform将其缩放到新的大小(假设您知道它需要适合的尺寸)

CGAffineTransform是GPU加速操作,因此性能应该是最佳的。

唯一需要注意的是(as Documentation warns),它可能无法与Autolayout很好地配合,因为frame属性将被视为无效。您将只有边界和中心来操纵视图。