iOS CALayer convertPoint:fromLayer:发送到解除分配实例的消息

时间:2015-01-20 13:26:50

标签: ios xcode calayer uibezierpath

我有一个由bezierPaths制成的正方形的类,你可以通过靠近一侧并拖动它来改变正方形的大小。

现在我可以拖动和释放一次,下次我收到以下错误:

2015-01-20 14:20:36.356 BezierPaths [196:3437] *** - [CALayer convertPoint:fromLayer:]:消息发送到解除分配的实例0x1742251c0

为什么它第二次不起作用?

这是班级:

@implementation EditBezierView
{
    UIBezierPath *path;
    UIImage *incrementalImage;
    CGPoint pts[9];

    NSMutableArray *pathPoints;
    NSMutableArray *controlPoints;

    BOOL pressedPoint;
    int index;

    float xStart;
    float yStart;

    int closestIndex;
    CGPoint closestComparePoint;
    bool moveControl;

    int counter;
}

- (id)initWithCoder:(NSCoder *)aDecoder
{
    if (self = [super initWithCoder:aDecoder])
    {
        [self setMultipleTouchEnabled:NO];
        [self setBackgroundColor:[UIColor clearColor]];
        path = [UIBezierPath bezierPath];
        [path setLineWidth:1.0];
        pathPoints = [NSMutableArray array];
        controlPoints = [NSMutableArray array];
    }



    return self;

}
- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        [self setMultipleTouchEnabled:NO];
        path = [UIBezierPath bezierPath];
        [path setLineWidth:2.0];
        counter = 0;
    }
    return self;
}

- (void)initValues
{

    [pathPoints addObject:[NSValue valueWithCGPoint:CGPointMake(47.0, 130.0)]];
    [pathPoints addObject:[NSValue valueWithCGPoint:CGPointMake(14.0, 230.0)]];
    [controlPoints addObject:[NSValue valueWithCGPoint:CGPointMake(26.0, 150.0)]];

    [pathPoints addObject:[NSValue valueWithCGPoint:CGPointMake(22.0, 320.0)]];
    [controlPoints addObject:[NSValue valueWithCGPoint:CGPointMake(9.0, 270.0)]];

    [pathPoints addObject:[NSValue valueWithCGPoint:CGPointMake(90.0, 420.0)]];
    [controlPoints addObject:[NSValue valueWithCGPoint:CGPointMake(24.0, 380.0)]];

    [pathPoints addObject:[NSValue valueWithCGPoint:CGPointMake(230.0, 420.0)]];
    [controlPoints addObject:[NSValue valueWithCGPoint:CGPointMake(170.0, 460.0)]];

    [pathPoints addObject:[NSValue valueWithCGPoint:CGPointMake(300.0, 320.0)]];
    [controlPoints addObject:[NSValue valueWithCGPoint:CGPointMake(280.0, 390)]];

    [pathPoints addObject:[NSValue valueWithCGPoint:CGPointMake(307.0, 220.0)]];
    [controlPoints addObject:[NSValue valueWithCGPoint:CGPointMake(315.0, 260.0)]];

    [pathPoints addObject:[NSValue valueWithCGPoint:CGPointMake(270.0, 130.0)]];
    [controlPoints addObject:[NSValue valueWithCGPoint:CGPointMake(300.0, 160.0)]];

    [self drawPaths];
}

// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect
{
    [[UIColor blueColor] setStroke];
    [path stroke];
}



- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    counter++;
    NSLog(@"%d", counter);
    [self.layer.sublayers makeObjectsPerformSelector:@selector(removeFromSuperlayer)];
   UITouch *currentTouch = [touches anyObject];
   CGPoint startPt = [currentTouch locationInView:self];


    if(moveControl)
    {
        float xOs = [(NSValue*)[controlPoints objectAtIndex:closestIndex] CGPointValue].x;
        float yOs = [(NSValue*)[controlPoints objectAtIndex:closestIndex] CGPointValue].y;
        [controlPoints replaceObjectAtIndex:closestIndex withObject:[NSValue valueWithCGPoint:CGPointMake(xOs - (xStart-startPt.x), yOs - (yStart - startPt.y))]];
    }
    else
    {
        float xOs = [(NSValue*)[pathPoints objectAtIndex:closestIndex] CGPointValue].x;
        float yOs = [(NSValue*)[pathPoints objectAtIndex:closestIndex] CGPointValue].y;
        [pathPoints replaceObjectAtIndex:closestIndex withObject:[NSValue valueWithCGPoint:CGPointMake(xOs - (xStart-startPt.x), yOs - (yStart - startPt.y))]];

    }
    [self drawPaths];

    xStart = startPt.x;
    yStart = startPt.y;
}


