2015-05-20 3 views
3

Я пишу приложение, которое позволяет пользователю рисовать все, что им нужно в представлении. Пока они рисуют, я отправляю значения координат одновременно в веб с помощью Json и рисую одну и ту же диаграмму в Интернете. Когда я рисую медленно, я получаю все значения координат, подобные этому.Как получить все координатные точки (X и Y) в ios

{"XY":["92,240","94,240","96,240","97,240","98,240","99,240","100,240","102,240","103,240","104,240","104,240","105,240","106,240","107,240","108,240","108,240","110,240","110,240","112,240","112,240","114,240","115,240","116,240","117,240","118,240","120,240","120,240","120,240","122,240","122,240","124,240","124,240","126,240"]} 

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

{"XY":["96,320","117,302","170,262","252,208"]} 

Следующий код, который я использовал для его реализации.

@implementation PJRSignatureView 
{ 
    UIBezierPath *beizerPath; 
    UIImage *incrImage; 
    CGPoint points[10]; 
    uint control; 
} 
- (void)drawRect:(CGRect)rect 
{ 
    [incrImage drawInRect:rect]; 
    [beizerPath stroke]; 

    // Set initial color for drawing 

    UIColor *fillColor = INITIAL_COLOR; 
    [fillColor setFill]; 
    UIColor *strokeColor = INITIAL_COLOR; 
    [strokeColor setStroke]; 
    [beizerPath stroke]; 

} 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    if ([lblSignature superview]){ 
     [lblSignature removeFromSuperview]; 
    } 
    rectArray = [[NSMutableArray alloc] init]; 
    control = 0; 
    UITouch *touch = [touches anyObject]; 
    points[0] = [touch locationInView:self]; 

    CGPoint startPoint = points[0]; 
    CGPoint endPoint = CGPointMake(startPoint.x + 1.5, startPoint.y 
           + 2); 



    [beizerPath moveToPoint:startPoint]; 
     NSLog(@"myPoint = %@", [NSValue valueWithCGPoint:endPoint]); 
     NSLog(@"beizerPath :%@",beizerPath); 
    [beizerPath addLineToPoint:endPoint]; 
    NSLog(@"beizerPath end:%@",beizerPath); 
} 

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [touches anyObject]; 
    CGPoint touchPoint = [touch locationInView:self]; 
    control++; 
    points[control] = touchPoint; 

    if (control == 4) 
    { 
     points[3] = CGPointMake((points[2].x + points[4].x)/2.0, (points[2].y + points[4].y)/2.0); 

     [beizerPath moveToPoint:points[0]]; 
     [beizerPath addCurveToPoint:points[3] controlPoint1:points[1] controlPoint2:points[2]]; 

     [self setNeedsDisplay]; 

     points[0] = points[3]; 
     points[1] = points[4]; 
     control = 1; 
    } 
     NSLog(@"beizerPathmove:%@",beizerPath); 
    NSString *rect_xy = [NSString stringWithFormat:@"%.f,%.f",touchPoint.x,touchPoint.y]; 

    [rectArray addObject:rect_xy]; 
} 

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [self drawBitmapImage]; 
    [self setNeedsDisplay]; 
    [beizerPath removeAllPoints]; 

    NSMutableDictionary *rectDict = [[NSMutableDictionary alloc]init]; 
    [rectDict setValue:rectArray forKey:@"XY"]; 
    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:rectDict options:0 error:nil]; 

    // Checking the format 
    NSLog(@"%@",[[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]); 
    control = 0; 
} 

Как найти все значения координат, даже когда я рисую быстро?

+0

Возможно, это ваш код, который замедляет работу обработчиков и, следовательно, пропускает события. Начните с удаления создания 'jsonData' в' touchesEnded' и просмотра, если это улучшит ситуацию. – trojanfoe

+0

@trojanfoe даже я пробовал данные json за пределами touchsEnded, но получал одинаковые результаты. И я NSLog строковое значение rect_xy даже там, где отсутствует координата. –

+0

Используется NSLog для строки «rect_xy». Даже до добавления массива с именем «rectArray» отсутствуют координаты. –

ответ

0

Продукты Apple отправляют события касания через определенные промежутки времени. Итак, если вы рисуете/записываете что-нибудь медленно, чтобы получить все значения координат, если вы рисуете/пишите быстро, вы будете меньше некоторых из них. И примените ту же функцию в сети, которую вы использовали. Надеюсь, теперь это будет исправлено.

0

Система отправляет события касания с определенным интервалом. Если вы двигаетесь медленно, вы получаете больше, но быстро, вы получаете меньше. Вы не сможете получить больше, если будете двигаться быстро. Но вам также больше не нужно. Вам просто нужно нарисовать линию между точками, независимо от того, расстояние между ними невелико или больше.

+0

есть ли способ управлять событиями сенсорной системы через определенный интервал? –

+1

Нет. Вы не можете изменить интервал, в который система посылает события касания. Но зачем вам больше? Возможно, есть еще одно решение для вашей проблемы. – pteofil

+0

На самом деле приложение собирается показать скорость сервера MQTT для пользователя. Таким образом, пользователь рисует все, что должно быть показано на веб-странице, если я получу все координаты, чтобы они работали. если значения координат пропущены только пунктиром, отображаемым только в Интернете. –

Смежные вопросы