Как восстановить сохраненное преобразование при перевороте

#iphone #objective-c #ios #cgaffinetransform

#iPhone #objective-c #iOS #cgaffinetransform

Вопрос:


Я сохраняю преобразование и фрейм объекта. Когда приложение перезагружается, мне просто нужно восстановить фрейм и преобразование в новом представлении. Можно подумать, что можно просто установить фрейм и преобразовать в сохраненные значения, но это не так. Это приводит к нежелательным результатам.

http://iphonedevelopment.blogspot.com/2008/10/demystifying-cgaffinetransform.html

Говорится: «Когда вы применяете успешные преобразования, порядок имеет значение. Поворот и затем перевод дадут вам другой результат, чем перевод и затем поворот. Это может укусить вас, если вы не будете осторожны.»

У меня возникают проблемы с преобразованием только при сохранении преобразования, которое было ПЕРЕВЕРНУТО. Мои сохраненные значения идентичны значениям, которые применяются к восстановленному представлению.

Фактические результаты:

При выполнении :

myNewView.frame = Сохраненный фрейм

myNewView.transform = Сохраненная трансформация

Мой вид сместится вниз и вправо (не к месту).

Может ли кто-нибудь помочь мне восстановить мое преобразование в надлежащем порядке операций?

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

Ответ №1:

Чтобы отменить сохраненное преобразование, вам необходимо обратное преобразование. Посмотрите заголовок, возвращающийся на страницу, на которую вы ссылались. Попробуйте:

 myNewView.transform = CGAffineTransformInvert(savedTransform);
  

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

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

Редактировать:

Перечитав вопрос, я подозреваю, что происхождение преобразования, возможно, изменилось. Когда задействован поворот, поворот вокруг другого источника будет отображаться как неожиданный перевод. В документах исходным пунктом является либо центр вида, либо точка привязки слоя. Я предлагаю проверить эти свойства при сохранении преобразования и посмотреть, отличаются ли они при восстановлении.

Комментарии:

1. Извините, я дал хороший ответ на неправильный вопрос! Я посмотрю еще раз.

2. Это было оно! Итак, для всех, кто когда-либо пытается восстановить положение и преобразование, вам нужно восстановить их в следующем порядке: myNewView.frame = mySavedFrame; myNewView.center = mySavedCenter; myNewView.transform = mySavedTransform;