0

これはちょっと興味深いものでした。

そのため、スクロールビューが上にあるOpenGl画面があります。スクロール時にCADisplayリンクを使用してレンダリングを更新します(以下のコード)。これは非常にうまく機能します。

ただし、ポイントにスナップすることはできません(アニメーション)。CADisplay リンクを解放すると、スクロールビューのアニメーションが停止すると思います (snapToItem を参照)。

2 秒後に CADisplay のリリースを開始しようとしましたが、他の問題が発生します。

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    moveFactor = 0 - (((self.scrollView.contentSize.height - self.scrollView.frame.size.height) - self.scrollView.contentOffset.y) / itemScrollViewMoveFactor);
    [self updateLabelPositionScale];
}

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    [self startDisplayLinkIfNeeded];
}

- (void)snapToItem
{
    NSLog(@"%d", self.selectItem);
    [self.scrollView setContentOffset:CGPointMake(0, (self.scrollView.contentSize.height - self.scrollView.frame.size.height) - (itemScrollViewHeight * self.selectItem)) animated:YES];
    //[NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(stopDisplayLink)  userInfo:nil repeats:NO];
    [self stopDisplayLink];
}

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
    if (!decelerate) 
    {
        [self snapToItem];
    }
}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    [self snapToItem];
}

#pragma mark Display Link

- (void)startDisplayLinkIfNeeded
{
    if (!self.displayLink) 
    {
        self.displayLink = [CADisplayLink displayLinkWithTarget:self.view selector:@selector(display)];
        [self.displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:UITrackingRunLoopMode];
    }
}

- (void)stopDisplayLink
{
    if (self.displayLink)
    {
        [self.displayLink invalidate];
        self.displayLink = nil;
    }
}
4

1 に答える 1

0

NSRunLoopCommonModes に表示リンクを追加してみましたか?

于 2012-08-07T17:34:23.380 に答える