- (void)drawPaths
{
    path = [UIBezierPath bezierPath];
    for(int i = 1; i < [pathPoints count]; i++)
    {
        //Draw path
        [path moveToPoint:((NSValue*)[pathPoints objectAtIndex:i-1]).CGPointValue];
        [path addQuadCurveToPoint:((NSValue*)[pathPoints objectAtIndex:i]).CGPointValue controlPoint:((NSValue*)[controlPoints objectAtIndex:i-1]).CGPointValue];

        //Draw points
        if(i == 1)
        {
            [self addrectangle:((NSValue*)[pathPoints objectAtIndex:i-1]).CGPointValue];
            [self addrectangle:((NSValue*)[pathPoints objectAtIndex:i]).CGPointValue];
            [self addQuadrectangle:((NSValue*)[controlPoints objectAtIndex:i-1]).CGPointValue];
        }
        else
        {
            [self addrectangle:((NSValue*)[pathPoints objectAtIndex:i]).CGPointValue];
            [self addQuadrectangle:((NSValue*)[controlPoints objectAtIndex:i-1]).CGPointValue];
        }
    }
        [self setNeedsDisplay];
}


- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *currentTouch = [touches anyObject];
    CGPoint startPt = [currentTouch locationInView:self];
    closestComparePoint = startPt;
    xStart = startPt.x;
    yStart = startPt.y;
    [self findNearestPoint];
    }



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

    //[self drawPath];
}

-(void)findNearestPoint
{
    int pathClosestIndex = 0;
    CGFloat xDist;
    CGFloat yDist;
    CGFloat Controldistance = 12401240;
    CGFloat Pathdistance = 12401240;
    for(int i = 0; i < [controlPoints count]; i++)
    {
        xDist = ABS([(NSValue*)[controlPoints objectAtIndex:i] CGPointValue].x - closestComparePoint.x);
        yDist = ABS([(NSValue*)[controlPoints objectAtIndex:i] CGPointValue].y - closestComparePoint.y);
        if(sqrt((xDist * xDist) + (yDist * yDist)) < Controldistance)
        {
            Controldistance = sqrt((xDist * xDist) + (yDist * yDist));
            closestIndex = i;
        }
    }

    for(int i = 0; i < [pathPoints count]; i++)
    {
        xDist = ABS([(NSValue*)[pathPoints objectAtIndex:i] CGPointValue].x - closestComparePoint.x);
        yDist = ABS([(NSValue*)[pathPoints objectAtIndex:i] CGPointValue].y - closestComparePoint.y);
        if(sqrt((xDist * xDist) + (yDist * yDist)) < Pathdistance)
        {
            Pathdistance = sqrt((xDist * xDist) + (yDist * yDist));
            pathClosestIndex = i;
        }
    }

    if(Pathdistance < Controldistance)
    {
        moveControl = NO;
        closestIndex = pathClosestIndex;
    }
    else
    {
        moveControl = YES;
    }




}



- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
    [self touchesEnded:touches withEvent:event];
    pressedPoint = NO;
}



-(void)removeRectangles{
    [self.layer.sublayers makeObjectsPerformSelector:@selector(removeFromSuperlayer)];

}

-(void)addrectangle:(CGPoint) center{


    int offset = 8;
    UIBezierPath *path2 = [UIBezierPath bezierPath];
    [path2 moveToPoint:CGPointMake(center.x - offset, center.y - offset)];
    // # Entry Point with 10px white frame
    [path2 moveToPoint:CGPointMake(center.x - offset, center.y - offset)];
    // # Keeping 10px frame with iPhone's 450 on y-axis
    [path2 addLineToPoint:CGPointMake(center.x - offset, center.y + offset)];
    // path2 Substracting 10px for frame on x-axis, and moving 450 in y-axis
    [path2 addLineToPoint:CGPointMake(center.x + offset, center.y + offset)];
    // # Moving up to 1st step 10px line, 310px on the x-axis
    [path2 addLineToPoint:CGPointMake(center.x + offset, center.y - offset)];
    // # Back to entry point
    [path2 addLineToPoint:CGPointMake(center.x - offset, center.y - offset)];

    // 4th Create a CAShapeLayer that uses that UIBezierPath:
    CAShapeLayer *shapeLayer = [CAShapeLayer layer];
    shapeLayer.path = [path2 CGPath];
    shapeLayer.strokeColor = [[UIColor blueColor] CGColor];
    shapeLayer.lineWidth = 1.0;
    shapeLayer.fillColor = [[UIColor clearColor] CGColor];

    // 5th add shapeLayer as sublayer inside layer view
    [self.layer addSublayer:shapeLayer];
}

-(void)addQuadrectangle:(CGPoint) center{


    int offset = 4;
    UIBezierPath *path2 = [UIBezierPath bezierPath];
    [path2 moveToPoint:CGPointMake(center.x - offset, center.y - offset)];
    // # Entry Point with 10px white frame
    [path2 moveToPoint:CGPointMake(center.x - offset, center.y - offset)];
    // # Keeping 10px frame with iPhone's 450 on y-axis
    [path2 addLineToPoint:CGPointMake(center.x - offset, center.y + offset)];
    // path2 Substracting 10px for frame on x-axis, and moving 450 in y-axis
    [path2 addLineToPoint:CGPointMake(center.x + offset, center.y + offset)];
    // # Moving up to 1st step 10px line, 310px on the x-axis
    [path2 addLineToPoint:CGPointMake(center.x + offset, center.y - offset)];
    // # Back to entry point
    [path2 addLineToPoint:CGPointMake(center.x - offset, center.y - offset)];

    // 4th Create a CAShapeLayer that uses that UIBezierPath:
    CAShapeLayer *shapeLayer = [CAShapeLayer layer];
    shapeLayer.path = [path2 CGPath];
    shapeLayer.strokeColor = [[UIColor redColor] CGColor];
    shapeLayer.lineWidth = 1.0;
    shapeLayer.fillColor = [[UIColor clearColor] CGColor];

    // 5th add shapeLayer as sublayer inside layer view
    [self.layer addSublayer:shapeLayer];
}

