2009-08-31 39 views
18

Tôi có một UITableView có nội dung đang thay đổi động, giống như một ngăn xếp FIFO. Các ô được thêm vào dưới cùng và bị xóa khỏi đầu.Cách cuộn UITableView vào bảngFooterView

Công trình này đẹp và tôi có thể cuộn đến indexPath để thư mới nhất luôn cuộn xuống dưới cùng (Giống như ứng dụng trò chuyện).

Bây giờ .. Tôi muốn thêm chân trang vào phần bảng đó. Thay vì sử dụng

SrollToRowAtIndexPath

Tôi muốn để có thể di chuyển đến tableFooterView.

Bất kỳ ý tưởng nào tôi có thể làm điều đó sẽ được đánh giá cao.

Trả lời

-4

Tôi chưa thử nhưng điều gì xảy ra khi bạn cuộn đến hàng cuối cùng + 1?

Một ý tưởng khác là luôn thêm một mục nhập giả ở cuối và làm cho nó có giao diện khác để nó được xem như một chân trang. Sau đó, bạn luôn có thể cuộn đến đó.

+1

Bạn nhận được một trong số lỗi phạm vi :(Tôi nên nói rằng tôi đã thử rằng một trong những đã có trong bài gốc. – Kevin

3

Kể từ UITableView là một lớp con của UIScrollView, bạn có thể di chuyển đến bất cứ nơi nào bạn thích bằng cách sử dụng phương pháp UIScrollView

- (void)scrollRectToVisible:(CGRect)rect animated:(BOOL)animated

Chỉ cần đặt rect để khi nó có thể nhìn thấy chân có thể nhìn thấy, và bạn sẽ có của bạn giải pháp (bạn có thể sử dụng footer rect hoặc cái gì khác, chỉ cần miễn là bạn có được hành vi đúng tất cả các thời gian).

4

Có lẽ cái gì đó như:

[tableView setContentOffset:CGPointMake(0, tableView.contentSize.height) animated:YES]; 
1

Cách đơn giản nhất để làm điều này là sử dụng UITableViewScrollPositionTop vào hàng cuối cùng trong phần cuối. Này hoạt động rất tốt cho tôi ...

[tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:LAST_ROW inSection:LAST_SECTION] atScrollPosition:UITableViewScrollPositionTop animated:YES]; 

Hãy chắc chắn rằng bạn Bảng Footer Xem cũng được cách nhau ra ở phía dưới và nó nên ngồi độc đáo hoạt hình bên trong xem ...

Hope this helps .. .

0

ý tưởng tuyệt vời, đang tìm kiếm này bản thân mình :) Dưới đây là mẫu mã, mà sẽ làm các trick:

[tableView reloadData]; 
NSIndexPath *index = [NSIndexPath indexPathForRow:0 inSection:1]; 
[tableView scrollToRowAtIndexPath:index 
    atScrollPosition:UITableViewScrollPositionBottom animated:YES]; 

bạn pHẢI có ít nhất một tế bào ở chân trang tableView của bạn, vấn đề là nó sẽ hiển thị. Không có thời gian để kiểm tra, nhưng tôi đoán bạn có thể làm cho nó thực sự nhỏ?

Ngoài ra bạn phải thực hiện những thứ đúng bên numberOfSectionsInTableView (ít nhất là một cho bảng và một cho footer), numberOfRowsInSection (ít nhất là một cho footer, phần cuối cùng của bạn), viewForHeaderInSection (nil trừ di động của bạn), heightForHeaderInSection (có thể nếu bạn thiết lập này là không), cellForRowAtIndexPath (thêm trường hợp đặc biệt cho di động của bạn trong chân trang) ...

Đó nên là đủ.

25

Cách tốt nhất để cuộn UITableView xuống cuối footerView của nó là chỉ cần đặt bù đắp nội dung. Bạn có thể tính toán đáy bằng cách sử dụng contentSize và hiện tại bounds

Đây là cách tôi làm điều đó.

CGPoint newContentOffset = CGPointMake(0, [self.instanceOfATableView contentSize].height - self.instanceOfATableView.bounds.size.height); 

[self.instanceOfATableView setContentOffset:newContentOffset animated:YES]; 
+0

Tôi chỉ quản lý để làm cho nó hoạt động khi tôi thêm một sự chậm trễ sau khi gọi lại reloadTable: [self performSelector: @selector (scrollToBottom) withObject: nil afterDelay: 0.3] – Centurion

0

Tôi đang sử dụng này:

- (void)scrollToBottom{ 
    [self.myTable scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:[self.fetchedResultsController.fetchedObjects count] -1 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:YES]; 

}

13

Nhờ iphone_developer đây là những gì tôi đã làm:

[tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:[tableView numberOfRowsInSection:0]-1 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:YES]; 

Sau đó, khi tôi đang bổ sung thêm hàng, tôi đang gọi điều này và chế độ xem chân trang của tableView của tôi tiếp tục hiển thị

+0

điều này sẽ di chuyển đến toppest không dưới – khalil

+2

