2012-09-04 30 views
5

Tôi đang cố triển khai phân trang cho các trang có kích thước tùy chỉnh trong UITableView. Những gì tôi đang cố gắng đạt được là để phía trên cùng của ô hoạt động căn chỉnh với đầu bảng của bảngView, trong khi vẫn hiển thị đầu ô kế tiếp ở cuối bảngView (để nghiêng người dùng cuộn và xem thêm ô).UITableView với hành vi giống như phân trang tùy chỉnh

Các ô của tôi có chiều cao bằng nhau.

Nếu tôi đặt paging=YES kết quả này ở mức bù nhẹ tăng khi tôi lướt qua các trang. Điều này là do tableView của tôi hơi cao hơn một ô duy nhất và chiều cao của ô/kích thước trang không căn chỉnh.

Tôi đã thử những thứ khác nhau khi bật phân trang. Tôi đã thử thiết lập kích thước của tableView với chiều cao của ô, nhưng sau đó tắt cắt và che mặt nạ để người dùng vẫn có thể thấy ô kế tiếp. Điều này không hoạt động vì ô tiếp theo chỉ được thêm vào scrollView bên dưới vào ms cuối cùng trước khi ô cuộn vào hộp giới hạn của tableView.

Sau đó tôi bắt đầu triển khai các phương thức ủy nhiệm scrollView khác nhau để bắt chước hành vi phân trang - dường như tôi không thể làm đúng.

Tôi đã, trong số những thứ khác, cố gắng một cái gì đó như thế này:

- (void) scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset 
{ 
    float cellHeight = [myCell rowHeight]; 
    int index = floorf(scrollView.contentOffset.y/cellHeight); 

    *targetContentOffset = CGPointMake(targetContentOffset->x, targetContentOffset->y = (index * cellHeight)); 
} 

Trong khi đó loại làm điều đúng đắn, nó cư xử không có gì giống như một scrollview/tableView với phân trang được kích hoạt.

Tôi đã tìm thấy một vài bài đăng ở đây từ những người đang cố gắng đạt được điều tương tự, nhưng câu trả lời bị "không có nguồn gốc tự nhiên" mà bất cứ điều gì tôi đã cố gắng làm.

Cảm ơn bạn đã trợ giúp.

iOS> = 5.0

+0

bạn có hoạt động không? – aqs

+0

@aqs xin lỗi không, nó không bao giờ thực sự làm việc đủ tốt để đặt ra làm trang. – RickiG

+0

đừng bận tâm. Tôi đã https://github.com/100grams/HGPageScrollView này và sửa đổi để làm cho nó cuộn theo chiều dọc. phục vụ mục đích của tôi – aqs

Trả lời

3

Nếu bạn tắt phân trang, bạn có thể sử dụng chức năng UIScrollView đại biểu:

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

    // Get index path for target row 
    NSIndexPath* indexPath = [self.tableView indexPathForRowAtPoint:(*targetContentOffset)]; 

    // Set new target 
    (*targetContentOffset) = [self.tableView rectForRowAtIndexPath:indexPath].origin; 

} 
11

Thực hiện scrollViewWillEndDragging:withVelocity:targetContentOffset: trở lại top phối hợp của các tế bào gần targetContentOffset, không gần gũi nhất với khởi đầu của bạn bù lại. Các giải pháp jjv360 cung cấp không tốt, nhưng bạn có thể muốn tinh chỉnh nó một chút tùy thuộc vào mức độ trung bình của các tế bào của bạn (giải pháp của jjv360 có thể quá linh hoạt trên các tế bào thực sự lớn).

Tôi chỉ muốn thêm rằng bạn có thể giảm tốc độ nhanh hơn UITableView để hoạt động giống như paged UIScrollView bằng cách thay đổi thuộc tính decelerationRate (chỉ cần thực hiện một lần trong init/viewDidLoad/anywhere).

self.tableView.decelerationRate = UIScrollViewDecelerationRateFast; 
+0

Cảm ơn Filip, tôi sẽ thử ngay bây giờ.Khi phân trang với hành vi tự nhiên, bạn không thể nhảy nhiều trang, điều này sẽ xảy ra nếu tôi kẹp điểm cuối tới targetContentOffset - nó chỉ cần là ô kế tiếp hoặc trước đó. decelerationRate - Tôi chưa từng thấy điều đó trước đây, tuyệt vời :) – RickiG

+0

Có vẻ như tính năng giảm tốc không hoạt động khi bật phân trang. Cảm ơn bạn đã trỏ API này :) – Tomasz

1

tôi giải quyết vấn đề này với mã này:

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

    CGFloat pageWidth = self.collectionView.frame.size.width + 10 /* Optional Photo app like gap between images */; 

    _currentPage = floor((self.collectionView.contentOffset.x - pageWidth/2)/pageWidth) + 1; 

    NSLog(@"Dragging - You are now on page %i", _currentPage); 
} 

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

    CGFloat pageWidth = self.collectionView.frame.size.width + 10; 

    int newPage = _currentPage; 

    if (velocity.x == 0) // slow dragging not lifting finger 
    { 
     newPage = floor((targetContentOffset->x - pageWidth/2)/pageWidth) + 1; 
    } 
    else 
    { 
     newPage = velocity.x > 0 ? _currentPage + 1 : _currentPage - 1; 

     if (newPage < 0) 
      newPage = 0; 
     if (newPage > self.collectionView.contentSize.width/pageWidth) 
      newPage = ceil(self.collectionView.contentSize.width/pageWidth) - 1.0; 
    } 

    NSLog(@"Dragging - You will be on %i page (from page %i)", newPage, _currentPage); 

    *targetContentOffset = CGPointMake(newPage * pageWidth, targetContentOffset->y); 
} 

Nhờ http://www.mysamplecode.com/2012/12/ios-scrollview-example-with-paging.html để chỉ một cách đúng đắn.

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