-(int)findOrigoInX
{
    int closestToX = [(NSValue *)[pathPoints firstObject] CGPointValue].x;
    for(int i = 1; i < [pathPoints count]; i++)
    {
        if([(NSValue *)[pathPoints objectAtIndex:i] CGPointValue].x < closestToX)
        {
            closestToX = [(NSValue *)[pathPoints objectAtIndex:i] CGPointValue].x;
        }
    }

        return closestToX;
}

-(int)findOrigoInY
{
    int closestToY = [(NSValue *)[pathPoints firstObject] CGPointValue].y;
    for(int i = 1; i < [pathPoints count]; i++)
    {
        if([(NSValue *)[pathPoints objectAtIndex:i] CGPointValue].y > closestToY)
        {
            closestToY = [(NSValue *)[pathPoints objectAtIndex:i] CGPointValue].y;
        }
    }

    return closestToY;
}

-(NSMutableArray*)generateKoordinateArray
{
    NSLog(@"count in pathPoints : %lu", (unsigned long)[pathPoints count]);
    NSMutableArray *storeArray = [[NSMutableArray alloc] init];
    BezierCsvFormat *storeBezier = [[BezierCsvFormat alloc] init];

    NSString *stringValueX;
    NSString *stringValueY;

    int xOffset = [self findOrigoInX];
    NSLog(@"x offset : %d", xOffset);

    int yOffset = [self findOrigoInY];
    NSLog(@"y offset : %d", yOffset);

    for(int i = 1; i < [pathPoints count]; i++)
    {
        storeBezier = [[BezierCsvFormat alloc] init];
        stringValueX = [NSString stringWithFormat:@"%d", (int)[(NSValue *)[pathPoints objectAtIndex:i-1] CGPointValue].x - xOffset];
        stringValueY = [NSString stringWithFormat:@"%d", ABS((int)[(NSValue *)[pathPoints objectAtIndex:i-1] CGPointValue].y - yOffset)];
        [storeBezier setp0:[NSString stringWithFormat:@"%@,%@",stringValueX, stringValueY]];


        stringValueX = [NSString stringWithFormat:@"%d", (int)[(NSValue *)[controlPoints objectAtIndex:i-1] CGPointValue].x - xOffset];
        int multiplicator = 1;
        if((int)[(NSValue *)[controlPoints objectAtIndex:i-1] CGPointValue].y > yOffset)
        {
            multiplicator = multiplicator * -1;
        }
        stringValueY = [NSString stringWithFormat:@"%d", multiplicator * ABS((int)[(NSValue *)[controlPoints objectAtIndex:i-1] CGPointValue].y - yOffset)];
        [storeBezier setp1:[NSString stringWithFormat:@"%@,%@",stringValueX, stringValueY]];


        stringValueX = [NSString stringWithFormat:@"%d", (int)[(NSValue *)[pathPoints objectAtIndex:i] CGPointValue].x - xOffset];
        stringValueY = [NSString stringWithFormat:@"%d", ABS((int)[(NSValue *)[pathPoints objectAtIndex:i] CGPointValue].y - yOffset)];
        [storeBezier setp2:[NSString stringWithFormat:@"%@,%@",stringValueX, stringValueY]];



        [storeArray addObject:storeBezier];

    }
        NSLog(@"count in storeArray : %lu", (unsigned long)[storeArray count]);
    return storeArray;
}

- (NSMutableArray*)printCoordinateSystem
{


    NSMutableArray *tempArray = [self generateKoordinateArray];

    return tempArray;
    NSLog(@"count in tempArray : %lu", (unsigned long)[tempArray count]);

    for(int i = 0; i < [tempArray count]; i++)
    {
        NSLog(@"p0 : %@ p1 : %@ p2 : %@", [(BezierCsvFormat*)[tempArray objectAtIndex:i] getp0], [(BezierCsvFormat*)[tempArray objectAtIndex:i] getp1], [(BezierCsvFormat*)[tempArray objectAtIndex:i] getp2]);
    }
}




-(void)resetView{

    @try {
        [path removeAllPoints];
        pathPoints = [NSMutableArray array];

        [self.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
        [self.layer.sublayers makeObjectsPerformSelector:@selector(removeFromSuperlayer)];

        [self setNeedsDisplay];
    }
    @catch (NSException *exception) {
        [self resetView];
    }
    @finally {

    }

}

0 个答案:

没有答案