问候,
我正在开发一个受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文档的所有内容之后,我搜索了Google并且从未找到确切的答案。
以下是一些我很好奇的事情:
当绘制UIView的/ CALayer内容时,似乎contentScaleFactor
对图形上下文有某种影响。这似乎与高分辨率显示器(如Retina显示器)有关。 contentScaleFactor
真正具有什么样的影响以及影响是什么?
使用UIScrollView
并将其设置为缩放时,假设我的 contentView ; contentView 的所有子视图也正在缩放。这是如何运作的? UIScrollView
修改哪些属性以使视频播放器变得模糊和扩展?
TL; DR:UIScrollView的缩放功能如何在“引擎盖下”工作?我想了解它是如何工作的,所以我可以编写正确的代码。
任何提示和解释都非常感谢! :)
答案 0 :(得分:7)
坐标以点而非像素表示。 contentScaleFactor
定义了点和像素之间的关系:如果它是1,则点和像素是相同的,但如果它是2(如视网膜显示),则表示每个点都有两个像素。
在普通绘图中,使用点意味着您不必担心分辨率:在iphone 3(scaleFactor 1)和iphone4(scaleFactor 2和2x分辨率)中,您可以使用相同的坐标和绘图代码。但是,如果您正在绘制图像(直接,作为纹理......)并且只使用法线坐标(点),则您不能相信像素到点的地图是1到1.如果您这样做,那么每个像素都是如果scaleFactor为2(x方向为2,y为2),图像将对应1点但对应4像素,因此图像可能会变得有点模糊
使用CATiledLayer
你可以使用scalefactor 2获得一些意想不到的结果。我想让UIView
一个contentScaleFactor==2
和一个contentScale==2
层混淆了系统,有时候乘以比例。 Scrollview可能会发生类似的情况。
希望这有点澄清
答案 1 :(得分:2)
Apple在iOS开发文档中的“支持高分辨率屏幕”页面上有关于此的部分。
页面上写着:
更新自定义绘图代码
在大多数情况下,在应用程序中进行任何自定义绘图时 你不应该关心底层的解决方案 屏幕。原生绘图技术自动确保 您在逻辑坐标空间映射中正确指定的坐标 到底层屏幕上的像素。但是,有时您可能需要 知道目前的比例因子是什么,以呈现你的 内容正确。对于那些情况,UIKit,Core Animation和 其他系统框架提供了绘图所需的帮助 正确。
以编程方式创建高分辨率位图图像如果您 目前使用UIGraphicsBeginImageContext函数来创建 位图,您可能需要调整代码以将比例因子纳入其中 帐户。 UIGraphicsBeginImageContext函数始终创建 比例因子为1.0的图像。如果底层设备有 高分辨率屏幕,使用此功能创建的图像可能不会 渲染时显得平滑。使用比例因子创建图像 除1.0之外,使用UIGraphicsBeginImageContextWithOptions 代替。使用此功能的过程与使用此功能的过程相同 UIGraphicsBeginImageContext函数:
- 调用UIGraphicsBeginImageContextWithOptions以创建位图 上下文(具有适当的比例因子)并将其推上 图形堆栈。
- 使用UIKit或Core Graphics例程绘制内容 图像。
- 调用UIGraphicsGetImageFromCurrentImageContext获取位图 内容。
- 调用UIGraphicsEndImageContext从堆栈中弹出上下文。
醇>例如,以下代码段 创建一个200 x 200像素的位图。 (像素数是 通过将图像的大小乘以比例来确定 因素。)
UIGraphicsBeginImageContextWithOptions(CGSizeMake(100.0,100.0), NO, 2.0);