19

问候,

我正在开发一个受 iOS SDK 附带的“ZoomingPDFViewer”示例启发的应用程序。在某个时候,我发现了以下代码:

// to handle the interaction between CATiledLayer and high resolution
// screens, we need to manually set the tiling view's 
// contentScaleFactor to 1.0. (If we omitted this, it would be 2.0 
// on high resolution screens, which would cause the CATiledLayer 
// to ask us for tiles of the wrong scales.)
pageContentView.contentScaleFactor = 1.0;

我试图更多地了解contentScaleFactor它以及它的作用。在阅读了所有提到它的 Apple 文档后,我搜索了谷歌,但从未找到它实际作用的明确答案。

以下是一些我很好奇的事情:

  1. 在绘制 UIView/CALayer 的内容时,这似乎contentScaleFactor对图形上下文有某种影响。这似乎与高分辨率显示器(如 Retina 显示器)有关。contentScaleFactor真正有什么样的影响?

  2. 当使用 aUIScrollView并将其设置为缩放时,比如说我的contentViewcontentView的所有子视图也在缩放。这是如何运作的?哪些属性会UIScrollView修改以使视频播放器变得模糊和放大?

TL;DR:UIScrollView 的缩放功能是如何“在后台”工作的?我想了解它是如何工作的,以便编写正确的代码。

任何提示和解释都非常感谢!:)

4

2 回答 2

7

坐标以点而不是像素表示。contentScaleFactor定义点和像素之间的关系:如果是1,点和像素是一样的,但是如果是2(就像retina 显示的那样),则意味着每个点都有两个像素。

在普通绘图中,使用点意味着您不必担心分辨率:在 iphone 3(scaleFactor 1)和 iphone4(scaleFactor 2 和 2x 分辨率)中,您可以使用相同的坐标和绘图代码。但是,如果您正在绘制图像(直接,作为纹理......)并且仅使用法线坐标(点),则您不能相信像素到点的映射是 1 比 1。如果这样做,那么每个像素如果 scaleFactor 为 2(x 方向为 2,y 方向为 2),图像将对应 1 个点但 4 个像素,因此图像可能会变得有点模糊

使用比例因子 2与CATiledLayer您合作可能会产生一些意想不到的结果。我猜想拥有UIViewacontentScaleFactor==2和层 acontentScale==2会使系统感到困惑,有时还会使比例倍增。Scrollview 可能会发生类似的情况。

希望这能澄清一点

于 2011-08-20T08:32:07.533 回答
2

Apple 在 iOS 开发文档的“支持高分辨率屏幕”页面上有一个关于此的部分。

该页面说:

更新您的自定义绘图代码

当您在应用程序中进行任何自定义绘图时,大多数时候您不需要关心底层屏幕的分辨率。本机绘图技术自动确保您在逻辑坐标空间中指定的坐标正确映射到底层屏幕上的像素。但是,有时您可能需要知道当前的比例因子是多少才能正确呈现您的内容。对于这些情况,UIKit、Core Animation 和其他系统框架提供了正确绘制所需的帮助。

以编程方式创建高分辨率位图图像 如果您当前使用 UIGraphicsBeginImageContext 函数来创建位图,您可能需要调整代码以将比例因子考虑在内。UIGraphicsBeginImageContext 函数始终创建比例因子为 1.0 的图像。如果底层设备具有高分辨率屏幕,则使用此功能创建的图像在渲染时可能看起来不那么平滑。要创建比例因子不是 1.0 的图像,请改用 UIGraphicsBeginImageContextWithOptions。该函数的使用过程与 UIGraphicsBeginImageContext 函数的使用过程相同:

  1. 调用 UIGraphicsBeginImageContextWithOptions 创建位图上下文(具有适当的比例因子)并将其推送到图形堆栈上。
  2. Use UIKit or Core Graphics routines to draw the content of the image.
  3. Call UIGraphicsGetImageFromCurrentImageContext to get the bitmap’s contents.
  4. Call UIGraphicsEndImageContext to pop the context from the stack.

For example, the following code snippet creates a bitmap that is 200 x 200 pixels. (The number of pixels is determined by multiplying the size of the image by the scale factor.)

UIGraphicsBeginImageContextWithOptions(CGSizeMake(100.0,100.0), NO, 2.0);

See it here: Supporting High-Resolution Screens

于 2011-10-25T11:34:44.890 回答