2011-10-17 36 views
10

Có cách nào để tạo ô cuộn UITableViews vào ô không? Nghĩa là, phần trên của Chế độ xem bảng luôn là đầu của một UITableViewCell.Force UITableView để cuộn đến đỉnh của các ô

Tôi đã thử cờ pageation, nhưng điều đó dường như cuộn toàn bộ "trang". Tôi chỉ muốn di chuyển ô.

Cảm ơn

Trả lời

20

UTTableView là một lớp con của UIScrollView, vì vậy bạn có thể sử dụng phương pháp scrollViewDidScroll để sắp xếp lại vị trí cuộn TableView của bạn sau khi di chuyển.

Bạn có thể sử dụng tableView.contentOffset để biết vị trí cuộn hiện tại của bạn ở đâu. Và bằng cách chia nó thành một số có ý nghĩa, bạn có thể nhận được ô nào ở trên cùng.

int cellIndex = tableView.contentOffset/cellHegiht; 

Hoặc bạn có thể nhận tế bào hiện có thể nhìn thấy trên trung tâm (trên, dưới) như thế này:

NSArray *indexPathsForVisibleRows = [tableView indexPathsForVisibleRows]; 
NSIndexPath *selectedIndexPath = [indexPathsForVisibleRows objectAtIndex:(indexPathsForVisibleRows.count/2)]; //this gets center cell 

Sau khi tính mà tế bào cần được bấm bằng cạnh của nó trên đầu (hoặc cuối), bạn có thể sửa trôi dạt từ mép tế bào bằng cách gọi:

[tableView scrollToRowAtIndexPath:selectedIndexPath atScrollPosition:UITableViewScrollPositionTop animated:YES]; 

Bạn có thể sử dụng các phương pháp để kích hoạt UIScrollViewDelegate snapping. Bạn có thể kích hoạt khi hoạt ảnh cuộn hoàn thành hoặc trong khi hoạt ảnh vẫn tiếp tục. Điều này sẽ tạo ra sự tương tác của người dùng khác nhau và không thể nói là một tương tác tốt hơn thì khác.

Nhưng chỉ thực hiện phương pháp sau đây và không có gì khác trông giống như sẽ yêu thích của tôi:

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView 
        withVelocity:(CGPoint)velocity 
       targetContentOffset:(inout CGPoint *)targetContentOffset { 
    int cellHeight = 41; 
    *targetContentOffset = CGPointMake(targetContentOffset->x, 
             targetContentOffset->y - (((int)targetContentOffset->y) % cellHeight)); 
} 

Phương pháp này được gọi khi người dùng chạm lên trên TableView để thông báo cho ứng dụng. targetContentOffset là biến số inout để bạn thực sự có thể đặt vị trí cuộn cuối cùng trong khi hoạt ảnh đang tiếp tục. Sử dụng đúng cellHeight, TableView của bạn sẽ luôn chụp nhanh các ô.

+2

Cảm ơn bạn đã cho biết cách sử dụng biến 'inout'. Tính năng rất đẹp! – Besi

+0

+1 Tôi cũng cảm ơn bạn đã chỉ ra biến "inout". – jpswain

+0

Với toán học của bạn - bạn không bao giờ có thể di chuyển đến hàng cuối cùng trong bảng ... không phải là một vấn đề để khắc phục mặc dù. - chắc chắn là giải pháp tốt nhất cho việc này. – scottbates22

0

Bạn chỉ cần gọi scrollToRowAtIndexPath:atScrollPosition:animated: và chuyển cho nó đường dẫn chỉ mục phù hợp cho ô bạn muốn.

1

Mặc dù hoàn toàn chính xác, tôi không tìm thấy câu trả lời bởi @randle rất hữu ích. Tôi đọc tài liệu dành cho nhà phát triển và tôi thậm chí còn bối rối hơn. Làm cách nào để cuối cùng tôi phát hiện ra câu trả lời đơn giản như thế nào, nhưng đôi khi chúng ta cần một chút giúp đỡ nhiều hơn là "gọi phương thức này". Xem dưới chú thích // cuộn tới hàng! tại đây:

