如何更改iPhone CATiledLayer的淡出时间?

18

我正在开发一个在iPhone上显示平铺地图的应用程序。目前我在UIScrollView中使用CATiledLayer:

     MyTiledDelegate *delegate=[[MyTiledDelegate alloc] initWithMapLayer:map];
     tileLayer = [CATiledLayer layer];
     tileLayer.delegate = delegate;
     [scrollView.layer addSublayer:tileLayer];
     [tileLayer setNeedsDisplay];   

我编写并设置了自己的委托,该委托实现了绘制图层方法,代码如下:

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx{
    CGRect rect =CGContextGetClipBoundingBox(ctx);
    CGFloat x = fabs(round(rect.origin.x/tileSize));
    CGFloat y = fabs(round(rect.origin.y/tileSize));

    Tile *tile = [map getTileForMapZoom:z x:x y:y];
    CGImageRef img=[tile getRealImage];
    CGContextDrawImage(
        ctx,
        CGRectMake(tile.x*tileSize,tile.y*tileSize, tileSize,tileSize) , 
        img);
    }//edited for brevity
我对CATiledLayer的默认行为感到烦恼,它在拼贴瓦片后会淡入。而且,有时淡入效果不完整(透明度只到90或95%)。
如何更改或(最好是)删除淡入动画?
我尝试过为我的CATiledLayer实例设置speedduration属性,但都没有用。我没有对拼贴图层设置任何动画,[tiledLayer removeAllAnimation]也没有起作用。
谢谢任何帮助。

如果未设置持续时间或设置为负数,则淡入淡出持续时间默认为0.25。目前似乎找不到任何方法来淡入淡出。 - catsby
大家好。感谢你们的回答,它们解决了这个问题。我曾经考虑过在子类中覆盖,但希望有一种更优雅的方法,不需要创建另一个类。我想我会将CATiledLayer代理子类化为CATiledLayer。再次感谢。 - nico_h
嗨nico_h,能告诉我你是如何解决问题的吗?我也遇到了同样的问题。你是如何在不使用子类的情况下实现这一点的? - CKT
如下所述,我接受了下面的答案,我不得不对CATiledLayer进行子类化。 - nico_h
3个回答

32

您应该对CATiledLayer进行子类化,并返回fadeDuration为0来禁用淡入效果:

@interface FastCATiledLayer : CATiledLayer
@end

@implementation FastCATiledLayer
+(CFTimeInterval)fadeDuration {
  return 0.0;
}
@end

我也遇到了淡入动画没有完成的问题,解决方法是将视图的背景颜色设置为[UIColor clearColor]


请确保在代码中将 fastDuration 替换为 fadeDuration - lucius
当我将fadeDuration设置为0时,“未完成”问题似乎消失了。 - David Dunham

3
尝试通过子类化并覆盖图层上的+fadeDuration访问器来实现。

0

或者在 Swift 4 中:

class CAFastTiledLayer: CATiledLayer {
    class func fadeDuration() -> CFTimeInterval {
        return 0.0 
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接