检查用户何时滑过UIView - touchesMoved太迟了

时间:2013-03-15 05:09:19

标签: ios objective-c uiview pixel touchesmoved

我知道有更好的方法可以使用CoreGraphics实现绘图工具,不管怎样,我正在使用这个UIView方法因为我想要实现像素化效果而且我还有一些其他的自定义内容只使用内置的CG代码很难做到。



我有一个400 UIViews网格来创建我的像素化画布......
用户选择油漆颜色并开始将手指拖过400 UIViews的画布,当他们的手指击中UIView时,UIView(aka像素)的颜色将变为用户选择的颜色......

现在我已经对整个事情进行了编码,一切正常,但是它是滞后的(因为我使用的是touchesMoved)并且很多点被跳过...



我目前正在使用touchesMoved并将UIView移动到手指位置(我称之为fingerLocationRect)。

当我更新一个像素(400个微型UIViews中的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不会经常更新...所以如果我将手指拖过画布只会像5个像素一样改变而不是实际触及的40个。



我想知道将CGRectIntersectsRecttouchesMoved一起使用是检测UIView用户幻灯片的最佳方法...现在它的更新速度不够快我得到了左边的结果而不是右边的结果。 (如果我非常缓慢地移动我的手指,我只能在右侧实现效果......)

enter image description here



所有这一切,是否有一种方法可以检测用户何时滑过UIView而不是使用touchesMoved?如果没有,关于如何抓住touchesMoved返回的触摸位置之间的所有UIViews的任何想法?我有他们都有1-400的标签(第一行是1-10,第二行是11-21等)

P.S。如果panGestureRecognizer的更新频率高于touchesMoved


为了了解400 UIViews在这里的样子,他们都使用基于arc4random的颜色:

enter image description here



1 个答案:

答案 0 :(得分: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];
}

这种方法的性能提升将允许cocoa更频繁地调用touchesMoved: