2013-03-06 22 views
7

Dưới đây là mã override của tôi - nó chỉ tính toán nơi để chụp để:UIScrollView không phải lúc nào động giảm tốc độ khi trọng scrollViewWillEndDragging

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

    if(targetContentOffset->y < 400) { 
     targetContentOffset->y = 0; 
     return; 
    } 

    int baseCheck = 400; 

    while(baseCheck <= 10000) { 
     if(targetContentOffset->y > baseCheck && targetContentOffset->y < baseCheck + 800) { 
      targetContentOffset->y = (baseCheck + 340); 
      return; 
     } 
     baseCheck += 800; 
    } 

    targetContentOffset->y = 0; 
} 

Khi tôi giữ ngón tay của tôi xuống hơn một hoặc hai giây để kéo scrollview và sau đó nhấc ngón tay của tôi, nó thường hoạt hình vào vị trí. Tuy nhiên, khi tôi thực hiện một "flick" nhanh, nó hiếm khi hoạt hình - nó chỉ snaps đến targetContentOffset. Tôi đang cố gắng mô phỏng hành vi phân trang mặc định (ngoại trừ việc cố gắng chụp các vị trí tùy chỉnh).

Bất kỳ ý tưởng nào?

Trả lời

6

Tôi đã kết thúc việc tạo hiệu ứng theo cách thủ công. Trong cùng một hàm, tôi đặt targetContentOffset ở nơi người dùng rời khỏi (current contentOffset) để nó không kích hoạt hoạt ảnh của riêng nó, và sau đó tôi đặt contentoffset cho phép tính của mình. Ngoài ra, tôi đã thêm vào một kiểm tra tốc độ để kích hoạt các thay đổi trang 'tự động'. Nó không hoàn hảo, nhưng hy vọng nó sẽ giúp khác với cùng một vấn đề.

(tôi sửa đổi chức năng trên cho dễ đọc vì không ai cần phải thấy tính toán của tôi)

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

    CGPoint newOffset = CGPointMake(targetContentOffset->x, targetContentOffset->y); 
    *targetContentOffset = CGPointMake([broadsheetCollectionView contentOffset].x, [broadsheetCollectionView contentOffset].y); 

    if(velocity.y > 1.4) { 
     newOffset.y += pixelAmountThatWillMakeSurePageChanges; 
    } 
    if(velocity.y < -1.4) { 
     newOffset.y -= pixelAmountThatWillMakeSurePageChanges; 
    } 

    // calculate newoffset 

    newOffset.y = calculatedOffset; 
    [scrollView setContentOffset:newOffset animated:YES]; 
} 
+5

tôi đã cố gắng điều này với một UICollectionView ngang, và trong khi nó làm việc, các hình ảnh động kết quả là bồn chồn; Tôi nghĩ có hai hình động đang diễn ra cùng một lúc. Gói 'setContentOffset:' trong 'dispatch_async' đã sửa nó. – JLundell

+0

Bạn đã bao giờ làm cho nó 'hoàn hảo' cách? – Lukasz

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