2014-12-17 1 views
-1

폴리 라인 오버레이에서 작업 해 왔고 붙어있을 때 매우 도움이되었습니다. 다시 도움이 필요합니다.마지막으로 그려진 폴리 라인 실행 취소

내 프로젝트에서지도에서 폴리선을 그릴 때 터치 감동을 시작했습니다. 손가락을 드래그 한 좌표가 내 배열에 추가되어 표시됩니다. 내가/제거 할 마지막으로 그린 ​​선을 취소 할 경우

나는 단순히 배열을 비우고 내 라인을 취소 할

,이,

그러나 괜찮습니다. 나는 배열에서 마지막 값을 뺀 수있는 인상을 받았지만 더 깊이 생각하면서 문제가 있음을 깨달았습니다. 배열의 각 요소는 내 손가락이 마지막으로 접촉 한 좌표입니다. 나는 이것을 아직 시도하지 않았지만 배열의 마지막 값을 뺀 것만으로도 상상할 수있다. 나는 오랫동안 "그린"선을 지울 것이다. 나는 "Undo"키를 누르면 내가 그린 전체 선을 지우는 방법을 찾고있었습니다. 그 라인이 북미에서 영국까지 확장 되더라도.

+0

무엇이 라인을 결정합니까? 배열의 단순 요소입니까, 배열의 여러 요소입니까? 여러 요소 인 경우 선의 시작 요소와 선을 끝내는 요소를 어떻게 정의합니까? – Pavan

+0

@Pavan 나는 100 % 질문을 이해한다고 생각하지 않는다. 그러나 touchhes에 내가 배열에 coords를 추가 시작이 배열은 감동을 터치와 그 coords 내가 손가락을 실행 배열에 추가됩니다 그럼지도에 그려진 –

+0

그래서 질문 1) 한 줄을 가능성이 여러 개있을 수 좌표? 질문 1에 대한 대답이 예이면 2) 다음 작업을 수행하십시오. 사용자가 손가락을 눌러 선 그리기를 시작하고 화면을 가로 지른 다음 손가락을 위로 올립니다. 이 동작이 한 줄로 그려지는 것으로 분류됩니까? – Pavan

답변

0

OP는 그려진 마지막 줄을 실행 취소 할 수 있기를 원합니다. 그가 상상하는 문제는 배열에서 단일 요소를 제거하면 시각적으로 사용자가 그린 선의 일부만 제거된다는 것입니다. 배열에서 행을 구성하는 모든 요소를 ​​제거하는 것이 좋습니다.

그리기에 많은 노력을 기울이지는 않았지만 문제에 대한 해결책이 필요합니다.

다음을 수행하여 화면에 그려지거나 배열에 추가 된 각 좌표에 대해 가능한 세 가지 상태를 만드는 열거 형 데이터 형식을 만듭니다.

이 데이터 유형은 다음과 같이 보일 것입니다 :

typedef NS_ENUM(NSInteger, PKLinePointState) { 
    PKLinePointStart, 
    PKLinePointMiddle, 
    PKLinePointEnd 
}; 
여기 아이디어는 당신이 당신의 배열의 요소는 배열의 시작 지점과 요소가되어있는 결정하기 위해이 데이터 유형을 사용하는 것입니다

끝 점. 이 방법을 사용하면 배열의 행을 결정할 수 있으므로 PKLinePointStart 상태의 좌표를 칠 때까지 삭제할 요소의 수를 결정할 수 있습니다.

배열에 좌표 만 저장하는 대신 원하는 섹시한 것을 수행 할 수 있도록 더 많은 정보를 저장할 데이터 모델을 저장하려고합니다.

첫 번째 데이터 모델은 배열의 시작 및 끝 좌표와 요소를 저장하는 데 사용됩니다. 이렇게하면 좌표로 작업하기가 더 쉬워집니다. 지금 당신은 당신의 좌표를 저장할 데이터 모델을 만들었으니

LinePointModel.h

typedef NS_ENUM(NSInteger, PKLinePointState) { 
     PKLinePointStart, 
     PKLinePointMiddle, 
     PKLinePointEnd 
    }; 

@interface LinePointModel : NSObject 

@property (assign) CGPoint linePointCoordinate; 
@property (assign) PKLinePointState linePointState; 
@end 

//you may want to create a custom initialiser so that the coordinate and state are initialised straight away. 
//It would look something like this -(instanceType)initWithLinePointCoordinate:(CGPoint)coordinate andLinePointState:(PKLinePointState)linePointstate; 

