2012-06-05 26 views
12

Tôi muốn có thể sửa vị trí của một số hàng nhất định trong UITableView khi người dùng cuộn.UITableView - Cách giữ các hàng trong bảng được cố định khi người dùng cuộn

Cụ thể, tôi có bảng theo đó một số hàng nhất định là "tiêu đề" cho các hàng tiếp theo và tôi muốn tiêu đề ở trên đầu màn hình khi người dùng cuộn lên. Sau đó nó sẽ di chuyển ra khỏi con đường khi người dùng cuộn đủ xa để hàng tiêu đề tiếp theo thay thế.

Ví dụ tương tự sẽ là ứng dụng Any.DO. Các hàng trong bảng "Today", "Tommorrow" và "Later" luôn hiển thị trên màn hình.

Có ai có bất kỳ đề xuất nào về cách thực hiện điều này không?

Tôi hiện đang nghĩ đến việc làm theo các đại biểu TableDidScroll và định vị ô của chính mình ở vị trí thích hợp ở phía trước chế độ xem bảng. Vấn đề là ở những thời điểm khác, tôi thực sự muốn các ô này trở thành các ô bảng thực để chúng có thể được sắp xếp lại bởi người dùng.

Cảm ơn,

Tim

+1

tại sao bạn không sử dụng tiêu đề UITableView? Bạn có thể đặt văn bản ở đó hoặc tạo chế độ xem tùy chỉnh. Có các phương thức của UITableViewDelegate cho rằng – Novarg

Trả lời

13

Tôi đã chơi về điều này và tôi đã đưa ra một giải pháp đơn giản.

Đầu tiên, chúng tôi thêm một thuộc tính UITableViewCell vào bộ điều khiển. Điều này nên được khởi tạo như vậy trông giống hệt như các ô hàng mà chúng ta sẽ sử dụng để tạo ra các tiêu đề phần sai.

Tiếp theo, chúng ta đánh chặn di chuyển của xem bảng

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
{ 
    // Add some logic here to determine the section header. For example, use 
    // indexPathsForVisibleRows to get the visible index paths, from which you 
    // should be able to get the table view row that corresponds to the current 
    // section header. How this works will be implementation dependent. 
    // 
    // If the current section header has changed since the pervious scroll request 
    // (because a new one should now be at the top of the screen) then you should 
    // update the contents. 

    IndexPath *indexPathOfCurrentHeaderCell = ... // Depends on implementation 
    UITableViewCell *headerCell = [self.tableView cellForRowAtIndexPath:indexPathOfCurrentHeaderCell]; 

    // If it exists then it's on screen. Hide our false header 

    if (headerCell) 
     self.cellHeader.hidden = true; 

    // If it doesn't exist (not on screen) or if it's partially scrolled off the top, 
    // position our false header at the top of the screen 

    if (!headerCell || headerCell.frame.origin.y < self.tableView.contentOffset.y) 
    { 
     self.cellHeader.hidden = NO; 
     self.cellHeader.frame = CGRectMake(0, self.tableView.contentOffset.y, self.cellHeader.frame.size.width, self.cellHeader.frame.size.height); 
    } 

    // Make sure it's on top of all other cells 

    [self.tableView bringSubviewToFront:self.cellHeader]; 
} 

Cuối cùng, chúng ta cần phải ngăn chặn các hành động trên tế bào đó và làm điều đúng ...

+0

Cảm ơn rất nhiều, tarmes. Tôi đang tìm kiếm những điều tương tự và cũng cần thực hiện logic của bạn trong ứng dụng của tôi. Tuy nhiên, tôi không thể có được headerCell bạn có nghĩa là gì? Và khi bạn có nghĩa là headerCell là trên màn hình? – Hai

+0

Tiêu đềCell là ô trong chế độ xem bảng mà bạn muốn ở trên cùng của bảng khi nó được cuộn. – tarmes

+0

Câu hỏi: Bạn nói bạn sử dụng quyền này để có thể sắp xếp lại các tiêu đề. Bạn có thu gọn các ô nội dung để làm cho tiêu đề sắp xếp lại dễ dàng hơn không?Tôi đã suy nghĩ về nó nhưng không chắc chắn nếu nó có thể, như 'reloadData' hoặc loại khác của bản cập nhật xem bảng có thể sẽ làm gián đoạn/hoàn nguyên ô tiêu đề nổi. – Ixx

2

Đó là hành vi mặc định cho phần tiêu đề trong đồng bằng UITableView trường. Nếu bạn muốn tạo tiêu đề tùy chỉnh, hãy triển khai phương thức tableView:viewForHeaderInSection: trong ủy quyền xem bảng của bạn và trả lại chế độ xem cho tiêu đề của bạn.

Mặc dù bạn sẽ phải quản lý các phần và hàng thay vì chỉ các hàng.

+0

Vấn đề là tôi muốn có thể ghi các tiêu đề phần. Theo như tôi có thể nói không có giao diện người dùng nào sẽ cho phép người dùng thực hiện điều đó theo cùng một cách như họ hiện có thể kéo các phần của hàng về ... – tarmes

+0

Tôi hiểu, bạn sẽ phải tự mình xử lý. Có vẻ hơi phức tạp nhưng tôi chắc chắn nó có thể được thực hiện. Có vẻ như không có gì được thực hiện ngoài kia. Có lẽ tôi có thể giúp bạn với nó và chúng tôi có thể đặt nó trên Github hoặc một cái gì đó. –

+0

Thật thú vị, bây giờ có một moveSection: toSection: gọi trong iOS5, nhưng tôi không nghĩ rằng có một cách để bắt đầu di chuyển này từ giao diện người dùng ... – tarmes

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