2013-08-10 32 views
7

Tôi đang chèn phần mới (phần chứa 3 ô) trên cùng của UITableView trong khi SCROLLING TOP.Chèn phần UITableView ở trên cùng trong khi cuộn

 [_mainTable beginUpdates]; 
     [_mainTable insertSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationNone]; 
     [_mainTable endUpdates]; 

Mục được chèn đúng cách. Nhưng nó đưa tôi lên trên Bảng, tức là ô 0 hoặc hàng 0. Tôi muốn giao dịch này được suôn sẻ. Tôi có thể chèn

[_mainTable scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:1 inSection:1] atScrollPosition:UITableViewScrollPositionBottom animated:NO]; 

sau khi kết thúcDanh sách sẽ hiển thị nhanh chóng vì nó đưa bạn lên trên cùng rồi bỗng di chuyển nó đến vị trí cuối cùng của bạn.

Làm cách nào tôi có thể làm cho nó mượt mà.

Cảm ơn

Trả lời

9

tôi đã không thực hiện kiểm tra toàn diện về vấn đề này, nhưng điều này dường như hứa hẹn:

  1. Xác định NSIndexPath của một trong những tế bào có thể nhìn thấy.
  2. Nhận rectForRowAtIndexPath.
  3. Lấy số contentOffset hiện tại của bảng.
  4. Thêm phần, nhưng gọi reloadData thay vì insertSections (ngăn cản việc di chuyển chú thích).
  5. Nhận các cập nhật rectForRowAtIndexPath mà bạn có ở bước 2.
  6. Cập nhật contentOffset bởi sự khác biệt của kết quả từ bước 5 và bước 2.

Như vậy:

[self.sections insertObject:newSection atIndex:0]; // this is my model backing my table 

NSIndexPath *oldIndexPath = self.tableView.indexPathsForVisibleRows[0]; // 1 
CGRect before = [self.tableView rectForRowAtIndexPath:oldIndexPath];  // 2 
CGPoint contentOffset = [self.tableView contentOffset];     // 3 
[self.tableView reloadData];            // 4 
NSIndexPath *newIndexPath = [NSIndexPath indexPathForRow:oldIndexPath.row inSection:oldIndexPath.section + 1]; 
CGRect after = [self.tableView rectForRowAtIndexPath:newIndexPath];  // 5 
contentOffset.y += (after.origin.y - before.origin.y); 
self.tableView.contentOffset = contentOffset;        // 6 
+1

Cảm ơn bạn rất nhiều bạn đời. Tôi đã đấu tranh với điều này từ lâu. – Mann

+0

Mặc dù ở trên mã hoạt động như quyến rũ nhưng đối với sự hiểu biết cá nhân của tôi tôi didnot nhận được điểm 5. Tại sao chúng ta cần hình chữ nhật cũ ở đây? Tôi sẽ rất biết ơn nếu bạn xóa nó – Mann

+1

@mann Tôi đã chỉ cố gắng để xem có bao nhiêu một trong những hàng nhìn thấy được chuyển xuống. Vì vậy, tôi nhận được rect cho một hàng nhìn thấy trước khi chèn và một lần nữa, sau đó, và sau đó sử dụng sự khác biệt giữa 'y' giá trị để điều chỉnh' contentOffset' nên để hàng xuất hiện trong cùng một vị trí như trước. – Rob

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