2013-10-09 7 views
2

iOS6에서 iOS7로 업그레이드 할 때 CATiledLayer와 관련된 버그를 발견했으며 Apple에 제출하기 전에 커뮤니티에서 확인하도록하고 싶습니다.CATiledLayer, iOS7 타일이 업데이트되지 않음

많은 CATiledLayers가 포함 된 UIScrollView가있는 경우 타일이 결국 업데이트를 중단하게됩니다.

나는 샘플 프로젝트가 여기에 문제를 보여주는 있습니다

https://github.com/sbudhram/CATiledLayerBug

다운로드 및 iOS7에 대 iOS6의를 실행하는 iPad에서 실행하십시오.

이 프로젝트는 3 단계의 해상도로 UIScrollView 내에 900 개의 CATiledLayers를 생성합니다. 사용자가 확대함에 따라 타일이보다 세련된 해상도로 업데이트됩니다. 이 코드는 iOS6에서 작동하지만 타일은 결국 iOS7에서 업데이트를 중지합니다.

나는 사람의이와 비슷한 문제를 가지고 있는지 확인하기 위해 주위에 인터넷 검색, 발견 한이 :

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

나는이 메모리없이 일어날 수 있다고 생각하기 때문에, 비록 다른 경고. (모든 것이 iOS6의에 채워집니다) 다음

- (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에에 무슨 일의 스냅 샷입니다 : 여기

는 UIViewController에 코드의 관련 작품이다

iOS7 Bug

+0

버그 신고서를 제출했습니다.이 질문을 상태와 함께 업데이트 해 드리겠습니다. –

+0

자세한 토론은 여기로 : https://devforums.apple.com/message/884524 – dkmp

+0

애플이 최신 베타 버전에서도 수정하지 않은 것처럼 보입니다. 최소한의 코드 변경으로 좋은 대안이 있습니까? – gavi

답변

1

에서 언급 한 바와 같이 gavi, 이제 7.1에서 작동합니다.