如何使用touchMove事件在目标C中移动使用UIBezierPath绘制的对象

时间:2014-04-15 14:14:29

标签: ios objective-c

我正在使用iPhone应用程序,我必须draw使用触摸事件来移动它。我在面具中有4个点,我必须通过改变点的位置来改变对象的大小。

我使用二次曲线绘制了主要部分但是现在当我更新我的点的位置并且触摸移动事件被提升时,我的对象的形状变得非常奇怪。

请帮助我,我也读过有关iPhone开发者论坛的精细转换,但我不确定是否需要使用它,因为我只是简单地使用新计算重新绘制对象分。

这是示例代码 这是绘制点和工作正常的代码

        p_L.x=20.5;
        p_L.y=30.5;// corner  points
        p_T_M.y=10.5;
        p_T_M.x=60.5;
        p_R.x=100.5;
        p_R.y=30.5;

        p_L_c.x=p_L.x; control points 
        p_L_c.y=p_T_M.y;
        p_R_c.x=p_R.x;
        p_R_c.y=p_T_M.y;
        p_L_c2.x=(p_R.x-p_L.x/2);
        p_L_c2.y=p_R.y+30;


    }//// Bezier Drawing

    bezierPath = [UIBezierPath bezierPath];
    [bezierPath moveToPoint: CGPointMake(CGRectGetMinX(frame) + p_L.x, CGRectGetMinY(frame) + p_L.y)];
    [bezierPath addQuadCurveToPoint:CGPointMake(CGRectGetMinX(frame) +  p_T_M.x, CGRectGetMinY(frame) +  p_T_M.y) controlPoint:CGPointMake(CGRectGetMinX(frame) + p_L_c.x, CGRectGetMinY(frame) + p_L_c.y)];

    [bezierPath addQuadCurveToPoint:CGPointMake(CGRectGetMinX(frame) +  p_R.x, CGRectGetMinY(frame) +  p_R.y) controlPoint:CGPointMake(CGRectGetMinX(frame) + p_R_c.x, CGRectGetMinY(frame) + p_R_c.y)];

    [bezierPath addQuadCurveToPoint:CGPointMake(CGRectGetMinX(frame) +  p_L.x, CGRectGetMinY(frame) +  p_L.y) controlPoint:CGPointMake(CGRectGetMinX(frame) + p_L_c2.x, CGRectGetMinY(frame) + p_L_c2.y)];
    [bezierPath closePath];
    CGContextSaveGState(context);
当我想移动物体时,

问题就在这里触摸移动事件......

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{

    UITouch *touch = [touches anyObject];
    CGPoint point=[touch locationInView:self.displayImage];




            if( [[self tapTargetForPath:bezierPath] containsPoint:point]&& move_check==TRUE )
            {
                _displayImage.image=image_TEMP;
                CGPoint diff=CGPointMake(point.x-initial_point.x, point.y-initial_point.y);


                p_L.x=(p_L.x)+diff.x;
                p_L.y=(p_L.y)+diff.y;
                p_T_M.x=(p_T_M.x)+diff.x;
                p_T_M.y=(p_T_M.x)+diff.y;

                p_R.x= (p_R.x)+diff.x;
                p_R.y= (p_R.x)+diff.y;

                p_L_c.x=p_L_c.x+diff.x;
                p_L_c.y=p_L_c.y+diff.y;
                p_R_c.x=p_R_c.x+diff.x;
                p_R_c.y=p_R_c.y+diff.y;
                p_L_c2.x=p_L_c2.x+diff.x;
                p_L_c2.y=p_L_c2.y+diff.x;

                initial_point=point;
                UIGraphicsBeginImageContext(_displayImage.frame.size);
                [image_TEMP drawInRect:CGRectMake(0, 0, _displayImage.frame.size.width, _displayImage.frame.size.height)];

                CGContextRef context = UIGraphicsGetCurrentContext();
                CGRect frame = self.displayImage.bounds;
                bezierPath = [UIBezierPath bezierPath];
                [bezierPath moveToPoint: CGPointMake(CGRectGetMinX(frame) + p_L.x, CGRectGetMinY(frame) + p_L.y)];
                [bezierPath addQuadCurveToPoint:CGPointMake(CGRectGetMinX(frame) +  p_T_M.x, CGRectGetMinY(frame) +  p_T_M.y) controlPoint:CGPointMake(CGRectGetMinX(frame) + p_L_c.x, CGRectGetMinY(frame) + p_L_c.y)];

                [bezierPath addQuadCurveToPoint:CGPointMake(CGRectGetMinX(frame) +  p_R.x, CGRectGetMinY(frame) +  p_R.y) controlPoint:CGPointMake(CGRectGetMinX(frame) + p_R_c.x, CGRectGetMinY(frame) + p_R_c.y)];

                [bezierPath addQuadCurveToPoint:CGPointMake(CGRectGetMinX(frame) +  p_L.x, CGRectGetMinY(frame) +  p_L.y) controlPoint:CGPointMake(CGRectGetMinX(frame) + p_L_c2.x, CGRectGetMinY(frame) + p_L_c2.y)];
                [bezierPath closePath];
                CGContextSaveGState(context);

                _displayImage.image = UIGraphicsGetImageFromCurrentImageContext();
                [_displayImage setImage:_displayImage.image];
            }

        }

如果有人知道怎么做,Plz会帮助我。

我想要做的事情基本上就是在这个环节...... http://www.taaz.com/virtual-makeover#piano=red&tab=lipstick

1 个答案:

答案 0 :(得分:0)

实际上我使用bezier路径获得3点在我的图像中提取ROI并且我必须使用触摸事件移动此roi并且我还必须使用触摸实时调整我的点,所以当我的区域改变时点的位置也有相对距离所以它破坏了路径的形状,问题是,在xcode bezier路径需要一个参考点,我们称之为起点或原点,所有其他点和曲线的控制点也依赖于此参考当有人想要将图像移动到图像上时,只需将参考点更改为其中并设置与参考点相关的其他点,如

pointB.x = 2 * contsant + origin point.x; pointB.y = 2 * contsant + origin point.y;

当你的所有点都取决于原点时,你可以通过使用旧位置和原点的新旧位置计算其他点的新位置来移动路径并计算其他点的位置。 这是我的解决方案,我搜索堆栈溢出和谷歌很多人有这个问题,使用触摸移动图像的路径,但没有人清楚地回答它。他们提出了很多困难和复杂的方法来检查触摸位置是在路径内部还是外部所有谈论切线和曲线计算,以便在图像上移动路径我认为这可以像我一样简单的方式,它适用于我。