Как я могу предотвратить перекос при масштабировании UIView в одном направлении после вращения? - PullRequest
0 голосов
/ 26 июля 2011

Я вращаю UIView следующим образом:

CGAffineTransform currentTransform = [gestureRecognizer view].transform;    
CGAffineTransform newTransform = CGAffineTransformRotate(currentTransform,rotation);
[[gestureRecognizer view] setTransform:newTransform]; 

и я хотел бы масштабировать одно измерение этого вида (ширину или высоту) после поворота. Однако, если я сделаю следующее:

CGAffineTransformScale(self.parent.parentWidget.transform,sX, 1);

Я получаю перекос. Как мне предотвратить это и сделать так, чтобы один размер можно было изменить после поворота?

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

Ответы [ 2 ]

2 голосов
/ 27 июля 2011

Ваша проблема относится к тому порядку, в котором вы применяете свои преобразования. Если вы попытаетесь масштабировать вид в одном измерении после его поворота, вы не получите желаемого эффекта. Масштабирование будет выполняться в измерении X или Y конечного повернутого объекта, не основываясь на его исходной системе координат.

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

0 голосов
/ 26 июля 2011

Ваш вид всегда будет искажен, если вы используете

CGAffineTransformScale(self.parent.parentWidget.transform,sX, 1);

Попробуйте масштабировать x и y на одно и то же значение:

CGAffineTransformScale(self.parent.parentWidget.transform,sX, sX);
...