0

截屏

我正在实现一个包含 2 个 UIImageViews 的 CCLayer 子类。视图和图层的大小都相同:我用相同的框架初始化 UIImageViews,并将图层的 contentSize 设置为框架。一切工作正常,但似乎在绘图时第一点出现了问题。刚刚点击图像时没有跳线,但是当我尝试绘制笔画时,只要我移动手指,线的开头就会随机跳下(所以在这个截图中,我从左到右绘制除了对于左下角线)。我不确定我的代码哪里出错了:

//_drawImageView is the UIImageView I am drawing in.

#pragma mark - Touch Methods

- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event
{
    penStroked = NO;
    _prevPoint = [touch locationInView:[[CCDirector sharedDirector]view]];

    CGRect rect = self.boundingBox;
    if (CGRectContainsPoint(rect, _prevPoint)) {
        return YES;
    }

    return NO;
}

- (void)ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event
{
    penStroked = YES;
    _currPoint = [touch locationInView:_drawImageView];

    UIGraphicsBeginImageContext(self.contentSize);
    [_drawImageView.image drawInRect:CGRectMake(0, 0, _drawImageView.frame.size.width, _drawImageView.frame.size.height)];
    CGContextMoveToPoint(UIGraphicsGetCurrentContext(), _prevPoint.x, _prevPoint.y);
    CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), _currPoint.x, _currPoint.y);
    CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
    CGContextSetLineWidth(UIGraphicsGetCurrentContext(), penSize);
    CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), penColor.r, penColor.g, penColor.b, 1.0);
    CGContextSetBlendMode(UIGraphicsGetCurrentContext(), kCGBlendModeNormal);

    CGContextStrokePath(UIGraphicsGetCurrentContext());
    _drawImageView.image = UIGraphicsGetImageFromCurrentImageContext();
    [_drawImageView setAlpha: penOpacity];
    UIGraphicsEndImageContext();

    _prevPoint = _currPoint;
}

最初我很难将绘制线的点与我手指的实际位置对齐,这就是为什么在 ccTouchBegan 方法中触摸取自 CCDirector 而在 ccTouchMoved 中取自_drawImageView。除了最初的不稳定行为之外,这是它似乎完美绘制的唯一方式。

4

1 回答 1

1

在此处输入图像描述

这个问题肯定是由不同的触摸参考引起的。正如我之前所说,这是让行与我的手指所在的位置匹配的唯一方法。我认为行跳转是由于代码行:

CGContextMoveToPoint(UIGraphicsGetCurrentContext(), _prevPoint.x, _prevPoint.y);

问题是,在第一次绕行时,或第一次笔/手指被抚摸时,前一点是从 CCDirectors 视图中引用的,而当前点是从 imageView 中引用的。我创建了一个 int 变量,每次笔划时都会递增,当 penStrokedInt == 1(第一次笔划)时,我使用当前点坐标将 _prevPoint 更正为 WorldSpace:

    _prevPoint = [self convertToWorldSpace:_currPoint];

这基本上摆脱了该行的第一个点。这不是最好的解决方案,但现在可以了!确保在 ccTouchEnded 时将 penStrokedInt 重置为 0。

于 2013-04-19T04:11:13.490 回答