Рисование прямых линий пальцем на iPhone - PullRequest
4 голосов
/ 19 марта 2012

Справочная информация: Я пытаюсь создать действительно простое приложение для iPhone, которое позволит пользователю рисовать пальцем несколько прямых линий на экране.

Я использую эти дваметоды в моем UIViewController для захвата координат конечных точек каждой линии.

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event

Вопрос: Я хотел бы, чтобы линия появилась, как только touchesEnded сработал, а затемпродолжайте рисовать больше линий на экране.Как мне это сделать?Мне не обязательно нужен код, но мне нужна помощь с общей картиной того, как его собрать.Кроме того, я не большой поклонник xibs и люблю делать все программно, если это влияет на ответ.

Что я пробовал: Я пытался использовать Quartz 2d, нокажется, чтобы использовать это, вы должны рисовать в методе drawRect отдельного подклассического вида.Таким образом, я должен был бы создать новый вид для каждой строки?и тогда мои координаты будут испорчены, потому что мне придется перевести touches позиции из UIViewController в представление.

Я также пробовал с OpenGL, который у меня былчуть больше успеха с (используя GLPaint sample в качестве шаблона), но OpenGL кажется излишним просто для рисования некоторых прямых линий на экране.

Ответы [ 3 ]

2 голосов
/ 19 марта 2012

U упомянул, что вам просто нужна большая картина идеи ..

Итак, вот она ..

Взгляните, подкласс UIView.Захват касается событий, а затем рисует его в drawRect: method ..

Это все, что @kurtRevis упомянул в своем ответе.

Теперь, чтобы избежать замедления рисования, сохраняйте автономное изображение с обновленным видом экрана, а затем просто добавляйте линии поверх этого.Таким образом, вы не получите замедления производительности, когда будет нарисован большой массив линий.

Надеюсь, ты меня понимаешь.

2 голосов
/ 19 марта 2012

Вам не нужно несколько представлений, и вам не нужен OpenGL.

Создайте подкласс из UIView - назовите его CanvasView.

Создайте объект дляпредставляет "линию" на вашем холсте - это будет подкласс NSObject с CGPoint свойствами для начала и конца.

CanvasView должен содержать массив строк, находящихся на холсте.

В -[CanvasView drawRect:] переберите все строки в массиве и нарисуйте каждую из них.

В -[CanvasView touchesBegan:withEvent:] сохраните начальную точку в переменной экземпляра.В -[CanvasView touchesEnded:withEvent:] создайте новую линию с начальной и конечной точками и добавьте ее в массив строк.Вызовите [self setNeedsDisplay], чтобы перерисовать представление.

0 голосов
/ 19 марта 2012

Насколько я знаю, вы также можете использовать Core Graphics, чтобы нарисовать линию, и из вашего вопроса вам не нужно создавать представления для каждой отдельной строки, вместо этого ваш графический контекст одного представления будет чертежным листом для всех рисунок, и вы почти ближе к решению. Просто взяв координату касания, вы можете нарисовать линии на виде.
CGPoint previousPoint; // Это должно иметь глобальную область видимости, оно будет использоваться во всех сенсорных событиях

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{       
   UITouch *touch = [touches anyObject];
   previousPoint = [touch locationInView:self]; // take the starting touch point;
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{
   CGPoint currentPoint;
   UITouch *touch = [touches anyObject];   
   currentPoint = [touch locationInView:self]; 
   CGContextRef context = UIGraphicsGetCurrentContext();
   CGContextSetLineWidth(context, 2.0);
   CGContextMoveToPoint(context, previousPoint.x,previousPoint.y);
   CGContextAddLineToPoint(context, currentPoint.x,currentPoint.y);
   CGContextStrokePath(bluecontext);

}

Надеюсь, это поможет вам, дайте мне знать любую проблему ....

...