CATiledLayer, плитки iOS7 не обновляются

Я думаю, что при обновлении с iOS6 до iOS7 я обнаружил ошибку в CATiledLayer, и я хотел бы, чтобы сообщество проверило ее перед отправкой в ​​Apple.

Проблема заключается в том, что если у вас есть UIScrollView со многими CATiledLayers внутри, плитки в конечном итоге перестают обновляться.

У меня есть пример проекта, демонстрирующий эту проблему здесь:

https://github.com/sbudhram/CATiledLayerBug

Пожалуйста, загрузите и запустите на iPad под управлением iOS6 против iOS7.

Этот проект генерирует 900 CATiledLayers в UIScrollView с 3 уровнями разрешения. Когда пользователь увеличивает масштаб, плитки обновляются до более точного разрешения. Код работает на iOS6, но плитки в конечном итоге перестают обновляться на iOS7.

Я погуглил, чтобы посмотреть, есть ли у кого-нибудь подобные проблемы с этим, и нашел это:

http://www.cocoanetics.com/2013/09/welcome-to-ios-7-issues/

Это отличается, хотя, потому что я считаю, что это может произойти без предупреждения памяти.

Вот соответствующий фрагмент кода в UIViewController:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    self.scrollView = [[UIScrollView alloc] initWithFrame:self.view.bounds];
    _scrollView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    _scrollView.backgroundColor = [UIColor yellowColor];
    _scrollView.contentSize = CGSizeMake(self.view.frame.size.width, self.view.frame.size.height);
    _scrollView.minimumZoomScale = 1;
    _scrollView.maximumZoomScale = 4.1;
    _scrollView.zoomScale = 2;
    _scrollView.showsHorizontalScrollIndicator = YES;
    _scrollView.showsVerticalScrollIndicator = YES;
    _scrollView.delegate = self;
    [self.view addSubview:_scrollView];

    self.contentView = [[UIView alloc] initWithFrame:_scrollView.bounds];
    _contentView.backgroundColor = [UIColor lightGrayColor];
    [_scrollView addSubview:_contentView];

    CGFloat tileSize = 20.0f;
    CGFloat tileSpacing = 4.0f;

    for (int i = 0; i < 30; i++) {
        for (int j = 0; j < 30; j++) {

            CATiledLayer *tLayer = [CATiledLayer layer];
            tLayer.bounds = CGRectMake(0, 0, tileSize, tileSize);
            tLayer.position = CGPointMake(tileSize/2 + i*(tileSpacing+tileSize), tileSize/2 + j*(tileSpacing+tileSize));
            tLayer.delegate = self;
            tLayer.contentsGravity = kCAGravityResize;
            tLayer.contentsScale = [[UIScreen mainScreen] scale];
            tLayer.masksToBounds = NO;
            tLayer.opacity = 1.0f;
            tLayer.backgroundColor = [UIColor colorWithRed:.2 green:.2 blue:.8 alpha:.5].CGColor;
            tLayer.levelsOfDetail = 3;
            tLayer.levelsOfDetailBias = 3;
            tLayer.tileSize = CGSizeMake(1024., 1024.);
            [_contentView.layer addSublayer:tLayer];

        }
    }
}

- (void)scrollViewDidZoom:(UIScrollView *)scrollView {
    NSLog(@"Zoom: %f", scrollView.zoomScale);
}

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
    return _contentView;
}

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx {
    UIImage *drawImage = nil;
    if (_scrollView.zoomScale < 2) {
        drawImage = [UIImage imageNamed:@"low.png"];
        NSLog(@"Drawing - Low");
    }
    else if (_scrollView.zoomScale < 4) {
        drawImage = [UIImage imageNamed:@"med.png"];
        NSLog(@"Drawing - Med");
    }
    else {
        drawImage = [UIImage imageNamed:@"high.png"];
        NSLog(@"Drawing - Hi");
    }

    CGContextScaleCTM(ctx, 1, -1);
    CGContextTranslateCTM(ctx, 0, -layer.bounds.size.height);
    CGContextDrawImage(ctx, layer.bounds, [drawImage CGImage]);

}

Вот снимок того, что происходит на iOS7 (все заполнено на iOS6):

iOS7 Bug

1 ответ

Решение

Как уже упоминал Гави, теперь это работает в 7.1.

Другие вопросы по тегам