【问题标题】:Residual/trace in Core Animation & CALayers核心动画和 CALayers 中的残差/跟踪
【发布时间】:2009-12-18 17:43:46
【问题描述】:

我正在制作一个 Cocoa 应用程序,使用 Core Animation 来创建自定义 UI。然而,每当我拖动一些图层时,它们通常会在其他图层上留下一些“残差/痕迹”。

到目前为止,我的猜测是它与我对 [setNeedsDisplay] 的使用有关。据我了解,当我拖动一个图层时,我不需要对该图层调用此方法(因为该图层内没有任何更新)。但是留下的残差在其他层(所以也许他们需要调用那个方法?但是我怎么知道拖动鼠标经过了哪些层?)

例如,大多数图纸都非常简单:

// Block view is a subclass of CALayer
@implementation BlockView

-(void)drawInContext:(CGContextRef)context
{   
    CGRect bounds = CGContextGetClipBoundingBox(context);   
    CGContextSetFillColorWithColor(context, color);
    CGContextFillRect(context, bounds);
}
@end

但是,有时我有多个层级(最多 3 个);但我认为这不是问题。

我想知道这可能是什么原因?这个问题很难展示具体的代码示例,但欢迎一些提示或可能的猜测。

【问题讨论】:

  • 如何执行拖动?仅使用 mouseDown: 消息还是使用 mouseDown:、mouseDragged: 和 mouseUp: 消息或其他解决方案?
  • 嗨 Laurent,我正在使用 mouseDown、mouseDragged 和 mouseUp。

标签: objective-c cocoa macos core-animation


【解决方案1】:

一个常见的问题是绘制边界外。如果您在绘图例程中使用 [self frame] 而不是 [self bounds],就会发生这种情况。

【讨论】:

    【解决方案2】:

    在我的头顶上:

    • 您可以尝试从层次结构的顶层调用 setNeedsDisplay:
    • 您可以尝试使用 Application Kit 类进行绘图,并使用不同的图形上下文进行绘图。

    【讨论】:

      【解决方案3】:

      这是我有时在使用 UIWebViews 时遇到的问题。简单地说,Apple 代码不是(奇怪的是)没有错误的。我尝试隐藏有问题的视图并显示另一个视图,有点像双缓冲,如果你愿意的话,只有双视图,作为一种解决方法。

      如果您要在两个位置之间移动(动画)视图,请隐藏一个,然后显示新的视图并将其从旧位置动画化到新位置。回想一下并分析一下,当 UIWindow 有多个子视图时会出现问题 - 我现在想知道如果您将多个其他顶级视图封装在一个几乎顶级的“shell”视图中,它是否会消失 -也试试?你的旅费可能会改变。添加“双重查看”后,该错误仍会在一定程度上表现出来,但由于工件出现的时间更短,用户对问题是碍眼的感觉明显降低。

      【讨论】:

        猜你喜欢
        • 2011-05-15
        • 2010-09-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多