Вопрос по objective-c, iphone – Как изменить iphone CATiledLayer fadeDuration?

18

Я работаю над приложением для iPhone, которое отображает мозаичные карты. В настоящее время я использую CATiledLayer в UIScrollView:

     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 по умолчанию, чтобы fadein после рисования плитки. Кроме того, иногда затухание не является полным (оно останавливается на 90 или 95% непрозрачности).

How can i change or (preferably) remove the fadein animation ?

Я играл сspeed а такжеduration свойства моего экземпляра CATiledLayer, но безрезультатно. Я не устанавливаю никакой анимации на слой tiledLayer.[tiledLayer removeAllAnimation] тоже ничего не меняет.

Спасибо за любые указатели.

привет nico_h можете вы plesae сказать мне, как вы решили свою проблему. Я также сталкиваюсь с той же проблемой. как вы достигли этого без использования подкласса? CKT
длительность замирания по умолчанию равна 0,25, если длительность не установлена или установлена на отрицательное число. похоже, что в любом случае я не могу найтиnot исчезать. catsby
Всем привет. Спасибо за ответ. Они решают проблему. Я имел хотя бы переопределение в подклассе, но надеялся, что есть более элегантный способ, который не включает создание еще одного класса. Я предполагаю, что я сделаю подкласс делегата CATiledLayer CATiledLAyer. Еще раз спасибо. nico_h
Как описано в ответе, который я принял ниже, мне пришлось создать подкласс CATiledLayer. nico_h

Ваш Ответ

3   ответа
3

Попробуйте создать подкласс и переопределить+fadeDuration аксессор на слое.

32

Вы должны создать подкласс CATiledLayer и вернуть fadeDuration 0, чтобы отключить постепенное появление:

@interface FastCATiledLayer : CATiledLayer
@end

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

У меня также была проблема с незавершением постепенного исчезновения анимации, что помогло установить цвет фона вида[UIColor clearColor]

Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededfastDurationError: User Rate Limit ExceededfadeDurationError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
0

Или в Swift 4:

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

Похожие вопросы