2

我正在视图上绘制注释。行注释导致问题;

我有一个 Shape 的父类(从 UIView 扩展)。所有注释都是形状的子类。在每个注释类中,我都覆盖了 drawRect 方法。DrawingCanvas 类(从 UIView 扩展,是我的 viewController 父视图的子视图)处理平移手势。这是一段代码

-(void) panGestureRecognizer: (UIPanGestureRecognizer *) panGesture {

    static CGPoint initialPoint;
    CGPoint translation = [panGesture translationInView:panGesture.view];
    static Shape *shape;

    if(panGesture.state == UIGestureRecognizerStateBegan) {

        initialPoint = [panGesture locationInView:panGesture.view];

        if(selectedShape == nil) {

            if([selectedOption isEqualToString:@"line"]) {
                shape = [[Line alloc] initWithFrame:CGRectMake(initialPoint.x, initialPoint.y, 10, 10) isArrowLine:NO];
                ((Line *)shape).pointStart = [panGesture.view convertPoint:initialPoint toView:shape];
            }
            [panGesture.view addSubview:shape];
        }
        [shape setNeedsDisplay];
    }   
    else if(panGesture.state == UIGestureRecognizerStateChanged) {

        if([shape isKindOfClass:[Line class]]) {

            CGRect newRect = shape.frame;

            if (translation.x < 0) {
                newRect.origin.x = initialPoint.x + translation.x - LINE_RECT_OFFSET;
                newRect.size.width = fabsf(translation.x) + LINE_RECT_OFFSET * 2;
            } 
            else {
                newRect.size.width = translation.x + LINE_RECT_OFFSET * 2;
            }

            if (translation.y < 0) {
                newRect.origin.y = initialPoint.y + translation.y - LINE_RECT_OFFSET;
                newRect.size.height = fabsf(translation.y) + LINE_RECT_OFFSET * 2;
            } 
            else {
                newRect.size.height = translation.y + LINE_RECT_OFFSET * 2;
            }

            shape.frame = newRect;

            CGPoint endPoint = CGPointMake(initialPoint.x + translation.x, initialPoint.y + translation.y);

            ((Line *)shape).pointStart = [panGesture.view convertPoint:initialPoint toView:shape];
            ((Line *)shape).pointEnd = [panGesture.view convertPoint:endPoint toView:shape];

            [shape setNeedsDisplay];
        }
    }
}

线drawRect包含

-(void)drawRect:(CGRect)rect {

    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextClearRect(context, rect);

    CGContextSetStrokeColorWithColor(context, self.color.CGColor);
    CGContextSetFillColorWithColor(context, self.color.CGColor);

    CGContextMoveToPoint(context, pointStart.x, pointStart.y);
    CGContextAddLineToPoint(context, pointEnd.x, pointEnd.y);

    CGContextSetLineWidth(context, 2.f);

    CGContextStrokePath(context);
}

为了移动和调整大小,我正在处理 touchEvents 为了移动注释,我在 touchesMoved 中执行此操作

UITouch *touch = [[event allTouches] anyObject];
CGPoint newPoint = [touch locationInView:self];
CGPoint previousPoint = [touch previousLocationInView:self];

CGRect rect = self.frame;
rect.origin.x += newPoint.x - previousPoint.x;
rect.origin.y += newPoint.y - previousPoint.y;
self.frame = rect;

[self setNeedsDisplay];

到这里为止一切都很好,但是现在通过拖动线条的端点来调整线条的大小给我带来了困惑。我已将 imageViews 放置在终点。在触摸开始时,我正在检测这样的终点

UITouch *touch = [[event allTouches] anyObject];
CGPoint touchPoint = [touch locationInView:self];
if(CGRectContainsPoint(imageView1.frame, touchPoint) || CGRectContainsPoint(imageView2.frame, touchPoint)) {
    isEndPoint = YES; 
}

如果 isEndPoint 是 YES 那么我必须调整行的大小。我需要知道我在往哪个方向拖动。如何更新点(我已经采用了 CGPoint 的类变量;pointStart、pointEnd)和框架。

请建议调整大小的技巧来更新点和框架。

4

1 回答 1

0

用于确定线的方向:
您可以执行以下操作:

从起点开始的线:
a)Greater 'X' than the Start Point's X线靠近右侧
b)Less 'X' than the Start Point's X线靠近左侧。
c)Greater Y'' than the Start point's 'Y'线路向下。
d)Less 'Y' than the Start point's 'Y'线路向上。

从端点开始的线:
a)Greater 'X' than the End Point's X线靠近右侧
b)Less 'X' than the End Point's X线靠近左侧。
c)Greater Y'' than the End point's 'Y'线路向下。
d)Less 'Y' than the End point's 'Y'线路向上。

如果直线是从终点绘制的,则保持起点不变,否则如果直线是从起点开始,则保持起点不变。

画完线后,只需要更新 Line 的 Rect 即可。
为此,您需要向CGPointLine 的 Class 添加另外 2 个属性。
1. 初始点,2. 最后点。
最初将初始点设置为等效于起点,并将最后一个点设置为等效于终点。
之后,在添加到 Current 的每一行上Line,只需更新这两个属性,并与起点和终点进行适当的比较。我给你一个正确比较的提示:
例如:
比较所有 4 个点,即Initial Point、和。更新初始点和最后一点: 设置Last PointStart PointEnd Point


Initial Point's'X' 和 'Y' 相当于所有这 4 个点中的最小值 'X' 和最小值 'Y'。
Last Point's“X”和“Y”设置为这 4 个点中的“最大”“X”和“最大”“Y”。
根据这 2 点Initial Point和制作 Line 的 Rect Last Point
我希望这能解决你的问题。

于 2013-08-20T09:42:56.573 回答