2009-06-12 20 views
25

Tôi có một UITableView có nguồn dữ liệu và đại biểu được chuyển đổi giữa một vài đối tượng nguồn dữ liệu tùy chỉnh khi người dùng chạm vào một điều khiển được phân đoạn. Đã trả "vs" Miễn phí phổ biến nhất "trong ứng dụng cửa hàng ứng dụng).Lập trình buộc UIScrollView ngừng cuộn, để chia sẻ chế độ xem bảng với nhiều nguồn dữ liệu

Mỗi đối tượng nguồn dữ liệu tiết kiệm nội dung cuộn cuối cùng của nó bù đắp, và khôi phục nó khi nó trở thành nguồn dữ liệu hoạt động cho xem bảng bằng cách thực hiện:

tableView.contentOffset = CGPointMake(0, savedScrollPosition); 

này hoạt động tốt khi người dùng chuyển sang các nguồn dữ liệu khi bảng ở trạng thái nghỉ, nhưng nếu người dùng chạm vào điều khiển phân đoạn trong khi bảng vẫn đang di chuyển (tức là giảm tốc), thì chế độ xem bảng tiếp tục giảm tốc từ độ lệch cũ, ghi đè hiệu quả việc gán contentOffset của tôi.

Có cách nào để buộc chế độ xem bảng không dừng di chuyển/giảm tốc khi tôi đặt contentOffset hay cách khác để làm kiểu dạng xem bảng nguồn dữ liệu có thể chuyển đổi này hoạt động?

Trả lời

19

Bạn đã thử 2 phương pháp này chưa?

Chúng thực sự áp dụng cho "di chuyển" không chỉ bù đắp nội dung.

[self.tableView scrollToRowAtIndexPath:savedIndexPath atScrollPosition:UITableViewScrollPositionTop animated:NO]; 

OR:

[self.tableView scrollRectToVisible:savedFrame animated:NO]; 

Họ thực sự nên thực hiện việc di chuyển và mở rộng các khả năng tăng tốc của bảng, không chỉ là những gì xuất hiện trên màn hình.

+2

scrollRectToVisible đã làm điều đó, bằng cách sử dụng vị trí cuộn đã lưu làm gốc của rect và sử dụng các giới hạn của khung nhìn như chiều cao. Bạn hoàn toàn chính xác rằng các phương thức cuộn * điều khiển gia tốc theo cách thiết lập bù đắp nội dung không. –

+0

'scrollRectToVisible' cũng làm việc cho tôi. – zekel

-3

Bạn có thể thử làm

tableView.scrollEnabled = NO; 
tableView.scrollEnabled = YES; 

này có thể ngăn chặn các cuộn bằng cách tắt nó, sau đó cho phép nó một lần nữa. Tôi đã không thử điều này đặc biệt, nhưng tôi đã làm những điều tương tự.

+0

Tôi đã cố gắng thiết lập nó để NO , sau đó đặt contentOffset, sau đó đặt lại thành YES. Điều đó không hiệu quả, nhưng tôi cũng có thể thử trình tự NO-YES-offset và xem điều đó có tạo nên sự khác biệt hay không. –

0

Bạn có thể đợi thuộc tính 'giảm tốc' trở thành KHÔNG (ví dụ: bằng cách sử dụng KVO) và chuyển đổi sau đó.

+0

Vấn đề với điều đó là sẽ có sự chậm trễ đáng chú ý trước khi có thể thiết lập vị trí cuộn. –

13

Bạn đã thử sử dụng [view setContentOffset: offset animated: YES]?

+0

Tôi sẽ chụp. Nó không chính xác hành vi tôi muốn (tôi muốn vị trí cuộn để chụp ngay lập tức), nhưng nó có thể là đủ tốt. –

+8

Điều này làm việc cho tôi, sử dụng hoạt ảnh: KHÔNG. –

+0

hoạt hình đã thực hiện – Eugene

0

Một công việc rõ ràng xung quanh là có hai chế độ xem bảng riêng biệt được đổi chỗ và mỗi nguồn dữ liệu được gắn vĩnh viễn vào một trong các chế độ xem bảng. Điều này dường như chỉ là một chút lãng phí bộ nhớ, nhưng có lẽ tôi đang nghĩ quá nhiều.

2

Tôi đã sử dụng phương pháp của Corey. Tôi lưu & khôi phục các rects bằng biểu diễn từ điển. Ngoài ra, nó có thể không rõ ràng nhưng rect để bảo tồn & khôi phục là vọt của UITableView:

// Save the current tableview bounds 
CGRect contentRect = self.listTableView.bounds; 
if (!!oldScope) [_contentRects setObject:(NSObject *)CGRectCreateDictionaryRepresentation(contentRect) forKey:oldScope]; 

// Restore if possible 
CFDictionaryRef restoredFrameDict = (CFDictionaryRef)[_contentRects objectForKey:newScope]; 
if (!restoredFrameDict) restoredFrameDict = CGRectCreateDictionaryRepresentation(CGRectZero); 
CGRectMakeWithDictionaryRepresentation(restoredFrameDict, &contentRect); 

// Switch over to new datasource 
self.listTableView.dataSource = [self dataSourceForScope:newScope]; 
[self.listTableView reloadData]; 

// Restore content offset for "newScope"; Also stops scrolling 
[self.listTableView scrollRectToVisible:contentRect animated:NO]; 

Lưu ý việc sử dụng hoán đổi cho nhau của CFDictionaryRefNSDictionary *

4

Chỉ cần phát hiện này tìm kiếm một cách để dừng UIScrollView của tôi - Tôi cần phải di chuyển một số bản xem xét xung quanh, nhưng điều này không phù hợp nếu người dùng đã lật màn hình và nó vẫn đang giảm tốc.

Dù sao - scrollRectToVisible không hoạt động đối với tôi (có thể vì tôi không sử dụng chế độ xem bảng ??) nhưng điều này hoạt động hoàn hảo:

[mainScrollView setContentOffset:CGPointMake(mainScrollView.contentOffset.x, mainScrollView.contentOffset.y) animated:NO]; 

Sau đó tôi có thể thực hiện công việc này mà không phải lo lắng!

0

Đó là vấn đề của tôi khi tôi có UISwitch làm bộ chọn cho các bảng. Nhưng với sự kiểm soát phân đoạn tôi không có vấn đề gì. Có lẽ bạn đã không tải lại bảng? Đây là mảnh của tôi mã làm việc:

NSIndexPath *exPath = [[subTable indexPathsForVisibleRows] lastObject]; 

isMatchOn = [whatList selectedSegmentIndex] == 0 ? YES : NO; //table source will make the choice looking at this BOOL 

[subTable reloadData]; // here tables actually flip 

if (lastPosition) { 
    [subTable scrollToRowAtIndexPath:lastPosition atScrollPosition:UITableViewScrollPositionBottom animated:NO]; //I scroll to saved index 
    } 
self.lastPosition = exPath; //here I save the current position 
5

này làm việc độc đáo cho tôi:

if (self.tableView.isDecelerating) { 
     NSArray *paths = [self.tableView indexPathsForVisibleRows]; 
     [self.tableView scrollToRowAtIndexPath:[paths objectAtIndex:0] atScrollPosition:UITableViewScrollPositionTop animated:NO]; 

    } 
0

Bạn cũng có thể làm self.tableView.isScrollEnabled = true/false khi bạn nhận được một giá trị nhất định tableView.contentOffset.y

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