В прошлом я использовал класс XAffineTransform из набора инструментов GeoTools для извлечения вращения из аффинной матрицы. Это работает, даже когда масштабирование и сдвиг были применены.
Это библиотека Java, но вы должны легко конвертировать ее в (Objective-) C. Вы можете посмотреть источник для XAffineTransform здесь . (Метод называется getRotation.) И вы можете прочитать API здесь .
В этом суть метода:
final double scaleX = getScaleX0(tr);
final double scaleY = getScaleY0(tr) * flip;
return Math.atan2(tr.getShearY()/scaleY - tr.getShearX()/scaleX,
tr.getScaleY()/scaleY + tr.getScaleX()/scaleX);
Вам также необходимо реализовать методы getScale / getShear. Совсем не сложно. (По большей части вы можете просто скопировать код Java как есть.)