2012-05-03 31 views
5

Tôi đang gặp một vấn đề vẽ lại trên CATiledLayer khi UIScrollView mẹ được phóng to.CATiledLayer đang được gỡ bỏ và làm mới khi đã phóng to iPad 3rd gen

Tôi render một trang PDF trong một CATiledLayer hậu thuẫn UIView. Nó có một UIImageView khác đằng sau nó, trong đó có một hình ảnh có độ phân giải thấp của trang mà CATiledLayer sẽ vẽ. Khi tôi phóng to, nó hoạt động như mong đợi. CATiledLayer sẽ hiển thị hình ảnh có độ phân giải cao hơn theo mức thu phóng.

Sự cố xảy ra sau khi thu phóng. Nếu tôi phóng to thì chỉ cần để iPad một mình, hình ảnh hiển thị sẽ mờ đi sau đó resharpens. Có vẻ như CATiledLayer đang bị xóa, vì tôi thấy hình ảnh có độ phân giải thấp bị mờ ở chế độ xem sao lưu, sau đó CATiledLayer được vẽ lại, tức là tôi thấy hiệu ứng ốp lát và chia sẻ lại hình ảnh. Điều này xảy ra nếu tôi chỉ rời khỏi ứng dụng một mình và chờ khoảng 30 đến 40 giây. Tôi đã chỉ quan sát nó trên iPad thế hệ thứ 3 (iPad mới, iPad3, bất cứ điều gì). Tôi cũng đang thử nghiệm trên iPad2 và tôi chưa gặp phải sự cố.

Có ai khác đã gặp sự cố này không? Bất kỳ nguyên nhân đã biết và, có thể, giải pháp?

Edit:

phương pháp UIScrollViewDelegate của tôi là như sau:

// currentPage, previousPage, and nextPage are the pdf page views 
// that are having the refresh problem 

- (void)positionBufferedPages { 
    // performs math {code omitted} 

    // then sets the center of the views 
    [previousPage.view setCenter:...];   
    [nextPage.view setCenter:...]; 
} 

- (void)hideBufferedPages { 
    if ([previousPage.view isDescendantOfView:scrollView]) { 
    [previousPage.view removeFromSuperview]; 
    } 

    if ([nextPage.view isDescendantOfView:scrollView]) { 
    [nextPage.view removeFromSuperview]; 
    }   
} 

- (void)showBufferedPages { 
    if (![previousPage.view isDescendantOfView:scrollView]) { 
    [scrollView addSubview:previousPage.view]; 
    } 

    if (![nextPage.view isDescendantOfView:scrollView]) { 
    [scrollView addSubview:nextPage.view]; 
    } 

    if (![currentPage.view isDescendantOfView:scrollView]) { 
    [scrollView addSubview:currentPage.view]; 
    } 
} 

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView { 
    return currentPage.view; 
} 

