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!
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
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
Bạn nên đặt CATiledLayer contentsScale thành [[UIScreen mainScreen] scale] – Lefteris