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
의 인스턴스를 생성하고 그 좌표 값이 먼저 좌표로 설정해야 할 것입니다 사용자가 화면을 탭하면 state
을 PKLinePointStart
으로 설정하여 회선의 시작을 표시합니다. 이 요소를 배열에 추가하십시오.
그러면 사용자가 화면을 드래그하면 touchesMoved
에서 여러 좌표가 전송됩니다. 여기 좌표를 다시 설정하는 동일한 데이터 모델의 인스턴스를 만들지 만 이번에 상태는 PKLinePointMiddle
으로 저장 될 것입니다. 우리는이 상태에 대해 검사하지 않을 것이기 때문에이 점들을 정말로 신경 쓰지 않습니다. 그러나 여전히 그것을 제공하는 것이 좋습니다. 이 상태를 가진 배열 내의 모든 요소가 서버로만 점을 형성한다는 사실을 알 수있는 값입니다. 점은 결국 전체 행을 만듭니다. 이 인스턴스는 사용자가 마지막으로 드래그 (화면에 현재 행 그리기)를 중지 할 때까지 필요한만큼 배열에 계속 추가됩니다.
곧 touchesEnded
메서드가 호출됩니다. 즉, 줄의 끝을 나타냅니다. 사용자가 손가락을 들어 올리면 데이터 모델의 마지막 인스턴스를 만들고 여기에 좌표를 설정하고 마지막으로 상태를 설정합니다. PKLinePointEnd
상태가됩니다. 다시 말하지만, 배열 내부에이 인스턴스를 추가 할 수도 있습니다.
이제 모든 좌표를 추적 할 수있는 의미있는 맞춤 배열이 있지만 어떤 요소가 시작 상태, 중간 및 끝 상태인지 알 수 있습니다.
모든 시작 상태는 줄을 구성하는 데 필요한 많은 중간 요소로 끝 상태와 연결됩니다.
여기에서 멈추려면 for 루프를 실행하고 어레이에 추가 된 최신 start
및 end
요소를 결정하기 만하면됩니다. :)
논리 2 단계 - 알고리즘 개선 : 이제
을 당신은 당신이 돌아 가야 얼마나 멀리 배열에서 결정하는 배열의 요소 수천 통해 반복 할 wan't 해달라고 줄을 지우는 것만으로는 비효율적입니다. 여기에서 두 번째 데이터 모델이 유용 할 것입니다. 이 두 번째 데이터 모델은 행을 추적하고 배열에있는 어떤 요소를 start
및 end
index
이상으로 저장하여 저장하고, 우리가 수행 할 좌표 배열을 저장합니다. 그들은 선을 그리는 완료로
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
의 마지막 인스턴스를 제거한 다음 필요한 경우 줄을 다시 그리기 만하면됩니다.
어떻게 지내는지 알려주십시오.
무엇이 라인을 결정합니까? 배열의 단순 요소입니까, 배열의 여러 요소입니까? 여러 요소 인 경우 선의 시작 요소와 선을 끝내는 요소를 어떻게 정의합니까? – Pavan
@Pavan 나는 100 % 질문을 이해한다고 생각하지 않는다. 그러나 touchhes에 내가 배열에 coords를 추가 시작이 배열은 감동을 터치와 그 coords 내가 손가락을 실행 배열에 추가됩니다 그럼지도에 그려진 –
그래서 질문 1) 한 줄을 가능성이 여러 개있을 수 좌표? 질문 1에 대한 대답이 예이면 2) 다음 작업을 수행하십시오. 사용자가 손가락을 눌러 선 그리기를 시작하고 화면을 가로 지른 다음 손가락을 위로 올립니다. 이 동작이 한 줄로 그려지는 것으로 분류됩니까? – Pavan