#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;