2013-02-06 60 views
1

從貝塞爾路徑對象中繪製直線和圓後,我想現在將這些對象移動到屏幕上。首先,當我觸及路徑對象時,它應該被選中,我已經使用containsPoint:方法。我如何移動一個UIBezierPath對象與touchesMoved?

現在我想讓這個選定的物體在我拖動我的方格時移動。我想知道如何將一個撫摸bezierpath對象移動到一個新的位置?

這裏是我的觸動代碼開始:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [touches anyObject]; 
    startPoint = [touch locationInView:self]; 
    //NSLog(@"start point:- %f, %f", startPoint.x, startPoint.y); 

    isHitInPath = NO; 
    if(!isTextMode) 
    { 

     for (NSDictionary *testDict in pathArray) 
     { 
      if([((UIBezierPath *)[testDict objectForKey:@"path"]) containsPoint:startPoint])// if starting touch is on an object of bezierpath 
      { 
       NSLog(@"touch point is in path: %@ >>>>>>>>>>>>>>", [testDict objectForKey:@"path"]); 
       isHitInPath = YES; 

       currentSelectedPath = ((UIBezierPath *)[testDict objectForKey:@"path"]); 

       CAShapeLayer *centerline = [CAShapeLayer layer]; 
       centerline.path = currentSelectedPath.CGPath; 
       centerline.strokeColor = [UIColor whiteColor].CGColor; 
       centerline.fillColor = [UIColor clearColor].CGColor; 
       centerline.lineWidth = 1.0; 
       centerline.lineDashPattern = [NSArray arrayWithObjects:[NSNumber numberWithInt:6], [NSNumber numberWithInt:6], nil]; 
       [self.layer addSublayer:centerline]; 

       // showing animation on line 
       CABasicAnimation *dashAnimation; 
       dashAnimation = [CABasicAnimation animationWithKeyPath:@"lineDashPhase"]; 

       [dashAnimation setFromValue:[NSNumber numberWithFloat:0.0f]]; 
       [dashAnimation setToValue:[NSNumber numberWithFloat:45.0f]]; 
       [dashAnimation setDuration:1.0f]; 
       [dashAnimation setRepeatCount:10000]; 

       [centerline addAnimation:dashAnimation forKey:@"linePhase"]; 


       break; 
      } 
     } 
} 

應該是什麼運動的正確方法(或者可以刪除舊路徑對象,然後創建相同的大小,圖的新的,然後移動它)觸摸移動的路徑對象。

+0

這可能是一個[一個有用的回答類似的問題(HTTP://計算器。 com/questions/8109482/is-uibezierpath-the-best-way-make-a-movable-rounded-rectangle) – bbarnhart

+0

對不起,但多數民衆贊成在不同的問題 – Rakesh

+0

你的問題有什麼不同? – bbarnhart

回答

2

對不起,遲到了,我解決了它。下面是從我的應用程序的代碼:

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

    UITouch *touch = [touches anyObject]; 
    endPoint = [touch locationInView:self]; 

    if(isAnyShapeSelected) // shape is selected and getting moved 
    { 
       [self deselectShape];// deselect the selected shape 

       // then create a new bezier path object with a new location (transformed bezierpath object) 
       CGPathRef _path = currentSelectedPath.CGPath;// currentSelectedPath is a path which we have selected in touches begin (or while moving) 
       CGAffineTransform transform = CGAffineTransformIdentity; 
       transform = CGAffineTransformTranslate(transform, endPoint.x-startPoint.x, endPoint.y-startPoint.y); 

       _path = (CGPathCreateMutableCopyByTransformingPath(_path, &transform)); 

       currentSelectedPath.CGPath = _path; 

//    UIBezierPath *uiPath = [UIBezierPath bezierPathWithCGPath:_path]; 
//    uiPath.lineWidth = currentSelectedPath.lineWidth; 

       startPoint = endPoint; 

       [self selectShape:currentSelectedPath];// select the shape again 

       [dict_path removeAllObjects];//remove all object from current drawing dictionary 

       //   NSLog(@"pathArray: %@", pathArray); 

       // Add values to dictionary 
       if([[pathArray objectAtIndex:selectedShapeIndex] objectForKey:@"shape"])// if key 'shape' exist for the selected shape, if filled arrow is selected 
        [dict_path setValue:@"arrow" forKey:@"shape"]; // then there must be no affect on it while moving it 
       [dict_path setValue:currentSelectedPath forKey:@"path"]; 
       [dict_path setValue:[[pathArray objectAtIndex:selectedShapeIndex] objectForKey:@"color"] forKey:@"color"]; 

       [pathArray removeObjectAtIndex:selectedShapeIndex];// REMOVING object frm pathArray 
       NSDictionary *tempDict = [NSDictionary dictionaryWithDictionary:dict_path]; 
       [pathArray insertObject:tempDict atIndex:selectedShapeIndex];// addding selected shape at every pixel movement 
       [dict_path removeAllObjects]; 

       CGPathRelease(_path); 
       [self setNeedsDisplay]; 
    } 
} 


// here is my draw rect method 
- (void)drawRect:(CGRect)rect 
{ 

    for(NSDictionary *_pathDict in pathArray) 
    { 
     if([_pathDict objectForKey:@"shape"])// if shape is arrow then fill it(shape key is taken for arrow) 
     { 
      [((UIColor *)[_pathDict valueForKey:@"color"]) setFill]; // this method will choose the color from the receiver color object (in this case this object is :strokeColor) 
      [[_pathDict valueForKey:@"path"] fill]; 
     } 
     [((UIColor *)[_pathDict valueForKey:@"color"]) setStroke]; // this method will choose the color from the receiver color object (in this case this object is :strokeColor) 
     [[_pathDict valueForKey:@"path"] strokeWithBlendMode:kCGBlendModeNormal alpha:1.0]; 
    } 

    if([dict_path objectForKey:@"shape"]) 
    { 
     [[dict_path objectForKey:@"color"] setFill]; // this method will choose the color from the receiver color object (in this case this object is :strokeColor) 
     [[dict_path objectForKey:@"path"] fill]; 
    } 

    [[dict_path objectForKey:@"color"] setStroke]; // this method will choose the color from the receiver color object (in this case this object is :strokeColor) 
    [[dict_path objectForKey:@"path"] strokeWithBlendMode:kCGBlendModeNormal alpha:1.0]; 

} 

-(void)deselectShape // deselect shape 
{ 
    [centerline removeFromSuperlayer]; 
    isAnyShapeSelected = NO; 
    [btnResize removeFromSuperview]; 

    // show hide delete button 
    [self.delegate showDeleteButton:isAnyShapeSelected];//delegate to active and inactive delete button 
} 

關於如何選擇上touchesBegin形狀看我前面回答的How do I detect a touch on a UIBezierPath and move a ball along that?