이 문제를 해결하는 데 가까워지고 있지만 문제가되는 부분이 있습니다. 사용자가 캔버스에서 회전, 크기 조절 및 배치 할 수있는 눈금자 객체를 모방하려고 시도하고 가장자리를 따라 추적하여 캔버스에 마크를 만듭니다. 내가 겪고있는 문제는 사용자의 손가락이 어디에 있느냐에 관계없이 줄의 다음 지점을 얻는 것입니다. 포인트에서부터 내가 가지고있는 가장자리를 따라 작은 투명한 뷰로 포인트를 되돌릴 수는 있지만 앨리어싱 (aliasing) (또는 무언가)으로 인해 라인은 순수한 직선 (0, 90, 180)이 아닌 다른 각도로 그려지는 것처럼 꼬여 있습니다. , 270). 또한 CGRectContainsPoint와 같은 함수를 작성하려고 시도했습니다. 단, 임의의 회전 사각형을 사용하지만 성공하지 못했습니다. 여기 눈금자 물체의 가장자리를 따라 그리기
는 사용자의 터치에 따라 포인트 계산 코드입니다 때문에 어떤 이유로,- (CGPoint)perpendicularPointFromPoint:(CGPoint)point
{
CGPoint testPoint1 = point;
CGPoint testPoint2 = testPoint1;
CGPoint pointToUse = CGPointZero;
//Get the right angle to the current rotation, and make
//a unit vector in that direction
CGFloat rightAngle = mCurRotation + M_PI_2;
CGFloat xInc = cosf(rightAngle);
CGFloat yInc = sinf(rightAngle);
//Check both "forward" and "backward"
int counter = 0;
while(pointToUse.x == 0)
{
testPoint1.x += xInc;
testPoint1.y += yInc;
testPoint2.x -= xInc;
testPoint2.y -= yInc;
//mLineOutline is a small view on top of the ruler (transparent)
if([self.superview hitTest:testPoint1 withEvent:nil] == mLineOutline)
{
pointToUse = testPoint1;
}
else if([self.superview hitTest:testPoint2 withEvent:nil] == mLineOutline)
{
pointToUse = testPoint2;
}
else if(counter++ > 1000) //Neither ray intersects the ruler
pointToUse.x = -1.f;
}
return CGPointMake(roundf(pointToUse.x), roundf(pointToUse.y));
}
그러나을 줄 불안감 나는 위아래로하지만, 매우 눈에 띄는 그것은 (단지 몇 픽셀을 그릴 때). 이 문제를 해결하기 위해 무엇을 할 수 있습니까? 또한 덜 어색한 방법이 있습니까?
뚱뚱한 손가락을 사용하는 사용자의 그림이 눈금자의 가장자리에 "물리기"때문에 손가락의 움직임이 그려진 선의 길이를 나타냅니다. 그리고 당신이 얻고있는 "경련"은 그 길이만큼 오래 있을까요? 또는 통치자로부터 수직으로/떨어져 있습니까? –
@JoshCaswell 손가락을 단단히 고정시키지 않아도 그리는 동안 눈금자에서 작은 점 (1cm, 2cm)을 볼 수 있고 직선을 볼 수 있습니다. 귀하의 요약도 꽤 정확합니다. 원하는만큼 멀리 손가락을 움직여 그리는 선을 볼 수 있습니다. 직선은 눈금자에 수직으로 꼬여 있고 길이는 매우 매끄 럽습니다. 나는 그것이 반 화소와 히트 테스트와 관련이 있다는 것을 알고있다. – borrrden
그리고'mLineOutline'이 그것의 가장자리가 눈금자와 같도록 회전됩니까? 이 방법을 확인하는 방법을 잘 모르겠지만 superview가 히트 테스트에 사용하는 사각형이 회전 된 뷰의 rect와 동일한 지 확신합니까? 가장 작은 _non-rotated_ enclosing 사각형 (즉, 프레임/경계 구분이 갑자기 중요 해짐)을 고려하여 수퍼 뷰에 대한 뷰 가이드의 내용을 기억합니다. 내가 그것을 찾을 수 있는지 보자 ... –