아이폰 OS는 : 위의 그림을 참조에서는 나는이 고민하고 터치에 의해
남자를 조정 될 수있는 점에 대해 라인이 ...
회전, 나는 라인을 가지고 특정 지점에 고정되어 있습니다. 라인의 다른 쪽 끝에서 고정되어 있지 않은 다른 점이 화면의 아무 위치로든 드래그 될 수 있습니다. 나는 그 점을 따라갈 수있는 선이 필요하고 길이가 변하지 않고 그것의 위치와 관련하여 회전 될 수 있어야한다.
나는이 모든 것이 고정 길이의 선을 가지지 않고 아주 쉽게 달성 될 수 있음을 알고있다.
당신은 단순히 같은 drawRect:
에서 UIBezierPath
을 그릴 수 :
UIBezierPath *bezPath = [UIBezierPath bezierPath];
[bezPath moveToPoint:fixedPointStart];
[bezPath addLineToPoint:draggedPointEnd];
[bezPath stroke];
그런 다음 드래그 된 지점의 새로운 좌표를 통과하고 다시 그려 가지고 당신의 UIView에 -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
에 [self setNeedsDisplay]
를 호출합니다.
하지만 앞서 언급 한 것처럼 고정 길이가되도록 라인이 필요합니다.
다른 점은 (차이가 있는지 확실하지 않은 경우) 라인이 실제로 불규칙한 모양의 더 큰 UIBezierPath
의 일부라는 것입니다. 그림에 표시된 "특정 고정 점"은이 선을 더 큰 불규칙한 UIBezierPath
에 첨부하는 지점입니다. 선은 다음 코드에서 볼 수있는 것과 같이 UIBezierPath
의 일부로 그려집니다.
// I AM CREATING THE FIXED POINT HERE THAT IS BEING RETURNED BY A CUSTOM METHOD
WHICH FINDS THE POINT OF ATTACHEMENT TO THE LARGER IRREGULAR SHAPED UIBEZIERPATH.
// THE DRAGGABLE POINTS ARE ACTUALLY UIVIEW'S AND I'M USING THEIR ORIGINS.
CGPoint fixedPoint = [aPath findCurveBezierPathPointInBetweenTheStartPoint:point1.frame.origin
theEndPoint:topCurvePoint.frame.origin
withFirstControlPoint:topCurveFirstControlPoint.frame.origin
andSecondControlPoint:topCurveSecondControlPoint.frame.origin atPercentage:0.3];
// This is the fixed point
CGPoint startPoint = fixedPoint;
// This is the point that is going to be able to be dragged
CGPoint endPoint = topCurveFirstControlPoint.frame.origin;
// I am finding the angle in between these two points to pass in an CGAffineTransform for the rotation.
float angle = [self getRotatingAngle:startPoint secondPoint:endPoint];
NSLog(@"Angle in Radians: %f",angle);
// I am creating the transform by passing in the angle and doing the necessary translations for the rotation to occur on the fixed point.
CGAffineTransform transform = CGAffineTransformMakeTranslation(fixedPoint.x, fixedPoint.y);
transform = CGAffineTransformRotate(transform, angle);
transform = CGAffineTransformTranslate(transform,-fixedPoint.x,-fixedPoint.y);
// I am setting up to draw the line of fixed length and applying the transform and
[aPath moveToPoint:startPoint];
[aPath addLineToPoint:CGPointMake(fixedPoint.x, fixedPoint.y - 60)];
[aPath applyTransform:transform];
// I then continue to draw the rest of the BezierPath and stroke it at the end.
[aPath moveToPoint:point1.frame.origin];
[aPath addCurveToPoint:topCurvePoint.frame.origin controlPoint1:topCurveFirstControlPoint.frame.origin controlPoint2:topCurveSecondControlPoint.frame.origin];
그래서 제 질문은 다음과 같습니다 : 그래서 여기
내가 지금 가지고있는 것입니다 내가 호출 될 때마다 drawRect:
로 변환 할 고정 라인을 가지고있는 올바른 각도을 어떻게 찾을 때 드래그를 포인트가 새로운 위치를 찾았습니까?
내가 고정 점과 끌기 점 사이의 각도를 찾는 데 사용하는 방법은 내가 테스트 한 것처럼 올바른 각도를 제공합니다. 그러나 나는 그 두 점 사이의 각도를 드래그 할 수있는 지점과 관련하여 올바르게 회전시키는 방법을 알아낼 수 없습니다.
편집 : 정확하게 수행하려는 작업에 대한 더 나은 설명을 위해 Link이 추가되었습니다.
피타고라스는 여러분의 친구입니다. – Till
정교하게 주시겠습니까? 나는 두 점 사이의 각도를 안다. 나는 그것을 회전에 적용하는 데 어려움을 겪고있다. – DanielRak