缩放自定义 UIView 大小 w/o AutoLayout 效果

Scale custom UIView size w/o AutoLayout effects

问题

如何创建具有用户定义大小的 UIView,然后缩放 up/down 以适应 UIViewController 的子视图?

用例

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

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

目标

我想知道如何以与外部显示器相同的尺寸(因此布局相同)以编程方式创建另一个自定义视图实例,然后 scale 该视图 up/down 填充内部显示的子视图。同样,重要的是内部显示器上的预览 window 与外部显示器上显示的内容相同。我知道可能存在一些缩放伪像 - 完全没问题。

应用示例

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

重要提示

正在缩放的​​ UIView 不包含任何手势识别器或其他需要用户交互的项目。只有几个 UILabel。

问题

当前的 "working" 解决方案是创建自定义视图的两个实例,并让它们根据自动布局进行调整。虽然这会粗略估计外部显示的内容,但并不准确。例如,文本可能会在 iOS 预览 window 上换行,但不会在实际的外部显示器上换行(因为它的尺寸更大)。

根据您 "real time" 的需要,也许您可​​以拍摄外部 UIView 的快照?这将导致 UIImage,您可以将其分配给内部显示器上的 UIImageView。图像尺寸可以设置为任何你想要的,UIImageView 会负责缩放。

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

您可以创建一个完全相同大小的 UIView 副本,然后使用 CGAffineTransform 将其缩放到新大小(前提是您知道它需要适应的尺寸)

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

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

我不会创建视图的另一个实例并使用资源根据用户操作更新两者,而是使用 snapshotView 方法在任何更改时创建视图的快照。就性能而言,snapshotView 非常高效,而 returns 是一个内容不可编辑的视图对象。这意味着您可以根据需要缩放它,以便在第二个屏幕上拥有您当前视图的精确镜像。

SnapshotView 方法可能会使用 gpu 资源,让您的 CPU 可以自由地在第二个屏幕上获得高帧率和性能。