问题标签 [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 回答
809 浏览

html - Sencha Touch/ExtJS:平铺滚动视图(如 CATiledLayer)

我正在寻找类似CATiledLayer(在 iOS 上)的东西,但用于 PhoneGap/Sencha Touch 2。

这个想法是以瓦片的形式从服务器“流式传输”一个非常大的图像 - 就像谷歌地图一样。

它应该支持移动设备上的触摸手势,以便用户可以捏缩放和滚动。

不幸的是,我找不到任何东西 - 所以非常感谢一些指针。


更新:

与此同时,我查看了OpenLayers,这似乎是我想要的并管理多层缩放等。不幸的是,它与 Geospartial 数据挂钩太多,无法禁用投影以使其像基本图像查看器一样工作。

我还发现了GSV(Big Ass Image Viewer)——不幸的是,我不支持触摸手势,而且通常似乎被放弃了。

对我来说,没有人真正需要这样的东西很奇怪,我尽量避免“重新发明轮子”。但现在看起来没有任何非地理数据/地图相关的解决方案。

0 投票
2 回答
1731 浏览

ios - 由于内存使用异常,启用了 CATiledLayer 且具有 drawRect 定义的子视图的 UIView 崩溃

我们在 iPad 3 上发生内存不足崩溃,我们追踪到以下情况:

使用 CATiledLayer 并绘制内容(例如 PDF)的 UIView 具有带有自己的 drawRect 方法的子视图(例如,突出显示搜索结果)。这使得 Core Animation 消耗大量内存(在 VM Tracker 工具中超过 100 MB),并且很容易导致崩溃。虽然所有设备都存在此问题,但只有在 iPad 的 Retina 显示屏上,缓存大小才会变得过大。

这可以通过 Apple 的PhotoScroller示例重现:子类 UIView,取消注释 drawRect,并将实例添加到 TilingView。该应用程序将在 iPad 3 上崩溃。评论 drawRect 解决了内存使用问题。

现在,我们可以放下子视图并在最顶层的 UIView 中进行绘图。但是,使用子视图很方便(因为我们在 PDF 之上表示不同的、独立的层)。两个问题:

  1. 什么是好的解决方法?最好是允许我们继续使用多个视图的。
  2. 为什么会发生这种情况?我猜缓存机制正在加班,但如果了解它背后的技术细节会很棒。

谢谢!

编辑:

我想详细说明凯的回答。该问题确实与 CATiledLayer 无关,而是与实现 drawRect 的 UIViews 的使用有关。

在 PhotoScroller 的情况下,我创建了一个 UIView,它的图像大小 - 2000x2000 或更大,如果 drawRect 存在,它会创建一个巨大的后备存储。

在我们的应用程序中,覆盖视图是全屏的(在 iPad 3 上 =~11 MB),每页大约有 5 个。滚动时我们在内存中最多保留三页,这意味着超过 150 MB 的额外内存。不好玩。

所以解决的办法就是优化drawRect掉,或者少用这样的view。回到绘图板它是:-)

0 投票
4 回答
1486 浏览

objective-c - CATiledLayer 在 iPad 第 3 代放大时被移除和刷新

当父 UIScrollView 放大时,我在 CATiledLayer 上遇到重绘问题。

我在 CATiledLayer 支持的 UIView 中呈现 PDF 页面。它后面有另一个 UIImageView,其中包含 CATiledLayer 将绘制的页面的低分辨率图像。当我放大时,它按预期工作。CATiledLayer 将根据缩放级别渲染更高分辨率的图像。

缩放后出现问题。如果我放大然后只留下 iPad,显示的图像会模糊然后重新锐化。看起来 CATiledLayer 正在被移除,因为我在背景视图中看到模糊的低分辨率图像,然后 CATiledLayer 被重新绘制,即我看到了平铺效果和图像的重新锐化。如果我不理会应用程序并等待大约 30 到 40 秒,就会发生这种情况。我只在第三代 iPad(新 iPad、iPad3 等)上观察到它。我也在 iPad2s 上进行测试,但我还没有遇到这个问题。

有没有其他人遇到过这个问题?任何已知的原因和可能的解决方案?

编辑:

我的 UIScrollViewDelegate 方法如下:

不确定这会有多大帮助,因为当问题发生时,滚动视图没有接收到输入。如上所述,pdf页面加载到CATiledLayer,然后我不理会iPad(设备没有接收到输入),CATiledLayer会自行重绘。

我还尝试在视图和平铺层上捕获对setNeedsDisplaysetNeedsDisplayInRect:setNeedsLayout和的调用setNeedsDisplayOnBoundsChange:,但是重绘发生时没有调用任何这些函数。drawLayer:inContext:当然会被调用,但是跟踪仅显示在后台线程中启动了一些 Quartz 调用(正如预期的那样,因为平铺层在后台准备内容),所以它也无济于事。

提前致谢!

0 投票
1 回答
249 浏览

xcode - xcode:在catiledlayer中绘制对象