LinePointModel.m

//I'll let you complete the initialiser method in the implementation file. 

: 이것은 같을 것이다 것입니다 coordinates array에서 제대로 배열에 추가하는 방법은 다음과 같습니다.

1 단계 논리 : 사용자가 화면에 탭하면

이 - touchesBegan 메소드가 호출됩니다, 당신은 LinePointModel의 인스턴스를 생성하고 그 좌표 값이 먼저 좌표로 설정해야 할 것입니다 사용자가 화면을 탭하면 statePKLinePointStart으로 설정하여 회선의 시작을 표시합니다. 이 요소를 배열에 추가하십시오.

그러면 사용자가 화면을 드래그하면 touchesMoved에서 여러 좌표가 전송됩니다. 여기 좌표를 다시 설정하는 동일한 데이터 모델의 인스턴스를 만들지 만 이번에 상태는 PKLinePointMiddle으로 저장 될 것입니다. 우리는이 상태에 대해 검사하지 않을 것이기 때문에이 점들을 정말로 신경 쓰지 않습니다. 그러나 여전히 그것을 제공하는 것이 좋습니다. 이 상태를 가진 배열 내의 모든 요소가 서버로만 점을 형성한다는 사실을 알 수있는 값입니다. 점은 결국 전체 행을 만듭니다. 이 인스턴스는 사용자가 마지막으로 드래그 (화면에 현재 행 그리기)를 중지 할 때까지 필요한만큼 배열에 계속 추가됩니다.

touchesEnded 메서드가 호출됩니다. 즉, 줄의 끝을 나타냅니다. 사용자가 손가락을 들어 올리면 데이터 모델의 마지막 인스턴스를 만들고 여기에 좌표를 설정하고 마지막으로 상태를 설정합니다. PKLinePointEnd 상태가됩니다. 다시 말하지만, 배열 내부에이 인스턴스를 추가 할 수도 있습니다.

이제 모든 좌표를 추적 할 수있는 의미있는 맞춤 배열이 있지만 어떤 요소가 시작 상태, 중간 및 끝 상태인지 알 수 있습니다.

모든 시작 상태는 줄을 구성하는 데 필요한 많은 중간 요소로 끝 상태와 연결됩니다.

여기에서 멈추려면 for 루프를 실행하고 어레이에 추가 된 최신 startend 요소를 결정하기 만하면됩니다. :)

논리 2 단계 - 알고리즘 개선 : 이제

을 당신은 당신이 돌아 가야 얼마나 멀리 배열에서 결정하는 배열의 요소 수천 통해 반복 할 wan't 해달라고 줄을 지우는 것만으로는 비효율적입니다. 여기에서 두 번째 데이터 모델이 유용 할 것입니다. 이 두 번째 데이터 모델은 행을 추적하고 배열에있는 어떤 요소를 startendindex 이상으로 저장하여 저장하고, 우리가 수행 할 좌표 배열을 저장합니다. 그들은 선을 그리는 완료로

LineArrayModel.h

@interface LineArrayModel : NSObject 

@property (nonatomic, retain) NSMutableArray *arrayOfLinePoints; //What matters. 
//@property (assign) int lineNumber; 
//@property (assign) CGFloat lineThickness; 
//@property (strong, nonatomic) UIColor *lineColor; 
@end 

이 데이터 모델을 사용하여, 당신은 즉시 사용자가 화면에 선을 그립니다 때마다 임시 배열을 만든 것 배열을 잡고 LineArrayModel의 인스턴스에 저장합니다. 이 인스턴스는 myLinesArray라는 새 배열에 저장하는 데 사용됩니다. 이것은 화면에 선을 그릴 때 사용하는 배열입니다.

간단히 줄을 실행 취소하려면 모든 줄을 저장하는 배열에서 LineArrayModel의 마지막 인스턴스를 제거한 다음 필요한 경우 줄을 다시 그리기 만하면됩니다.

어떻게 지내는지 알려주십시오.

+0

수면 마비를 확인해보십시오 :) – Pavan

+0

고마워요, 그 라인들을 따라 생각하고있었습니다 :) –

+0

정말 있었습니까? 이마에서 땀을 흘리며 닦아 낸 것 같지 않습니다.). 어쨌든 문제 없습니다. 행운을 빕니다. – Pavan