0

UIScrollView に描画ビューがあります。

やりたいことは、1 本の指で線を引き、2 本の指でスクロールすることです。

描画ビューは、以下のように touchesMoved を介して線を描画することです。

- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch;
    CGPoint lastTouch, currentTouch;

    for (touch in touches)
    {
        lastTouch = [touch previousLocationInView:self];
        currentTouch = [touch locationInView:self];

        CGContextRef ctx = CGLayerGetContext(drawLayer);
        CGContextBeginPath(ctx);
        CGContextMoveToPoint(ctx, lastTouch.x, lastTouch.y);
        CGContextAddLineToPoint(ctx, currentTouch.x, currentTouch.y);
        CGContextStrokePath(ctx);
    }

    [self setNeedsDisplay];
}

- (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    CGContextDrawLayerInRect(drawContext, self.bounds, drawLayer);
    CGContextClearRect(CGLayerGetContext(drawLayer), self.bounds);
    [self setNeedsDisplay];
}

そしてviewController上で、

    _scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
    [_scrollView setContentSize:CGSizeMake(320, 800)];
    [self.view addSubview:_scrollView];

    _drawingView = [[DrawingView alloc] initWithFrame:CGRectMake(0, 0, 320, 800)];
    [_scrollView addSubview:_drawingView];

    for (UIGestureRecognizer *gestureRecognizer in _scrollView.gestureRecognizers)
    {
        if ([gestureRecognizer  isKindOfClass:[UIPanGestureRecognizer class]])
        {
            UIPanGestureRecognizer *panGR = (UIPanGestureRecognizer *) gestureRecognizer;
            panGR.minimumNumberOfTouches = 2;
        }
    }

シミュレーターでは問題なく動作しますが、実際のデバイスでは描画が遅すぎます。何が間違っていて、何か提案はありますか?

タイ!

4

1 に答える 1

0

解決しました。

  1. [self setNeedsDisplay] で画面全体を描画すべきではありません。[self setNeedsDisplay withRect:] で再描画が必要な領域を描画する必要があります。

  2. touchesBegin~End よりも panGesture 認識機能を使用することをお勧めします。touchesBegin と touchesEnd の間に遅延があります。

于 2013-02-13T01:10:25.303 に答える