2011-02-06 10 views
21

Khi sử dụng UITableView, chúng tôi có thể tái sử dụng các ô của nó bằng các phương thức [[ UITableViewCell alloc] initWithStyle: reuseIdentifier:][uiTableViewInstance dequeueReusableCellWithIdentifier:]. Điều này giúp giữ cho bộ nhớ trong kiểm tra cho các bảng lớn như chỉ có một vài tế bào đang có trong xem tại một thời điểm nhất định.Làm cách nào để tái sử dụng/tái chế phần tử tùy chỉnh như uitableviewcell?

Tôi muốn tạo một UIScrollView có nhiều bản xem trước. Chèn tất cả các bản xem trước chiếm rất nhiều bộ nhớ và thời gian ban đầu mà tôi muốn tránh. Apple API có cung cấp các cách để tái sử dụng các thành phần tùy chỉnh như vậy (một UIView hoặc một phân lớp của nó ở đây) giống như các khung nhìn tế bào bằng cách sử dụng một định danh?

Tôi sẽ tạo một tài khoản nếu không có API, nhưng có một số nghi ngờ về việc này. Ví dụ: đối với mỗi chế độ xem phụ mới, tôi sẽ đặt vị trí khung hình của nó, sau các chế độ xem ưu tiên. Làm thế nào tôi nên đi về việc cập nhật khung cho mỗi subview trong khi tái chế? Tôi có nên xóa và tải lại nội dung của mọi chế độ xem phụ khi nó được tái chế không? Tôi có nên thực hiện tất cả các tính toán này trong một chuỗi khác để tránh bị giật không? Trong tất cả, tôi muốn có một trải nghiệm cuộn trơn tru như trong UITableView với tất cả các công cụ tái sử dụng.

Đây là một mẫu mã mà tôi đã viết cho đến nay:

int numberOfPages = 0; 
int pageWidth = 100; 
int pageHeight = 100 

UIScrollView *myScrollView = //allocate and initialize a scrollview 
//set its size to 100 by 100 (width equal to pageWidth) 
//set paging enabled for myScrollView 

Thêm subviews để nó từ một phương pháp, đó được gọi là nhiều lần

- (void) appendSubViewToScrollView { 
    UIView *view = //allocate and initialize a view and dump data in it. 

    CGRect rect = view.frame; 
    rect.size.height = pageHeight; 
    rect.size.width = pageWidth; 
    rect.origin = CGPointMake(pageHeight * numberOfPages, 0); 
    view.frame = rect; 

    [myScrollView addSubview:view]; 

    numberOfPages++; 

    [scrollView setContentSize:CGSizeMake(pageHeight * numberOfPages, pageWidth)]; 

    [view release]; 
} 

Edit:
Một số cái nhìn sâu sắc vào cách mà tableview và các tế bào của nó đạt được điều này đằng sau hậu trường sẽ hữu ích.

Trả lời

19

Có, bạn nên khôi phục từng nội dung của chế độ xem con mỗi lần, chính xác như trong chế độ xem bảng. Lợi thế của việc tái chế các bản xem phụ là tiết kiệm bộ nhớ để lưu trữ chế độ xem và tiết kiệm thời gian cho phân bổ lượt xem, nhưng tất nhiên quản lý dữ liệu nội dung tùy thuộc vào bạn.

Vì vậy, cách tiếp cận tái chế tiêu chuẩn yêu cầu bạn sử dụng một số ô tương đương với số lượt xem hiển thị cùng lúc trên màn hình + số lượng ô bổ sung bạn có thể nhận được khi bắt đầu cuộn. Ví dụ: Giả sử bạn đang hiển thị 5 lượt xem đầy đủ (chế độ xem cuộn ổn định) và sau đó trong khi cuộn, bạn sẽ cần thêm một lượt xem được hiển thị một phần, vì vậy ở cuối bạn cần 5 + 1 = 6 lượt xem. Đây là lý thuyết, bạn nên sử dụng thêm 2 chế độ xem. Vì vậy, bạn cần phải viết hai hồ bơi: một cái được gọi là "visibleViews" được tạo thành từ tất cả các khung nhìn được thêm dưới dạng các bản xem trước cho scrollview và một cái khác được gọi là "readyViews" được tạo thành từ tất cả các chế độ xem có sẵn để sử dụng lại. Sau đó, bạn tạo tất cả các chế độ xem này và thêm chúng vào chế độ xem cuộn (có: bạn cần điều chỉnh khung của chúng theo vị trí của chúng trong scrollview và có, bạn cần phải thiết lập lại nội dung). Cuối cùng, bạn cần theo dõi chuyển động của chế độ xem cuộn bằng cách thiết lập một đại biểu. Mục đích của việc theo dõi này là tính toán xem các chế độ xem hiển thị nào không hiển thị, sau đó xóa nó khỏi vùng hiển thị và di chuyển đến nhóm có thể sử dụng. Bên cạnh các đại biểu phải hiểu khi một tế bào mới sẽ xuất hiện nhưng nó vẫn không nhìn thấy được, sau đó nhận được nó từ các hồ bơi có sẵn (hoặc phân bổ/init nó nếu hồ bơi là trống) và thêm vào cả hai hồ bơi nhìn thấy được và như subview của scrollview. Tất nhiên nếu bạn muốn tăng hiệu suất, bạn có thể đặt nhiều bản xem trước hơn trong chế độ xem cuộn để tránh di chuyển chính xác các ô khi chúng xuất hiện trên màn hình, đó là lý do tại sao tôi nên sử dụng một vài chế độ xem bổ sung ở hai bên của cuộn lượt xem.

Có một video tuyệt vời từ WWDC 2010 (bạn có thể truy cập nó nếu bạn là nhà phát triển đã đăng ký) về cách sử dụng chế độ xem cuộn trong iOS: nó giải thích kỹ thuật này.

Mã ví dụ PhotoScroller của Apple trong tài liệu XCode về cơ bản những gì được nêu trong video WWDC và giải thích kỹ thuật này.

+0

Cảm ơn bạn đã trả lời Viggio. Có một số mã liên quan đến điều này? Tôi có thể sử dụng một số tài liệu tham khảo. Và vâng tôi là một nhà phát triển đã đăng ký. Bạn có thể chỉ ra video có liên quan cho trường hợp này không? ("Khung ứng dụng"? Tôi sẽ xem phần còn lại lúc rảnh rỗi). Tôi cũng sẽ tải xuống mã mẫu. Có vẻ thú vị và hữu ích. – Sailesh

+0

Hãy đánh dấu câu trả lời này là được chấp nhận với dấu kiểm (bên dưới mũi tên bỏ phiếu lên/xuống). – JoePasq

+1

Thật không may là tôi không nhớ video giải thích kỹ thuật này là gì, nhưng tôi nhớ nó đã được giải thích bằng một bản demo. Có một video được gọi là "Thiết kế ứng dụng với chế độ xem cuộn" nhưng tôi không chắc chắn đó có phải là video phù hợp hay không, dù sao cũng đáng xem nó trong mọi trường hợp (nó giải thích một số kỹ thuật đẹp). trang chủ video WWDC bắt đầu tại đây: http://developer.apple.com/videos/wwdc/2010/ từ nơi bạn đăng nhập bằng tài khoản nhà phát triển của mình, sau đó bạn có thể mở iTunes và tải xuống hoặc chỉ xem video. Một trong những tôi đang đề cập đến là 104 ("Thiết kế ứng dụng với Scroll Views"). – viggio24