1

CoreGraphicsを使用して描画ツールを実現するためのより良い方法があることを知っていますが、ピクセル化された効果を実現したいので、このUIViewメソッドを使用しています。また、他のカスタム機能だけでは実行が難しいことを念頭に置いています。組み込みのCGコード。



ピクセル化されたキャンバスを作成するための400UIViewのグリッドがあります...
ユーザーはペイントカラーを選択し、400 UIViewのキャンバス上で指をドラッグし始めます。指がUIViewに当たると、そのUIViewの色(別名ピクセル)が表示されます。ユーザーが選択した色に変更します...

今はすべてをコーディングし、すべてが機能していますが、(touchesMovedを使用しているため)動作が遅く、多くのポイントがスキップされます...



私は現在touchesMovedを使用しており、UIViewを指の位置​​に移動しています(これをと呼んでいますfingerLocationRect)。

ピクセル(400個のミニチュアUIViewの1つ)の色を更新するときfingerLocationRectは、UIViewのいずれかが交差するかどうかを確認することで更新しています。もしそうなら、私は色を更新します。

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    CGPoint currentPosition = [touch locationInView:self.view];
    fingerLocationRect.center = CGPointMake(currentPosition.x, currentPosition.y);
    int tagID = 1;
    while (tagID <= 400) {
        if(CGRectIntersectsRect(fingerLocationRect.frame, [drawingView viewWithTag:tagID].frame)) {
            [drawingView viewWithTag:tagID].backgroundColor = [UIColor colorWithRed:redVal/255.f green:greenVal/255.f blue:blueVal/255.f alpha:1.f];
        }
        tagID ++;
    }
}



問題は、touchesMovedが頻繁に更新されないことです。したがって、キャンバス上で指をドラッグすると、実際に触れた40ピクセルではなく、5ピクセルしか変化しないようになります。



CGRectIntersectsRectユーザーがUIViewをスライドしたかどうかを検出するには、 withを使用するのが最善の方法かどうか疑問に思ってtouchesMovedいます...現在、更新が十分に速くなく、右側の結果ではなく左側の結果が表示されています。(指を非常にゆっくり動かした場合にのみ、右側の効果が得られます...)

ここに画像の説明を入力してください



とはいえ、ユーザーがUIViewをスライドするタイミングを検出する方法は、使用する以外にありtouchesMovedますか?そうでない場合は、touchesMovedによって返されるタッチ位置の間にあるすべてのUIViewを取得する方法に関するアイデアはありますか?私はそれらすべてに1-400のタグを付けています(最初の行は1-10、2番目の行は11-21など)

panGestureRecognizerより頻繁に更新された場合のPs 400個のUIViewがここでどのように見えるかを理解するために、それらはすべてベースの色 で表示されます。touchesMoved


arc4random

ここに画像の説明を入力してください



4

1 に答える 1

3

touchesMoved:が呼び出されるたびに400ビューをループしています。グリッド内のどのビューがタッチされているかを判断するには、少し計算する必要があります。drawingViewが400個の「ピクセル」すべてを含む「キャンバス」ビューであり、タグが左上から右下に並べられていると仮定すると、次のようになります。

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];    
    CGPoint point = [touch locationInView:drawingView];
    NSInteger column = floorf(20 * point.x / drawingView.bounds.size.width); //20 is the number of column in the canvas
    NSInteger row = floorf(20 * point.y / drawingView.bounds.size.height); //20 is the number of rows in the canvas
    [viewWithTag:column + 20*row].backgroundColor = [UIColor colorWithRed:redVal/255.f green:greenVal/255.f blue:blueVal/255.f alpha:1.f];
}

このメソッドのパフォーマンスの向上により、ココアはtouchesMovedをより頻繁に呼び出すことができます。

于 2013-03-15T05:49:31.583 に答える