2013-07-29 7 views
0

저는 CAShapeLayer를 사용하여 선을 그릴 수 있지만 45도 각도에서만 선을 그립니다. 라인을 45도 각도로 그려야합니다. 그렇지 않으면 뷰에서 제거됩니다. 어떻게하면 CAShapeLayer를 사용하여 선을 그릴 수 있습니까? 제발 도와주세요. 방금 locationorigin 사이의 각도가 45도 +/- 엡실론 것을 확인해야iPhone에서 CAShapeLayer를 사용하여 45도 각도로 선 그리는 방법

- (void)handlePanGesture:(UIPanGestureRecognizer *)gesture 
{ 
static CGPoint origin; 
CGPoint location ; 
if (gesture.state == UIGestureRecognizerStateBegan) 
{ 
    shapeLayer = [self createShapeLayer:gesture.view]; 
    origin = [gesture locationInView:gesture.view]; 
    UIView *tappedView = [gesture.view hitTest:origin withEvent:nil]; 
    UILabel *tempLabel = (UILabel *)tappedView; 
    [valuesArray addObject:tempLabel]; 

    if(valuesArray) 
    { 
     [valuesArray removeAllObjects]; 
    } 
    valuesArray = [[NSMutableArray alloc] init]; 
} 
else if (gesture.state == UIGestureRecognizerStateChanged) 
{ 
     path1 = [UIBezierPath bezierPath]; 
     [path1 moveToPoint:origin]; 
     location = [gesture locationInView:gesture.view]; 
     [path1 addLineToPoint:location]; 
     shapeLayer.path = path1.CGPath; 
} 
} 

- (CAShapeLayer *)createShapeLayer:(UIView *)view 
{ 
shapeLayer = [[CAShapeLayer alloc] init]; 
shapeLayer.fillColor = [UIColor clearColor].CGColor; 
shapeLayer.strokeColor = [UIColor redColor].CGColor; 
shapeLayer.lineCap = kCALineCapRound; 
shapeLayer.lineJoin = kCALineJoinRound; 
shapeLayer.lineWidth = 10.0; 
[view.layer addSublayer:shapeLayer];//view.layer 

return shapeLayer; 
} 
+0

프로그래밍을 이해 한 것 같습니다. 나머지는 단지 기초적인 수학입니다. 삼각법 (사인파, 코사인, 접선)을 반복 할 수있는 기회. –

답변

0

, 내가 이해에서 : 다음은 그리기 라인 내 코드입니다. 따라서 코드는 다음과 같을 수 있습니다.

// EPSILON represent the acceptable error in pixels 
#define EPISLON 2 

// ... 

else if (gesture.state == UIGestureRecognizerStateChanged) 
{ 
    path1 = [UIBezierPath bezierPath]; 
    [path1 moveToPoint:origin]; 

    location = [gesture locationInView:gesture.view]; 

    // only add the line if the absolute different is acceptable (means less than EPSILON) 
    CGFloat dx = (location.x - origin.x), dy = (location.y - origin.y); 
    if (fabs(fabs(dx) - fabs(dy)) <= EPISLON) { 
     [path1 addLineToPoint:location]; 
     shapeLayer.path = path1.CGPath; 
    } 
}