我有一個水平的UIScrollView
,我需要這個滾動視圖被分頁。但問題是,我還需要一個非頁面UIScrollView
的「慣性」效應。我一直在谷歌搜索和stackoverflow的一段時間,沒有運氣。帶有「慣性」但已分頁的UIScrollView。
任何想法或線索,所以我可以開始閱讀如何執行此任務?
謝謝!
我有一個水平的UIScrollView
,我需要這個滾動視圖被分頁。但問題是,我還需要一個非頁面UIScrollView
的「慣性」效應。我一直在谷歌搜索和stackoverflow的一段時間,沒有運氣。帶有「慣性」但已分頁的UIScrollView。
任何想法或線索,所以我可以開始閱讀如何執行此任務?
謝謝!
如果分頁被禁用,滾動視圖將拖動結束時調用您的委託。使用-scrollViewWillEndDragging:withVelocity:targetContentOffset:
方法(iOS 5和更高版本),您可以確定基於慣性的目標,並更改傳入的值以對其進行修改。例如,代理中的這段代碼將更改目標,以便滾動視圖會自動減速到其邊界大小的倍數。
- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView
withVelocity:(CGPoint)velocity
targetContentOffset:(CGPoint *)targetContentOffset {
CGSize pageSize = scrollView.bounds.size;
targetContentOffset->x = pageSize.width *
round(targetContentOffset->x/pageSize.width);
targetContentOffset->y = pageSize.height *
round(targetContentOffset->y/pageSize.height);
}
向您表示感謝的唯一方法是說:「我愛你」。這工作得很好,我正在考慮做更困難的事情!謝謝!!!! – Andres
我想到了一個使用scrollViewDelegate方法的解決方案:scrollViewDidScroll。在該方法中,我只在滾動速度小於某個值時檢查速度並應用分頁,因此它會保持慣性。我不使用UIScrollView的普通分頁,而是調用setContentOffset方法,以便我可以在正確的時間應用分頁。該代碼可能看起來過於複雜,但您可以將其分成更小的方法並使其看起來更好。玩兩個常數,看看什麼效果最好。希望它至少能幫助你朝正確的方向發展。
馬蒂亞斯
#define SPEED_MIN = 2
#define SPEED_MAX = 10
{
CGFloat prevX;
BOOL dragging;
NSInteger page;
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
CGFloat nextX = scrollView.contentOffset.x;
CGFloat speedX = nextX - prevX;
speedX = (speedX < 0 ? -speedX : speedX);
prevX = nextX;
if (dragging)
{
if (speedX < SPEED_MIN && page < 0)
{
page = [self getClosestPage:scrollView];
[scrollView setContentOffset:CGPointMake(page * scrollView.frame.size.width, 0) animated:YES];
[scrollView setScrollEnabled:NO];
}
else if (scrollView.contentOffset.x == page * scrollView.frame.size.width)
{
page = -1;
dragging = false;
[scrollView setScrollEnabled:YES];
}
}
else
{
dragging = speedX > SPEED_MAX;
}
}
- (NSInteger)getClosestPage:(UIScrollView *)scrollView
{
CGFloat x = scrollView.contentOffset.x;
CGFloat w = scrollView.frame.size.width;
NSInteger nbrOfPages = scrollView.contentSize.width/w;
for (int i = 0; i < nbrOfPages; i++) {
CGFloat dx1 = x - i*w;
CGFloat dx2 = (i+1)*w - x;
if (dx1 > 0 && dx2 > 0) {
if (dx1 >= dx2) {
return i;
} else {
return (i+1 < nbrOfPages ? i+1 : i);
}
}
}
return 0;
}
感謝您的幫助! – Andres
你想如何工作?如果你刷卡的速度非常快,你是否希望它滾動一會兒,而不停在下一頁? – Macondo2Seattle
就是這樣,但是當它停止時,我希望它停止在頁面中。 – Andres
做這樣的事很容易,但可能需要一些努力才能讓它感覺正確。我認爲你需要完全或部分覆蓋減速曲線,所以它停在你想要的地方。 – Macondo2Seattle