- (BOOL)textFieldShouldReturn:(UITextField *)textField 
{ 
    if (textField == self.firstInput) { 
     [self.secondInput becomeFirstResponder]; 

     // scroll to row! 
     [self.tableView scrollToRowAtIndexPath: // use the method 
      [NSIndexPath indexPathForRow:1  // get 2nd row (nth row...) 
           inSection:0] // in 1st section (...) 
         // set position: you can use bottom, middle or top. 
         atScrollPosition:UITableViewScrollPositionBottom 
           animated:YES]; // YES or NO. 

    } else if (textField == self.secondInput) { 
     [textField resignFirstResponder]; 
    } 
    return YES; 
} 

Bây giờ, đây là bảng tĩnh ôXem. Tôi biết số lượng hàng, tôi biết tôi sẽ đi đến hàng nào. Điều này có thể được mở rộng ra để mã tốt hơn, và truy cập các biến theo lập trình, nhưng nó cho thấy mã này hoạt động như thế nào trong thực tế ở mức thấp.

Tôi hy vọng điều này sẽ thêm một lớp hữu ích cho bất kỳ ai khác đang tìm kiếm diễn đàn.

Tôi đã làm một ghi hoàn chỉnh lên của phương pháp ở đây: http://iosanswers.blogspot.com/2012/02/table-view-forms-scroll-to-selected.html

3

Nếu bạn có phần, tôi thấy điều này phương pháp đáng tin cậy nhất:

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate(BOOL)decelerate { 
    if (decelerate == NO) { 
     [self autoAdjustScrollToTop]; 
    } 
} 
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { 
    [self autoAdjustScrollToTop]; 
} 
- (void)autoAdjustScrollToTop { 
    // compare the top two visible rows to the current content offset 
    // and auto scroll so that the best row is snapped to top 
    NSArray *visibleRows = [self.tableView indexPathsForVisibleRows]; 
    NSIndexPath *firstPath = visibleRows[0]; 
    NSIndexPath *secondPath = visibleRows[1]; 
    CGRect firstRowRect = [self.tableView rectForRowAtIndexPath:firstPath]; 
    [self.tableView scrollToRowAtIndexPath:(firstRowRect.origin.y > self.tableView.contentOffset.y ? firstPath : secondPath) atScrollPosition:UITableViewScrollPositionTop animated:YES]; 
} 
1

Cách tiếp cận này xử lý một cái nhìn bảng với thay đổi chiều cao dòng . Nó giả định xem bảng có một phần duy nhất.

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView 
        withVelocity:(CGPoint)velocity 
       targetContentOffset:(inout CGPoint *)targetContentOffset { 

    // Find the row where the animation will currently end. 
    NSInteger targetRow = [[self.tableView indexPathForRowAtPoint:*targetContentOffset] row]; 

    // Tell the animation to end at the top of that row. 
    *targetContentOffset = [self offsetForTopOfRow:targetRow]; 
} 

Khoản chênh lệch được tính bằng phương pháp trợ giúp này, tính tổng chiều cao của tất cả các hàng phía trên hàng mục tiêu.

- (CGPoint)offsetForTopOfRow:(NSInteger)row { 

    CGPoint offset = CGPointZero; 

    for (int i = 0; i < row; i++) { 
     NSIndexPath *indexPath = [NSIndexPath indexPathForRow:i inSection:0]; 
     CGFloat height = [self.tableView.delegate tableView:self.tableView heightForRowAtIndexPath:indexPath]; 
     offset.y += height; 
    } 

    return offset; 
} 
0

Điều này hoạt động tốt nếu bạn có các phần và hàng có chiều cao tĩnh.

func scrollViewWillEndDragging(scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) { 
    // Adjust target offset so that cells are snapped to top 
    let cellHeight: CGFloat = 44 
    let headerHeight: CGFloat = 30 
    let section = (indexPathsForVisibleRows?.first?.section ?? 0) + 1 
    targetContentOffset.memory.y -= (targetContentOffset.memory.y % cellHeight) - (CGFloat(sectionIndex) * headerHeight) 
} 
Các vấn đề liên quan