问题标签 [catiledlayer]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1721 浏览

iphone - 如何优化包含带有 CATiledLayer 层的子视图的 UIView 的绘制

我在包含许多 UIView 子视图的 UIScrollView 中有一个 UIView。这些子视图中的每一个都有一个 CATiledLayer 层。此外,我还有一个放大镜功能,可以在其上下文中绘制容器 UIView(以及所有子视图)。相关代码:

这是放大镜的 drawRect 方法:

这是绘制子视图的容器 UIView 的 drawInContext:forRect 方法:

最后这是带有 CATiledLayer 的子视图的 drawRect 方法:

现在,一切都按照我的预期工作,但是当放大镜打开并移动时,应用程序的速度明显变慢。问题是每次移动放大镜视图时,都会调用它的 drawRect 方法(因此它可以更新放大的内容),随后调用容器 UIView 的 drawInContext 方法等等......导致所有 CATiledLayers 更新他们的图像每次移动放大镜时瓷砖。

如您所见,我试图在放大镜的上下文中绘制容器视图的较大部分,但这是我卡住的地方。我看不出如何“缓冲”该容器视图的大部分,因此当移动放大镜时,仅当要重绘的矩形超出“缓冲”矩形时才会重绘子视图。

对不起,如果代码是草率/新的 - 我在中间并寻求一些帮助。

谢谢!

0 投票
2 回答
671 浏览

objective-c - 使用 CATiledLayer 绘制 Core Data 实体信息时如何正确处理线程

我正在考虑如何将一个非常大的核心数据树结构的绘图卸载到 CATiledLayer。CATiledLayer 似乎很棒,因为它在后台线程上执行绘图,然后在绘制时淡入平铺。但是,由于绘图信息来自设计上不是线程安全的 Core Data 上下文,因此我遇到了绘图代码需要访问 CD 上下文的竞争条件问题。

通常,如果我需要使用 Core Data 执行后台任务,我会在后台线程中创建一个新上下文并重用现有模型和持久存储协调器,以防止线程问题。但是 CATiledLayer 在内部完成所有线程,所以我不知道何时创建上下文,并且需要某种上下文共享,否则我无法将正确的实体传递给 CATiledLayer。

有没有人建议我如何处理这种情况?

干杯,埃里克-保罗。

0 投票
1 回答
245 浏览

ios - 检测 UIScrollView 和 CATilerLayer 中的触摸

我如何检测在 ScrollView 中呈现的我的 pdf 的触摸(x,y)。要清楚:我想要 pdf 的 x,y 而不是屏幕。

希望有人知道这个...

谢谢。

0 投票
1 回答
1284 浏览

objective-c - 包装核心文本/核心图像的 Objective-C 库?

使用 CATiledLayer 绘制大型可滚动内容在我的应用程序中效果很好。使用 C 中的 Core Text 和 Core Image API 绘制图像和多行文本的效果不太好。

我有强烈的感觉,我正在尝试重新发明轮子,围绕 C 函数编写我自己的 Objective-C 包装类,使用etcCGContextShowTextAtPoint镜像所有内容等等。CGContextSetTextMatrix(context, CGAffineTransformMakeScale(1, -1))

我不能使用 UIKit 的上下文绘制方法,因为它们会由于 CATiledLayer 中的并发背景绘制而导致竞争条件崩溃。

有哪些 Objective-C 库已经存在,它们包装了 Core Text 和 Image 函数以便在后台上下文中使用?

干杯,EP。

更新:现在事情的进展方式,除了广泛描述 CoreText的 Apple Docs 之外,我还将满足于书籍或在线资源的提示。

0 投票
1 回答
2932 浏览

iphone - 在 CATiledLayer -setNeedsDisplay 之后并非所有图块都重绘

我的观点有一个CATiledLayer。视图控制器具有自定义缩放行为,因此-scrollViewDidEndZooming每个图块都需要重绘。但是,即使-setNeedsDisplay每次缩放后都在图层上调用,但并非所有图块都被重绘。这导致视图有时在缩放后看起来不正确。(应该只出现在 1 个图块中的东西出现在多个地方)。它通常会在另一次缩放后自行纠正。