Không, [tableView numberOfRowsInSection: 0] -1 là hàng cuối cùng, do đó, di chuyển đến vị tríTop trên này hàng sẽ thực sự cuộn tableView xuống dưới cùng – Bejil

+0

@Beji điều này giả sử bạn chỉ có một phần – Jessedc

27

Tôi đang sử dụng tính năng này để cuộn đến chế độ xem chân trang của bảngView:

[self.tableView scrollRectToVisible:[self.tableView convertRect:self.tableView.tableFooterView.bounds fromView:self.tableView.tableFooterView] animated:YES]; 
+2

Đơn giản và dễ sử dụng ở mọi nơi! –

+0

+1! đây là câu trả lời đúng, mọi câu trả lời khác mà tôi đã thử nghiệm không hoạt động chính xác trong những trường hợp nhất định. – JohnPayne

+0

Về lý thuyết là tốt, trong thực tế nó không thể bị xích với các cập nhật xem bảng - như chèn và xóa các hàng trong khi chế độ xem bảng đang hoạt ảnh. scrollToIndexPath hoạt động cho rằng – n13

1

Điều này phù hợp với tôi!

CGRect footerBounds = [addCommentContainer bounds]; 
CGRect footerRectInTable = [tableview convertRect:footerBounds fromView:addCommentContainer]; 
[tableview scrollRectToVisible:footerRectInTable animated:YES]; 
2

Câu trả lời cuối của tôi dành cho nhà phát triển, những người cần hiển thị chân trang khi bàn phím được hiển thị. Các giải pháp đúng là phải xem xét tài sản contentInset (có thể được thay đổi sau khi bàn phím được hiển thị), vì vậy nó là siêu dễ dàng:

- (void)scrollToFooter { 
    UIEdgeInsets tableInsets = self.tableView.contentInset; 
    CGFloat tableHeight = self.tableView.frame.size.height - tableInsets.bottom - tableInsets.top; 
    CGFloat bottom = CGRectGetMaxY(self.tableView.tableFooterView.frame); 
    CGFloat offset = bottom - tableHeight; 
    if(offset > 0.f) { 
    [self.tableView setContentOffset:CGPointMake(0, offset) animated:YES]; 
    } 
} 

tôi phải để ý, mà trong trường hợp của tôi tableView đã được thêm vào ViewController của riêng tôi và là một trong các ô có UITextField trở thành đáp ứng đầu tiên. Để di chuyển chân trang hiển thị khi bàn phím được hiển thị, bạn cần đăng ký bàn phím đã hiển thị thông báo và (trên iOS7) thực hiện phương thức này vào cuối vòng lặp hiện tại, coz trong trường hợp này iOS7 sẽ tự động thực hiện scrollToRowAtIndexPath sau khi phương thức và chân trang của chúng tôi sẽ không được hiển thị.

-(void)registerKeyboardNotification { 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(keyboardDidShown:) 
               name:UIKeyboardDidShowNotification object:nil]; 
} 

- (void)keyboardDidShown:(id)notification { 
    //move to the end of run loop 
    [self performSelector:@selector(scrollToFooter) withObject:nil afterDelay:.0]; 
} 
11

Rất nhiều câu trả lời kém. :-)

Cách NHẤT:

[self.tableView scrollRectToVisible: 
    self.tableView.tableFooterView.frame animated:YES 
]; 
+0

Điều này giả định rằng 'tableFooterView' sẽ luôn là một subview trực tiếp của' tableView' hoặc nó nằm ở gốc của bất kỳ khung nhìn trung gian nào. Mặc dù điều này có thể hoạt động ngay bây giờ, nhưng không có gì đảm bảo rằng hệ thống phân cấp subview 'tableView' sẽ giữ nguyên trong các phiên bản iOS trong tương lai. – Ned

+0

@Kumar KL, tính năng này không hoạt động với chân trang tùy chỉnh và nhiều chân trang. –

0

Công việc này với tôi:

- (void)tableViewScrollToBottomAnimated:(BOOL)animated { 
    NSInteger numberOfRows = [self.tableView numberOfRowsInSection:0]; 
    if (numberOfRows) { 
     if (self.tableView.tableFooterView) { 
      [self.tableView scrollRectToVisible: 
      self.tableView.tableFooterView.frame animated:YES 
      ]; 
     } else { 
      [self.tableView scrollToRowAtIndexPath: 
      [NSIndexPath indexPathForRow:numberOfRows-1 inSection:0] 
            atScrollPosition:UITableViewScrollPositionBottom 
              animated:animated 
      ]; 
     } 
    } 
} 
0

này làm việc cho tôi trong Swift 4

func addRow() { 
    tableView.beginUpdates() 
    tableView.insertRows(at: [IndexPath(row: array.count - 1, section: 0)], with: .automatic) 
    tableView.endUpdates() 

    DispatchQueue.main.async { 
     self.scrollToBottom() 
    } 
} 

func scrollToBottom() { 
    let footerBounds = tableView.tableFooterView?.bounds 
    let footerRectInTable = tableView.convert(footerBounds!, from: tableView.tableFooterView!) 
    tableView.scrollRectToVisible(footerRectInTable, animated: true) 
} 
Các vấn đề liên quan