2013-08-12 27 views
5

Tôi có chế độ xem bảng thực hiện hoạt ảnh khi người dùng cuộn xuống trên UITableView (đẩy ngón tay cái lên) và hoạt ảnh khác khi người dùng cuộn lên (Nhấn ngón tay cái xuống) trên UITableView .Phát hiện "thư bị trả lại" dưới cùng của UITableView

Vấn đề là khi người dùng đến cuối một UITableView và nó bị trả lại, bảng đăng ký một chuyển động lên và sau đó xuống, do đó thực hiện các hình ảnh động khi nó không nên.

Hành vi tương tự chính xác này xảy ra khi cuộn lên trên cùng; tuy nhiên, tôi có thể phát hiện ra nó như vậy:

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView { 

    self.lastContentOffset = scrollView.contentOffset; 

} 


-(void) scrollViewDidScroll:(UIScrollView *)scrollView { 

    // Check if we are at the top of the table 
    // This will stop animation when tableview bounces 

    if(self.tableView.contentOffset.y < 0){ 
     // Dont animate, top of tableview bounce 


    } else { 

     CGPoint currentOffset = scrollView.contentOffset; 

     if (currentOffset.y > self.lastContentOffset.y) { 

      // Downward animation 
      [self animate:@"Down"]; 

     } else { 

      // Upward 
      [self animate:@"Up"]; 

     } 

     self.lastContentOffset = currentOffset; 

    } 

} 

Điều này làm việc hoàn hảo, nhưng đối với cuộc sống của tôi, tôi cũng không thể tìm ra điều kiện để phát hiện đáy. Tôi chắc chắn nó là đơn giản và tôi chỉ không thể tìm ra nó.

Trả lời

28

Làm thế nào về một cái gì đó như thế này:

if (self.tableView.contentOffset.y >= (self.tableView.contentSize.height - self.tableView.bounds.size.height)) 
{ 
    // Don't animate 
} 
+0

Đúng vậy! Tôi có thể thề rằng tôi đã thử điều đó, nhưng rất có thể tôi đã làm rối tung các nhà khai thác của mình. Cảm ơn rất nhiều! –

+5

Bạn cần đăng nhập vào contentInset. Nếu được đặt thành một cái gì đó lớn hơn 0, điều này sẽ không hoạt động. Sử dụng điều này thay vào đó: 'if (self.tableView.contentOffset.y - self.tableView.contentInset.bottom> = self.tableView.contentSize.height - self.tableView.bounds.size.height)'. Ngoài ra, điều này làm việc cho tất cả các lớp con của UIScrollView (UICollectionView và UITableView). –

+0

Điều này sẽ KHÔNG làm việc với các bảng phân cảnh và kích thước. Kiểm tra câu trả lời của tôi ở đây. – Ashok

0

Trong Todays lần (Xcode 7), bên dưới mã nên giải quyết hầu hết các trường hợp sử dụng vì nó chiếm UIScrollView (và đó là lớp con UITableView và UICollectionView) insets, kịch bản duy nhất cho nhiều thiết bị (ví dụ: các lớp kích thước) -

func scrollViewDidScroll(scrollView: UIScrollView) { 
    if (Int(scrollView.contentOffset.y + scrollView.frame.size.height) == Int(scrollView.contentSize.height + scrollView.contentInset.bottom)) { 
     if !isFetching { 
      isFetching = true 
      fetchAndReloadData(true) 
     } 
    } 
} 

PS: Thông báo Int() và == quan trọng để kích hoạt sự kiện một lần.

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