2011-10-05 43 views
6

Tôi đã xem xét và có vẻ như mọi người nói rằng bạn có thể kết xuất lại dữ liệu sau khi bạn phóng to ngay bây giờ mà bạn biết yếu tố tỷ lệ cho UIScrollView. Tôi cũng đã xem một số bài viết về cách tạo lớp của bạn thành CATiledLayer và thiết lập levelsOfDetailBias và levelsOfDetail.Hiển thị nội dung sau khi phóng to cho UIScrollView

gì tôi có là một UIScrollView, và trong đó, một ResultsView mà là một lớp con của UIView:

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     CATiledLayer *tiledLayer = (CATiledLayer *)self.layer; 
     tiledLayer.levelsOfDetailBias = 3; 
     tiledLayer.levelsOfDetail = 3; 
     self.opaque = YES; 
    } 
    return self; 
} 

/* 
// Only override drawRect: if you perform custom drawing. 
// An empty implementation adversely affects performance during animation. 
- (void)drawRect:(CGRect)rect 
{ 
    // Drawing code 
} 
*/ 

+ (Class)layerClass { 
    return [CATiledLayer class]; 
} 

Trong lớp học của tôi, nơi tôi có UIScrollView và ResultsView, tôi làm:

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView { 
    return self.ResultsView; 
} 

Điều này có đủ để văn bản được hiển thị lại (sắc nét) không? Hoặc tôi có cần thực hiện điều gì đó trong số

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx { 
} 

Nếu vậy, tôi không chắc chắn cách thực hiện điều đó. Trong lớp học của tôi với UIScrollView và ResultsView, trong ResultView (trong XIB), tôi chỉ có một vài UILabels và UIViews (UIViews được sử dụng cho tiêu đề/chân trang cho xem). Vì vậy, tôi không biết làm thế nào để vẽ lại những người từ ResultsView. Mặc dù ResultsView có UILabels và UIViews là con của nó trong XIB, tôi không chắc chắn làm thế nào tôi sẽ vẽ lại những người từ lớp ResultsView, và những gì tôi sẽ cần phải làm anyway.

Hoặc đây có phải là cách tiếp cận sai không? Tôi chỉ cần thay đổi kích thước các UILabel và UIView bởi các yếu tố quy mô trong scrollViewDidEndZooming: phương pháp đại biểu? TIA

Trả lời

18

Tôi nghĩ rằng bạn đang sử dụng phương pháp sai. Nếu chế độ xem của bạn bao gồm UILabels và UIViews không thực hiện bất kỳ bản vẽ tùy chỉnh nào, tôi sẽ không gây rối với việc sử dụng chế độ xem được hỗ trợ bởi CATiledLayer. Thay vì thực hiện các scrollViewDidEndZooming: withView: atScale: Phương pháp đại biểu và làm điều gì đó như thế này:

- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale { 
    scale *= [[[self.scrollView window] screen] scale]; 
    [view setContentScaleFactor:scale]; 
    for (UIView *subview in view.subviews) { 
     [subview setContentScaleFactor:scale]; 
    } 
} 
+0

cảm ơn. Nó hoạt động rất tốt. Tôi không nghĩ mình sẽ tự mình tìm được loại câu trả lời này. Bạn có thể giải thích lý do tại sao bạn cần quy mô dòng đầu tiên * = ... Giá trị cửa sổ/màn hình/thang đo có khác nhau đối với các thiết bị không? Cảm ơn. –

+0

Có, điều đó làm cho màn hình võng mạc tương thích. Trên màn hình iPad và không có màn hình Retina hiển thị iPhone/iPod, tỷ lệ màn hình cửa sổ là 1,0 nên không có hiệu lực. Trên võng mạc hiển thị nó là 2.0 để nó điều chỉnh đúng quy mô cho những màn hình đó. – afarnham

+0

Một cách tiếp cận thậm chí còn sạch hơn có thể là tạo ra khung nhìn bạn đang phóng to một lớp con của UIView (nếu nó chưa được tạo) và tạo một phương thức cho mỗi subview cập nhật trực tiếp contentScaleFactor thay vì lặp qua tất cả các subviews. Nó sẽ cung cấp cho bạn kiểm soát hạt mịn hơn nếu bạn có một số bản xem phụ mà làm bản vẽ tùy chỉnh như bạn sẽ muốn gọi setNeedsDisplay là tốt trên những người. – afarnham

4

Tôi có một cái gì đó nhỏ để thêm vào các giải pháp chấp nhận đã gây ra cho tôi một vài phút đau đớn chỉ trong trường hợp bất cứ ai khác chạy vào điều tương tự.

Lặp qua tất cả các bản xem trước trong chế độ xem bạn đang thu phóng và gọi bộ .ContentScaleFactor không tính đến liệu có bất kỳ bản xem trước nào có bản xem phụ hay không. Nếu bạn có thiết lập phức tạp hơn như vậy, hãy đảm bảo cũng lặp qua các bản xem trước của các chế độ xem vùng chứa đó và gọi

[subview setContentScaleFactor:scale]; 

trên mỗi thiết bị. Tôi đã thực hiện một phương thức mà tôi có thể gọi để gọi setContentScaleFactor trên tất cả các bản xem trước của một khung nhìn cụ thể và gọi cho mỗi "khung nhìn container" trên màn hình.

- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale 
{ 
    scale *= [[[self.scrollView window] screen] scale]; 
    [view setContentScaleFactor:scale]; 
    for (UIView *subview in view.subviews) 
    { 
     [self setContentSizeForView:subview andScore:scale]; 

     //Loop through all the subviews inside the subview 
     for(UIView *subSubview in subview.subviews) 
     { 
      [self setContentSizeForView:subSubview andScale:scale]; 
     } 
    } 
} 

- (void) setContentSizeForView:(UIView*) view andScale:(float)scale 
{ 
    [view setContentScaleFactor:scale]; 
} 
+0

Tôi có phải thực hiện bất kỳ cuộc gọi nào khác không?Khi tôi đặt contentScaleFactor của lớp con UIView của tôi (chế độ xem được sử dụng để vẽ và phóng to) bằng giá trị của tỷ lệ (của phương thức ủy nhiệm UIScrollView), ứng dụng của tôi bị chậm và bị hỏng. – Sebastian

+0

Vâng, tôi cũng nhận thấy đây là một hoạt động rất chậm khi có rất nhiều bài đánh giá. Cuối cùng tôi đã từ bỏ nội dung sắc nét trong khi phóng to cho một hệ thống phân cấp xem/phân lớp phức tạp vì nó quá chậm. – DiscDev

+0

tại sao bạn không dán vào phương pháp bạn đã thực hiện? –

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