Рендеринг касается движений Moved и Fingerpaint slow - iOS7

У меня есть приложение, которое позволяет делать дактилоскопию. Для этого я использую штрихи Beg, touchMoved, штрихи Ended. На iOS6 работает плавно, при перемещении пальца линия закрашивается. Но на iOS7 закрашивается только первая точка из штрихов Bean и на штрихах закругленная линия закрашивается.

Есть ли у кого-нибудь похожая проблема и / или решение?

  • (void)touchesMoved:(NSSet *) затрагивает событие Event:(UIEvent *) { mouseSwiped = YES; UITouch *touch = [касается любого объекта]; CGPoint currentPoint = [touch locationInView:drawImage]; // currentPoint.y -= 20; // только для 'kCGLineCapRound' UIGraphicsBeginImageContext(drawImage.frame.size); [drawImage.image drawInRect:CGRectMake(0, 0, drawImage.frame.size.width, drawImage.frame.size.height)]; // изначально self.frame.size.width, self.frame.size.height)]; CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound); //kCGLineCapSquare, kCGLineCapButt, kCGLineCapRound CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 30.0); // для размера CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), 0,0, 0,0, 1,0, 1,0); // значения для R, G, B и Alpha CGContextBeginPath (UIGraphicsGetCurrentContext ()); CGContextMoveToPoint (UIGraphicsGetCurrentContext (), lastPoint.x, lastPoint.y); CGContextAddLineToPoint (UIGraphicsGetCurrentContext (), currentPoint.x, currentPoint.y); CGContextStrokePath (UIGraphicsGetCurrentContext ()); drawImage.image = UIGraphicsGetImageFromCurrentImageContext (); UIGraphicsEndImageContext ();

    lastPoint = currentPoint;

    mouseMoved ++;

    if (mouseMoved == 10) {mouseMoved = 0; }

}

РЕДАКТИРОВАТЬ и решение!

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

Вместо этого сохраните свои точки сенсорных данных где-нибудь, а затем нарисуйте их позже, например, внутри обратного вызова цикла анимации опроса (используя CADisplayLink или повторяющийся таймер), вне сенсорного обработчика, таким образом, не перекрывая пользовательский интерфейс.

Комментарий от Лоуренса Ингрэма на форуме разработчиков Apple

Исходя из этого, я сделал следующие изменения:

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    currentPoint = [touch locationInView:self.view];
    [self performSelector:@selector(drawFinger) withObject:nil afterDelay:0.0];
}

- (void)drawFinger
{
    UIGraphicsBeginImageContext(imgDibujo.frame.size);
    [imgDibujo.image drawInRect:CGRectMake(0, 0, imgDibujo.frame.size.width, imgDibujo.frame.size.height)]; //originally self.frame.size.width, self.frame.size.height)];
    CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound); //kCGLineCapSquare, kCGLineCapButt, kCGLineCapRound
    CGContextSetLineWidth(UIGraphicsGetCurrentContext(), delegate.lineAncho); // for size
    CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), delegate.colorR, delegate.colorG, delegate.colorB, delegate.colorS); //values for R, G, B, and Alpha
    CGContextBeginPath(UIGraphicsGetCurrentContext());
    CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);
    CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentPoint.x, currentPoint.y);
    CGContextStrokePath(UIGraphicsGetCurrentContext());
    imgDibujo.image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    lastPoint = currentPoint;
}

Теперь он отлично работает на всех устройствах iPad. Надеюсь, что это полезно для вас.

0 ответов

Другие вопросы по тегам