簡體   English   中英

iOS:用於平滑滾動和輕彈視圖的手勢識別器

[英]iOS: Gesture recogniser for smooth scrolling and flicking a View

我正在構建一個iPad應用程序,我需要允許使用兩個視圖之間提供的分隔視圖來調整視圖功能。 分隔視圖只是兩個半屏內容視圖之間的20px高度視圖 - 請參閱附圖。

當用戶向上或向下滾動此分隔視圖時,兩個內容視圖都會相應地更改其大小。 我已經擴展了UIView並使用touchMoved委托實現了這個代碼,如下面touchesMoved委托中給出的代碼。 它工作正常。 TouchMoved唯一缺少的是您無法直接將分割器視圖輕彈到頂部或底部。 你必須一直拖到頂部或底部!

為了支持輕彈視圖,我嘗試了UIPanGestureRecognizer但我看不到它的平滑拖動。 設置父級的拆分位置會調整兩個內容視圖的大小,如代碼所示。 當我在UIGestureRecognizerStateChanged狀態下處理分割位置變化時,只需觸摸分割器視圖就可以將其輕彈到頂部或底部。 UIGestureRecognizerStateEnded中處理拆分位置更改會做同樣的事情,但我看不到內容視圖使用dividerview滾動調整大小!

有人可以告訴我如何通過調整內容視圖(如touchMoved )和輕彈視圖來實現分隔視圖的平滑滾動? 任何替代方法也可以。 謝謝。

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    if (touch) {
        CGPoint lastPt = [touch previousLocationInView:self];
        CGPoint pt = [touch locationInView:self];
        float offset = pt.y - lastPt.y;
        self.parentViewController.splitPosition = self.parentViewController.splitPosition + offset;
    }
}

- (void)handlePan:(UIPanGestureRecognizer*)recognizer {

    CGPoint translation = [recognizer translationInView:recognizer.view];
    CGPoint velocity = [recognizer velocityInView:recognizer.view];

    if (recognizer.state == UIGestureRecognizerStateBegan) {
    } else if (recognizer.state == UIGestureRecognizerStateChanged) {
       // If I change split position here, I don't see smooth scrolling dividerview...it directly jumps to the top or bottom!
       self.parentViewController.splitPosition = self.parentViewController.splitPosition + translation.y;
    } else if (recognizer.state == UIGestureRecognizerStateEnded) {
      // If I change split position here, the same thing happens at end and I don't see my divider view moving with my scrolling and resizing my views.
        self.parentViewController.splitPosition = self.parentViewController.splitPosition + translation.y;
    }
}

初始屏幕

初始屏幕

通過向底部滾動分隔視圖來增加頂視圖大小。

通過滾動分隔視圖增加頂視圖大小

頂視圖完全隱藏在這里,但我必須滾動分隔視圖一直到頂部。 我想輕彈分隔視圖,使其直接從任何位置移動到頂部

頂視圖完全隱藏在這里,但我必須滾動分隔視圖一直到頂部。我想輕彈分隔視圖,使其直接從任何位置移動到頂部。

如果我理解正確,你在這里有兩個不同的問題。

1st:使用GestureRecognizer時“不平滑”的拖動。 代碼中的問題是,每次GR調用它的句柄方法時都會添加轉換。 由於平移是連續測量的,因此每次調用時都會增加一個更高的值(即第一個調用將10添加到分割位置,第二個調用增加20,第三個30等等)。

要解決此問題,您應該在更新拆分位置后將轉換設置為零:

- (void)handlePan:(UIPanGestureRecognizer*)recognizer {

    CGPoint translation = [recognizer translationInView:recognizer.view];

    if (recognizer.state == UIGestureRecognizerStateChanged) {
       self.parentViewController.splitPosition = self.parentViewController.splitPosition + translation.y;
    } 
    [recognizer setTranslation:CGPointZero inView:recognizer.view];
}

第二步:要允許用戶將分割位置輕彈到頂部或底部,您可以檢查UIGestureRecognizerStateEnded中的速度,如果它執行某個值,立即將分割位置設置為頂部或底部。

但是使用UISwipeGestureRecognizer可能更方便。

- (void)handleSwipe:(UISwipeGestureRecognizer *)gr
{
    if (gr.direction == UISwipeGestureRecognizerDirectionUp){
        [self.parentViewController moveSplitViewToTop];
    }
    else if (gr.direction == UISwipeGestureRecognizerDirectionDown){
        [self.parentViewController moveSplitViewToBottom];
    }
}

在這種情況下,可能有必要(不確定,可能不是)通過設置要求SwipeGR在PanGR觸發之前失敗:

[panGestureRecognizer requireGestureRecognizerToFail:swipeGestureRecognizer];

希望有所幫助。

編輯:關於你的評論,我假設頻率你的意思是速度。 如果你只使用PanGR,你可以將上面的代碼修改為...... 像這樣:

- (void)handlePan:(UIPanGestureRecognizer*)recognizer {

    CGPoint translation = [recognizer translationInView:recognizer.view];
    CGPoint velocity = [recognizer velocityInView:recognizer.view];

    if (recognizer.state == UIGestureRecognizerStateChanged) {
       self.parentViewController.splitPosition = self.parentViewController.splitPosition + translation.y;
    } 
    else if (recognizer.state == UIGestureRecognizerStateEnded){
        if (velocity.y > someValue){
            [self.parentViewController moveSplitViewToBottom];
        }
        else if (velocity.y < someValue){
            [self.parentViewController moveSplitViewToTop];
        }
    }
    [recognizer setTranslation:CGPointZero inView:recognizer.view];
}

我不確定速度是否已簽名,如果不是,你必須在if-block中再次檢查轉換。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM