“背后的秘密是什么?”;contentScaleFactor“;与CATiledLayer一起使用时的UIView?

“背后的秘密是什么?”;contentScaleFactor“;与CATiledLayer一起使用时的UIView?,uiview,ios4,uiscrollview,catiledlayer,Uiview,Ios4,Uiscrollview,Catiledlayer,您好 我正在开发一个受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

您好

我正在开发一个受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
及其功能的信息。在阅读了所有提到它的苹果文档之后,我搜索了谷歌,却没有找到它实际功能的确切答案

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

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

  • 当使用
    UIScrollView
    并将其设置为缩放时,比如说,我的contentView;contentView的所有子视图也正在缩放。这是怎么回事?
    UIScrollView
    修改了哪些属性以使视频播放器变得模糊并放大

  • TL;DR:UIScrollView的缩放功能“在引擎盖下”是如何工作的?我想了解它是如何工作的,这样我才能编写正确的代码


    任何提示和解释都将不胜感激!:)

    坐标以点而不是像素表示
    contentScaleFactor
    定义点和像素之间的关系:如果为1,则点和像素相同,但如果为2(如视网膜显示),则表示每个点都有两个像素

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

    使用
    CATiledLayer
    使用scalefactor 2可能会产生一些意外的结果。我猜,如果使用
    UIView
    a
    contentScaleFactor==2
    和层a
    contentScale==2
    会混淆系统,有时会使比例成倍增加。Scrollview可能也会发生类似的情况


    希望这能澄清一点

    苹果在iOS开发文档的“支持高分辨率屏幕”页面上有一个关于这一点的章节

    页面上写着:

    更新自定义绘图代码

    在应用程序中进行任何自定义绘图时,大多数情况下 您不需要关心基础架构的解决方案 屏幕。本机绘图技术自动确保 在逻辑坐标空间映射中正确指定的坐标 在基础屏幕上显示像素。然而,有时候,您可能需要 要知道当前比例因子是什么,以便渲染 内容正确。对于这些情况,UIKit、核心动画和 其他系统框架提供了绘制图形所需的帮助 没错

    如果需要,可以通过编程方式创建高分辨率位图图像 当前使用UIGraphicsBeginImageContext函数创建 位图,您可能需要调整代码以考虑比例因子 账户UIGraphicsBeginImageContext函数始终创建 比例因子为1.0的图像。如果基础设备具有 在高分辨率屏幕上,使用此功能创建的图像可能不会 渲染时显示为平滑。创建具有比例因子的图像的步骤 除1.0之外,请使用UIGraphicsBeginImageContextWithOptions 相反使用此功能的过程与 UIGraphicsBeginImageContext函数:

  • 调用UIGraphicsBeginImageContextWithOptions创建位图 上下文(使用适当的比例因子)并将其推到 图形堆栈
  • 使用UIKit或核心图形例程绘制 形象
  • 调用UIGraphicsGetImageFromCurrentImageContext以获取位图的 内容
  • 调用UIGraphicsSendImageContext从堆栈中弹出上下文
  • 例如,下面的代码片段 创建200 x 200像素的位图。(像素的数量为 通过将图像大小乘以比例来确定 系数。)


    请参见此处:

    注意,将0.0作为刻度传递将导致UIGraphicsBeginImageContextWithOptions:使用设备主屏幕的contentScaleFactor。在我看来,这是最容易的选择,以充分利用您所使用的任何分辨率设备。这将自动为“正常”设备使用1.0,为视网膜设备使用2.0。很好,不容易!很好的回答,这里是一个最新的总结和要点,比例因子和分辨率
    UIGraphicsBeginImageContextWithOptions(CGSizeMake(100.0,100.0), NO, 2.0);