- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 iOS 开发的新手,我正在尝试了解 CATiledLayer
的工作原理。不是如何使用它!
CATiledLayer
有两个关键特性,我想知道它是如何工作的。
可见范围自动报告。 CATiledLayer
如何知道它的可见边界已经改变?我可以创建自定义 CALayer
并注册以了解相同的信息吗?
瓷砖绘图。这些瓷砖是如何绘制的?它们是作为子层绘制的吗?
我想知道这两个关键点是如何工作的原因是我正在构建一个自定义 UIView
,它可以有一个非常大的宽度和一个 CALayer
将由于有这么大的支持层而崩溃。 CATiledLayer
内存使用率低,几乎是完美的!
我不想使用 CATiledLayer
的原因是它的内部工作方式。所有绘图都发生在后台线程上。我知道您甚至可以在主线程上调用绘图逻辑,但这会在下一个绘图周期发生。由于绘图不会在同一个绘图周期中发生,因此在 View 调整大小时,我们的绘图逻辑会延迟更新绘图,从而导致 UIView
内容在用户更新期间发生抖动。
再补充一点。我正在构建一个音频编辑器,它可以显示音频波形,用户可以调整该剪辑的大小。该剪辑显示在 Collection View 中。上面提到的 CATiledLayer
问题似乎与 Garage band 的问题相同。在向左调整音频剪辑大小时,我几乎没有注意到它。他们可能正在使用 CATiledLayer
。
最佳答案
我知道一种解决第一个问题的方法,但我不确定结果和效率。除了它有效之外,这更具理论性。我正在使用 CADisplayLink 运行检查以查看图层的框架是否在主窗口中。我确实注意到使用了少量 CPU(1% 或更少),因此与 CATiledLayer 相比,我会对其进行更多测试。 CATiledLayer 只是打破了绘图,但在同样的前提下运行,即只有可见的才能被绘制。 drawRect 我认为在可见或可见边界发生变化时基本上起作用。至于我测试的子类,我在 UICollectionView 中使用了它并且知道它可以工作。我什至可以获得单元格创建时间的日志,而不是在屏幕上。这是 CALayer 的工作子类。我不知道这是否对您有帮助,但这是可能的。
import UIKit
protocol OnScreenLayerDelegate:class {
func layerIsOnScreen(currentScreenSpace:CGRect)
func layerIsNotOnScreen(currentScreenSpace:CGRect)
}
class OnScreenLayer: CALayer {
var displayLink : CADisplayLink?
weak var onScreenDelegate : OnScreenLayerDelegate?
override init() {
super.init()
commonSetup()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
commonSetup()
}
func commonSetup(){
displayLink = CADisplayLink(target: self, selector: #selector(checkOnScreen))
displayLink?.add(to: .main, forMode: .commonModes)
}
@objc func checkOnScreen(){
if let window = UIApplication.shared.keyWindow{
let currentRect = self.convert(self.bounds, to: window.layer)
if window.bounds.intersects(currentRect){
onScreenDelegate?.layerIsOnScreen(currentScreenSpace: currentRect)
}else{
onScreenDelegate?.layerIsNotOnScreen(currentScreenSpace: currentRect)
}
}
}
}
关于问题 2,我认为 CATiledLayers 可能不使用子层,而是慢慢地将所有内容绘制到单个内容图像中,但通过平铺和可能更容易的数学运算。它可能是将可见区域绘制在背景中并提供图层内容的东西。然后缓存该部分并添加另一个部分直到它完成。这只是一个猜测。
这是我在 collectionView 单元格中测试的代码。
import UIKit
class AlbumCollectionViewCell: UICollectionViewCell {
@IBOutlet weak var imageView: UIImageView!
var onScreenLayer = OnScreenLayer()
var currentIndex : Int = 0
override func awakeFromNib() {
super.awakeFromNib()
onScreenLayer.frame = self.bounds
self.layer.addSublayer(onScreenLayer)
onScreenLayer.onScreenDelegate = self
}
override func layoutSubviews() {
super.layoutSubviews()
onScreenLayer.frame = self.bounds
}
}
extension AlbumCollectionViewCell : OnScreenLayerDelegate{
func layerIsOnScreen(currentScreenSpace: CGRect) {
//or more proof
print("it is on screen \(currentIndex)")
}
func layerIsNotOnScreen(currentScreenSpace: CGRect) {
print("not on screen \(currentIndex)")
}
}
当前索引是在 cellForItem 中设置的,因此我可以监视它。让我知道这是否有帮助。此外,检查可以修改框架以在它出现在屏幕上之前以您之前绘制的方式捕捉它。
关于ios - CATiledLayer 内部是如何工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50261060/
我试图了解 CATiledLayer在使用 CGContextDrawPDFPage() 渲染 PDF 页面时有效. 我的理解是 drawLayer:inContext:每个图 block 和细节级别
有没有人有任何技巧可以提高 CATiledLayer 在视网膜显示器上的性能? 这篇文章: CATiledLayer in iPad retina simulator yields poor perf
我是 iOS 开发的新手,我正在尝试了解 CATiledLayer 的工作原理。不是如何使用它! CATiledLayer 有两个关键特性,我想知道它是如何工作的。 可见范围自动报告。 CATiled
请看这个简单的 CATiledLayer 示例 https://github.com/seanhess/CATiledLayer-Example 它由一个具有如下层次结构的 viewControlle
如您所知,CATiledLayer 用于通过以适合 View 大小的比例显示平铺图像来显示大图像。 我有 CATiledLayer 的工作方式类似于可以在 iOS 文档中找到的示例,我计算 drawR
我有一个适用于 iPad 的 pdf 阅读器应用程序,我在其中使用 ScrollView 来显示每个页面。我将页面保持在 View 中,并在页面的任一侧保持页面在 View 中。我有单独的纵向和横向
由于种种原因,我正在考虑自己实现CATiledLayer。我做了一些调查,但我似乎无法弄清楚 CATiledLayer 如何知道要提供哪个图 block 。例如,当您滚动图层时,setPosition
我有这个巨人UIView与约 600 UIButtons作为 subview 。 UIView大约是 2000 x 2000 像素,它是 UIScrollView 的 subview .我正在尝试实现
我正在按照 this answer 中概述的说明进行操作用 Core Graphics 中的图案填充图层。当图层是 CALayer 子类时,绘图工作正常。但是,当图层是 CATiledLayer 子类
我需要在 UIImageView 中加载更高分辨率的图像。经过各种方法之后,如果我们加载更高分辨率的图像,内存使用量就会变得巨大 [ width * height * 4 ]因此,为了克服这个问题,需
我正在尝试屏幕捕获使用 CATiledLayers(用于动画)的 View ,但无法获取我想要的图像。 我在 Apple 的“PhotoScroller”示例应用程序上进行了尝试,并添加了以下内容:
我有一个 CATiledLayer,我通过以下方法在其中渲染内容 - (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx 我使用
全部, 我无法从 CATiledLayer 获取我想要的行为。有没有一种方法可以触发图 block 重绘,而不会产生先将其区域清除为白色的副作用?我已经将 CATiledLayer 子类化以将 fad
关闭。这个问题需要debugging details .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 4年前关闭。 Improve this question 好吧
我将如何捕获 CATiledLayer 上的触摸事件? 我遇到以下情况,如果我将 View 层更改为 CATiledLayer, View 将停止捕获 TouchesXXX 事件。为什么会发生这种情况
我正在尝试在一个图层上添加两个子图层。一个图层应充当(快速渲染)背景,而另一图层(CATiledLayer)应显示其他内容。但是,CATiledLayer 不会出现在前面。普通的CALayer总是隐藏
每次您处于更深的缩放级别时,是否有一种方法可以重置您的缩放级别,以便您可以无限缩放? 我正在尝试创建一个 CATiledLayer,其中每个图 block 都有不同的颜色,当您放大一个图 block
我正在我的应用程序中创建一种“ map ”。这基本上只是使用 imageView/scrollView 查看图像。然而,图像是巨大的。像 20,000x15,000 像素之类的。如何平铺此图像以使其适
我的一个老问题与在 monotouch 中查看 pdf 文件有关(我设法完成了这个)。 Port of the iOS pdf viewer for xamarin 我的问题如下:如果我开始关闭和打开
其他人也遇到过这个问题,但我没有看到任何解决方案 - 请参阅 ( http://openradar.appspot.com/6941930)。 我有一个 UIScrollView,它的内容 View
我是一名优秀的程序员,十分优秀!