- (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view { 
    [self hideBufferedPages]; 
} 

- (void)scrollViewDidEndZooming:(UIScrollView *)scrollViewParam withView:(UIView *)view atScale:(float)scale { 
    [self positionBufferedPages]; 
    [self showBufferedPages];  
} 

- (void)scrollViewDidZoom:(UIScrollView *)scrollView { 
    // nothing relating to the pdf page view 
    // but does set the center of some other subviews on top of the pdf page views 
} 

Không chắc thế nào hữu ích này sẽ là mặc dù, như scrollview không nhận được đầu vào trong khi vấn đề xảy ra. Như đã đề cập ở trên, trang pdf được tải vào CATiledLayer, sau đó tôi để iPad một mình (không có thiết bị đầu vào nào nhận được bởi thiết bị) và CATiledLayer sẽ tự vẽ lại.

Tôi cũng đã thử cuộc gọi bắt để setNeedsDisplay, setNeedsDisplayInRect:, setNeedsLayout, và setNeedsDisplayOnBoundsChange: trên cả hai quan điểm và lớp lát gạch, nhưng vẽ lại xảy ra mà không bất kỳ của những chức năng nhận được gọi là. drawLayer:inContext: được gọi là, tất nhiên, nhưng dấu vết chỉ cho thấy một số cuộc gọi Quartz được bắt đầu trong một chủ đề nền (như mong đợi, như các lớp lát gạch chuẩn bị nội dung trong nền), do đó, nó cũng không giúp được gì.

Cảm ơn trước!

+0

Có thể vì màn hình retina hi-res của ipad 3 không? Bạn có đang đặt đúng nội dung CATiledLayer không? Cũng trong mã tạo dựng PDF tùy chỉnh của bạn, bạn nên sử dụng UIGraphicsBeginImageContextWithOptions và đặt tỷ lệ tương ứng – Lefteris

+0

Tôi không sử dụng UIGraphicsBeginImageContextWithOptions, nhưng tôi sử dụng CGContextScaleCTM để đặt tỷ lệ. Có sự khác biệt nào không? Có vẻ như tôi đang hiển thị đúng pdf. Vấn đề của tôi là CATiledLayer bằng cách nào đó vẽ lại chính nó không có lý do sau một thời gian. – Altealice

+0

Bạn nên đặt CATiledLayer contentsScale thành [[UIScreen mainScreen] scale] – Lefteris

Trả lời

1

Cách sử dụng bộ nhớ của ứng dụng của bạn trông như thế nào? CATiledLayer sẽ loại bỏ bộ nhớ cache của nó và vẽ lại nếu một cảnh báo bộ nhớ xảy ra. Tôi đã nhìn thấy nó làm điều này ngay cả khi không có cảnh báo bộ nhớ được gửi đến các ứng dụng (chỉ là một tải cao hơn bộ nhớ bình thường). Sử dụng Dụng cụ để xem mức sử dụng bộ nhớ. Bạn có thể cần phải sử dụng công cụ điều khiển OpenGL ES để xem những gì đang xảy ra với bộ nhớ đồ họa.

+0

Tôi đang đăng nhập cảnh báo bộ nhớ, nhưng nó không kích hoạt khi vẽ lại xảy ra. Hãy thử kiểm tra với các công cụ Cảm ơn bạn đã thông tin! – Altealice

+0

Vì vậy, làm thế nào bạn giải quyết vấn đề này? Rất nhiều người trong chúng ta đang có cùng một vấn đề và một giải pháp sẽ là tuyệt vời – Brodie

1

Tôi đã gặp sự cố tương tự. Trong trường hợp của tôi, nó được gây ra bằng cách sử dụng hàm UIGraphicsBeginImageContext(); chức năng này không tính đến quy mô, cho phép các vấn đề trên màn hình võng mạc. Giải pháp là thay thế cuộc gọi bằng UIGraphicsBeginImageContextWithOptions(), với tham số scale (= third) được đặt thành 0.0.

Nếu bạn dựa trên mã của mình trên mã mẫu Trình xem PDF thu phóng từ Apple, như tôi đã làm, rất có thể điều này cũng sẽ giải quyết được sự cố của bạn.

+0

để chia tỷ lệ thành 0.0 là sai ... phải được đặt như sau: UIGraphicsBeginImageContextWithOptions (khung.size, NO, [[UIScreen mainScreen] scale]); – Lefteris

+0

Cách của bạn hoạt động quá tất nhiên, nhưng thiết lập tỷ lệ để 0,0 có tác dụng tương tự. http://developer.apple.com/library/ios/#documentation/uikit/reference/UIKitFunctionReference/Reference/reference.html – Stuart

+0

Thú vị. Cảm ơn. Tôi không gọi UIGraphicsBeginImageContext(), vì tôi đang vẽ bằng cách sử dụng 'drawlayer: inContext:'. Bạn đang sử dụng một phương pháp khác? – Altealice

1

Longshot, bất kỳ cơ hội nào bạn đang gọi bất kỳ phương pháp nào trên các chế độ xem từ chuỗi không chính? Tất cả các loại công cụ sôi nổi bất ngờ có thể xảy ra nếu bạn làm.

+0

Vâng, có những thứ xảy ra trong nền, nhưng không có họ nên gọi xem, nếu đây là trường hợp, sau đó các công cụ nền có thể được ăn lên bộ nhớ và gây ra redraws như Josh nói.Tôi sẽ kiểm tra khi tôi trở lại làm việc vào ngày mai – Altealice

1

Tôi đã nói chuyện với một kỹ sư của Apple về điều này và câu trả lời ngắn gọn là iOS chỉ có bộ nhớ X có sẵn để lưu vào bộ nhớ đệm và màn hình Retina của iPad, chỉ có quá nhiều pixel để sử dụng nhiều hơn một lớp.

Tôi đã sử dụng hai CATileLayers để hiển thị chế độ xem bản đồ và chế độ xem bản vẽ ở trên cùng. Tôi đã xóa CATiledLayer thứ hai và sự cố đã biến mất.

+0

Tôi thấy. để chia sẻ! :) – Altealice

Các vấn đề liên quan