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