这是相关的代码。updatedRects用于测试——它存储请求绘制的唯一矩形-drawLayer

画布视图.h:

画布视图.m:

MyViewController.m:

对此进行测试时,我总是在缩放后一直滚动到整个视图,以确保看到每个图块。每当视图看起来错误时,预测的“下一个更新的矩形数”大于下一次调用-updateCanvas. 什么会导致这个?

编辑:

这是可视化问题的更好方法。每次updateCanvas调用时,我都会让它改变绘制瓷砖的背景颜色并记录它被调用的时间——颜色和时间存储在canvasView. 在每个图块上绘制图块的矩形、图块沿 x 轴的索引、设置背景颜色的时间(秒)和绘制图块的时间(秒)。如果一切正常,所有的瓷砖应该是相同的颜色。相反,这是我有时会看到的:

颜色不匹配的瓷砖的屏幕截图 颜色不匹配的瓷砖的屏幕截图

缩小后我似乎只看到错误的结果。该问题可能与以下事实有关scrollViewDidEndZooming,因此updateCanvas每次缩小都会多次调用 。编辑:不 - 没有多次调用。)

0 投票
2 回答
2641 浏览

iphone - 释放 CGContextDrawPDFPage 使用的内存

当我用 Instruments 分析我的应用程序时,我发现 CGContextDrawPDFPage 分配的数据并没有立即释放。由于我的程序收到很多“内存警告”,我想释放尽可能多的内存,但我不知道如何释放这些内存。

正如您在http://twitpic.com/473e89/full上看到的,它似乎与此代码有关

我已经尝试在它周围包裹一个 AutoReleasePool ,但这似乎没有任何影响。屏幕截图是在 TiledView(方法所属的视图)被释放后截取的。

我希望有人可以帮助我减少内存使用量。

0 投票
1 回答
1838 浏览

ios - UIScrollView 内的 PDF 缩放

我在 2835 像素的 UIScrollView 中有一个 2835 像素的 PDF 文件。为了显示 PDF,我使用了 CATiledLayer。

我的问题是当我缩小滚动视图(低于 1 的比例)时,PDF 质量变得非常糟糕。奇怪的是,当我放大滚动视图(比例大于 1)时,PDF 看起来很棒。我放大的越多(比例* 10)质量越好。

如何更改代码以使低档和高档质量都很好?

0 投票
2 回答
19478 浏览

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

问候,

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

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

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

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

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

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

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

0 投票
2 回答
1112 浏览

uiscrollview - UIScrollView 中由 CATiledLayer 支持的 UIView 最初不滚动

我在 UIScrollView 中添加了一个支持 CATiledLayer 的 UIView。

首次加载视图时,我试图通过设置 UIScrollView 的 zoomScale 来适应 UIView - 这适合 UIView 和分层内容。

我有一种方法来获取图像的图块,并在 drawLayer:inContext 中渲染它们:

现在即使 CATiledLayer 视图的 scrollview/frame 的 contentsize 大于 UIScrollView,它最初也不会滚动。

当我尝试通过捏屏幕进行缩放时,我能够完美地滚动。

我无法在 drawLayer:inContext 中缩放 CGContext,因为我收到的上下文是一个图块而不是整个图像,并且我有 20 个组成我的图像的图块。

0 投票
1 回答
268 浏览

iphone - CATiledlayer 扭曲了 CGPath

我正在使用 CATiledlayers 和 UIScrollviews 来绘制不同细节级别的 CGPath。我正在画大图(4000x4000)。在 iPhone 上,这些大图片的图像会失真。

我终于找到了解决办法。我的错误是我将 tileSize 设置为我正在绘制的图像的大小(从某处的 PDF 示例演示中复制)。解决方案是将 tileSize 设置为最大 2000x2000。