Попробуйте что-то вроде
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 в старых и новых прямоугольниках.