2013-07-17 2 views
1

У меня есть UIView, к которому применяются различные масштабы и вращения CGAffineTransforms в ответ на жесты сенсорного экрана.Применение только компонента шкалы CGAffineTransform к UIView

Когда масштабная операция завершена, я хочу настроить границы вида на новый размер, а затем иметь представление, чтобы повторно рисовать себя по шкале от 1,0, сохраняя при этом все остальные компоненты преобразования одинаковыми.

Для регулировки границы представления, я использую:

self.myView.bounds = CGRectApplyAffineTransform(self.myView.bounds, self.myView.transform); 

«отменить» масштаб преобразования, я пытаюсь это:

self.myView.transform = CGAffineTransformConcat(self.myView.transform, CGAffineTransformMakeScale(1, 1)); 

затем вызывая [myView setNeedsDisplay], чтобы получить представление перерисовать себя.

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

Каков самый чистый способ «отменить» только масштабное преобразование и перерисовать вид в 1: 1 со всеми остальными непокрытыми остатками?

ответ

0

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

Одно можно сказать: я предлагаю вам не менять границы, а вместо этого просто использовать масштабную операцию преобразования. Это позволит избежать некоторых возможных ненужных макетов. Все это можно обработать исключительно с помощью свойства transform. То, как вы сейчас это делаете, не изменит ничего, поскольку применение шкалы 1 не является операцией. Если вы увеличили представление на 2, вам нужно будет масштабироваться на 0,5, чтобы вернуться к оригиналу. Или, как я сказал выше, сохраните все компоненты и заново создайте их из матрицы идентичности (математическая математика быстро, не беспокойтесь об этом).

+1

Благодаря borrrden. Причина, по которой я меняю границы, - это то, что я хочу, чтобы представление перерисовывало себя без какого-либо преобразования масштаба, чтобы содержимое было четким, а не размытым, как при применении масштабного преобразования. –

+0

Если вы используете CoreGraphics для рисования, вы можете попробовать установить contentScale на слое в соответствии с масштабом. По моему опыту это приводит к резкой перерисовке. Если вы настаиваете на использовании метода bounds, тогда вы должны сохранить масштаб в другом месте, вы можете его отменить (разделите ширину и высоту границ по шкале). Вероятно, вам также придется переделать все операции, поскольку умножение матрицы не * коммуникативно. – borrrden

0

Сохраните значения шкалы в переменной, а затем попытайтесь изменить CGAffineTransformMakeScale (1, 1) в

CGAffineTransformMakeScale(1/totalScaleWidth, 1/totalScaleHeight)