1

我知道有更好的方法可以使用 CoreGraphics 来实现绘图工具,我正在使用这种 UIView 方法,因为我想实现像素化效果,并且我有一些其他自定义的东西很难做到内置CG代码。



我有一个 400 个 UIView 的网格来创建我的像素化画布......
用户选择一种油漆颜色并开始将他们的手指拖到 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 不经常更新......所以如果我在画布上拖动手指,只有 5 个像素发生变化,而不是我实际触摸的 40 个。



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

在此处输入图像描述



综上所述,是否有一种方法可以检测用户何时在 UIView 上滑动而不是使用touchesMoved?如果没有,关于如何在 touchesMoved 返回的触摸位置之间获取所有 UIView 的任何想法?我让它们都有 1-400 的标签(第一行是 1-10,第二行是 11-21,等等)

Ps 如果 apanGestureRecognizer更新比 a 更频繁touchesMoved


要了解 400 个 UIView 在这里的样子,它们都具有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];
}

这种方法性能改进将允许 cocoa 更频繁地调用 touchesMoved:

于 2013-03-15T05:49:31.583 回答