我正在尝试将自己的对象绘制到 CATiledLayer,我只是不确定我应该如何将对象推送到 drawLayer 中使用的上下文。例如,我知道我可以通过在方法 drawLayer 中声明文本代码来添加我想在屏幕上绘制的文本,但是说我只想在获得用户输入时才绘制一些东西,然后我想创建这个新的文本对象并将其绘制到屏幕上,但我不确定如何在 drawLayer 方法之外执行此操作,因为我需要上下文。

0 投票
0 回答
309 浏览

ios - 如何在 MonoTouch 中移植很棒的 PhotoScrollerNetwork?

我正在尝试将 PhotoScrollerNetwork 应用程序移植到 MonoTouch(iOS 5 Apple PhotoScroller 示例的改进版本),但代码正在执行我无法在 MonoTouch 中重现的事情。

https://github.com/dhoerl/PhotoScrollerNetwork

例如,内存管理很难在 MonoTouch 中重现,没有它就会崩溃。作者(dhoerl)在自述文件中写道:

v2.0: - iPad1 和 iPhone3GS(只有 256M 内存)在没有操作系统警告的情况下被杀死。因此,创建了 cdisk 缓存使用上限,并在达到阈值时刷新文件(以释放内存)。崩溃消失了。

在 MonoTouch 中移植以下类非常复杂:

TiledImageBuilder.m

由于他的 GC,也许 MonoTouch 中还有另一种更简单的方法来处理上述内存管理技巧。有其他人尝试移植 PhotoScrollerNetwork 应用程序并想分享吗?

任何建议表示赞赏,谢谢。

0 投票
2 回答
1901 浏览

objective-c - CATiledLayer 基础知识:为什么在渲染 PDF 时经常调用 CATiledLayer 的 drawLayer:inContext:?

我试图了解CATiledLayer使用CGContextDrawPDFPage().

我的理解是,drawLayer:inContext:每个图块和细节级别调用一次。那是对的吗?

在我的平铺层的代表中,我调用了CGContextDrawPDFPage(). 但是我注意到(通过将日志放入 中drawLayer:inContext:drawLayer:inContext:如果我使平铺层的平铺尺寸更小,则调用的频率更高。这让我想知道:

  • 我的 PDF 页面是否被绘制/渲染了 x 次?
  • 还是 CGContextDrawPDFPage() 神奇地知道要绘制页面的哪个部分?
  • 渲染PDF页面时,CATiledLayer是不是很浪费资源?它的优势是什么?
0 投票
1 回答
393 浏览

objective-c - 如何使用 UIScrollView 和 CATiledLayer 在可缩放的 UIView 上绘制标记

我想在使用 UIScrollView 和 CATiledLayer 的可缩放 UIView 上绘制标记。我目前使用的设置与 Apple 的 PhotoScroller 演示应用程序相同。我绘制形状没有问题,但我希望它们即使在缩放后也能保持在同一个位置。我可以为此使用转换矩阵吗?或者我是否必须在缩放之后或缩放期间重新绘制形状?这似乎是一项昂贵的操作。

我不想缩放我正在绘制的形状。所以使用缩放转换是不可能的。

我很好奇 MapView 是如何实现这个功能的。有人知道吗?

0 投票
2 回答
1637 浏览

iphone - CATiledLayer 到 CALayer

我有一个带有 CATiledLayer 支持的视图。我想从这个 CATiledLayer UIView 中获取可见图块并将其添加到另一个视图作为它的 CALayer 支持,从而在另一个不使用 CATiledLayer 的 UIView 中重新创建可见图像。

我想这样做的原因是我将使用第二个 UIView 来掩盖更新 CATiledLayer 支持的 UIView 的效果 - 这当前会在重新加载所有图块时产生闪烁。

问题是,我不完全确定我会如何做到这一点。有任何想法吗?

0 投票
2 回答
695 浏览

iphone - CATiledLayer 问题

我想像在 PhotoScroller 应用程序中一样使用 CATiledLayer。在我的 TilingView.m 我有

所以,当我使用视网膜显示器时,它总是进入

它在模拟器(视网膜显示器)上完美运行,但在设备上它会引发异常(图像!= nil,我已经检查过)

例外

先感谢您。

0 投票
1 回答
1029 浏览

iphone - CATiledLayer 的背景图像

您可能知道,CATiledLayer用于通过以适合视图大小的比例显示平铺图像来显示大图像。

我的CATiledLayer工作类似于可以在 iOS 文档下找到的示例,我计算了drawRect:(CGRect)rect 在哪一行和哪一列试图绘制其内容。

当视图第一次出现时,它开始在空白视图上逐块绘制,该视图/图层后面没有任何内容。我首先尝试放置低分辨率图像以填充图层,然后开始绘制平铺视图。

就像您在浏览 PDF 页面时一样,每个页面最初都以非常差的图像表示,但足以看到内容布局,当您停在某个页面时,该页面会变得更加清晰。

我知道我可以在 catiledlayer 之上添加子图层,但我无法在 catiledlayer 后面放置任何图层,因为这是一个 masterlayer。我也相信在同一层上加载背景图像很重要,这样可以适当地缩放。

有谁知道如何实现这一目标?