Кодирование iPhone - Как добавить поворот к сенсорному событию? - PullRequest
1 голос
/ 18 декабря 2009

Как я могу добавить вращение к объекту в дополнение к перетаскиванию?

Мне не обязательно быть мультитач.

code:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    currentTouch = [touch locationInView:self.view];
    CGFloat dx = currentTouch.x - carMove.position.x;
    CGFloat dy = currentTouch.y - carMove.position.y;
    CGFloat dist = sqrt(dx * dx + dy * dy);
    if(dist <carMove.radius) {
        carMove.velocity = CGPointMake(0.0, 0.0);
        carMove.dragging = YES;
    }

    lastTouch = currentTouch;
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    currentTouch = [touch locationInView:self.view];
    if( carmove.dragging ){
        carMove.position = currentTouch;
        carMove.velocity = CGPointMake(currentTouch.x - lastTouch.x, currentTouch.y - lastTouch.y);
    }
    lastTouch = currentTouch;
}


- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    carMove.dragging = NO;
}

1 Ответ

0 голосов
/ 18 декабря 2009

Попробуйте что-то вроде

for (int c=0; c < imagesArray.count; c++) {

  MyCustomImageObject img = [imagesArray objectAtIndex:c];

  CGContextSaveGState(context);

  CGContextTranslateCTM(context,
    img.centreOfRotatedImageInBottomLeftPixelCoordsX,
    img.centreOfRotatedImageInBottomLeftPixelCoordsY);

  CGContextRotateCTM(context, img.floatingPointImageAngleInRadians);

  CGContextDrawImage(context,
    CGMakeRect(-img.width/2, -img.height/2, +img.width/2, +img.height/2),
    image.CGImage);

  CGContextRestoreGState(context);
}

Или, если вы хотите иметь одно представление для каждого изображения, один раз используйте такой код внутри цикла в drawRect: метод ваших пользовательских представлений изображений.

EDIT

Вам нужно зарегистрироваться на события акселерометра, если вы хотите основывать вращение на повороте телефона. Вам нужно будет применить фильтр нижних частот, как Apple предлагает в документах, в функции, которая получает события:

#define kFilteringFactor 0.1
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:
  (UIAcceleration *)acceleration {
  // Use a basic low-pass filter to keep only the gravity component of each axis.
  accelX = (acceleration.x * kFilteringFactor) + (accelX * (1.0 - kFilteringFactor));
  accelY = (acceleration.y * kFilteringFactor) + (accelY * (1.0 - kFilteringFactor));
  accelZ = (acceleration.z * kFilteringFactor) + (accelZ * (1.0 - kFilteringFactor));
}

Затем просто сделайте atan (accelY, accelX), установите его для перемещаемого объекта и вызовите setNeedsDisplay.

Если производительность недостаточно высока, вы можете попробовать протестировать CGRect, отправленный в drawRect, и перерисовать только изображения, которые находятся внутри прямоугольника перерисовки; но будьте осторожны, если прямоугольник переместился, вы также захотите (scrub out / erase) прямоугольник, в котором он находился непосредственно перед его перемещением, поэтому ведите учет этих прямоугольников и создайте больший прямоугольник перекраски из минимальных и максимальных значений X и Y в старых и новых прямоугольниках.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...