【问题标题】:Objective C - Given a layer, how to check if it finished drawing?Objective C - 给定一个图层,如何检查它是否完成绘制?
【发布时间】:2023-03-30 05:08:01
【问题描述】:

我正在尝试检查一个图层是否已完成绘制,是否已准备好接收点击。

我尝试在图层上调用各种命令(needsDisplayneedsLayout 等),但它们都返回相同的值,与绘图状态无关。

【问题讨论】:

  • “成品图”是什么意思?您的意思是“在屏幕上实际可见”吗?
  • 不,我的意思是“它已准备好接收点击”...
  • @NikolaiRuhe 在我的情况下,我很想知道它什么时候可以执行,例如属性动画myLayer.endAngle = CGFloat(M_PI)。创建动画后立即不起作用,它只是显示结束状态。它以 0.1 的延迟工作。看不到要重写、委托或任何方法的方法。

标签: ios objective-c layer


【解决方案1】:
  1. 默认动画:

    访问层中对象的presentationLayer 属性。当动画正在进行时,您可以检索此对象并使用它来获取这些动画的当前值。

    https://developer.apple.com/library/ios/documentation/GraphicsImaging/Reference/CALayer_class/index.html#//apple_ref/occ/instm/CALayer/presentationLayer

  2. 自定义动画:

    使用 setCompletionBlock: 方法将完成块添加到当前事务。当事务中的所有动画完成后,事务就会执行您的完成块。

    为您的 CAAnimation 对象分配一个委托并实现 animationDidStart: 和 animationDidStop:finished: 委托方法。

    https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/CoreAnimation_guide/CreatingBasicAnimations/CreatingBasicAnimations.html#//apple_ref/doc/uid/TP40004514-CH3-SW1

【讨论】:

    【解决方案2】:

    我认为您应该使用的一种方法是检查图层帧大小。如果大小为正值,则表明该图层已显示并完成绘制。

        CALayer *newlayer = [[CALayer alloc]init];
        newlayer.backgroundColor = [UIColor orangeColor].CGColor;
        newlayer.cornerRadius = 20.0;
        newlayer.frame = CGRectMake(100.0f, 100.0f, 200.0f, 200.0f);
    
        [self.view.layer addSublayer:newlayer];
        if(newlayer.frame.size.width > 0 || newlayer.frame.size.height >0) {
        NSLog(@"added to view");
        }
    

    如果你在图层中绘制图像,你可以记录你调用 UIGraphicsEndImageContext(); 的那一刻。所以这里你已经有了你的图像。

    【讨论】:

    • 请提供此提议的理由。帧大小与绘图状态有什么关系?
    • 也许检查 glCheckFramebufferStatus 是一种更好的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-23
    • 1970-01-01
    • 1970-01-01
    • 2019-08-17
    • 2021-07-13
    • 1970-01-01
    • 2019-05-21
    相关资源
    最近更新 更多