Я не понимаю, почему / как работает CGAffineTransformTranslate - PullRequest
0 голосов
/ 15 июня 2011

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

Я подумал, что мне нужно будет создать вид вне экрана слева, а затем использовать CGAffineTransformTranslate, чтобы переместить его на экран. Но вместо этого я создаю его на экране, но он все равно прекрасно работает. Я немного смущен.

Здесь я создаю вид ...

profileViewControllerForIPad = [[ProfileViewController alloc] initWithFrame:CGRectMake(0, 0, 512, 446)];

Как видите, начало координат 0,0. Так на экране, верно?

Вот трансформация ...

[UIView animateWithDuration:0.5 
         animations:^{
            self.view.transform = CGAffineTransformTranslate(CGAffineTransformIdentity,self.view.frame.size.width, 0.0);                             
         }
 ];

Как вы можете видеть, я устанавливаю значение tx равным ширине CGAffineTransformTranslate, которое, как мне показалось, было значением числа пикселей, которое вы хотели бы переместить из его текущей позиции, origin.x of 0, которое, как я ожидал, будет переместите его в середину экрана куда-нибудь. Вместо этого он вставляется прямо с новым origin.x прямо в 0, где я хочу.

КСТАТИ CGAffineTransformIdentity отлично работает, сдвигая вид обратно с экрана.

Может кто-нибудь объяснить это мне. Документы, кажется, говорят что-то другое.

Спасибо

Джон

Ответы [ 2 ]

1 голос
/ 20 сентября 2011

Мне кажется, я понимаю это сейчас.Я думаю, что это зависит от того, когда вы выполняете CGAffineTransformTranslate.

Если вы создаете объект и вызываете CGAffineTransformTranslate перед тем, как добавить его в суперпредставление, при добавлении его в суперпредставление он отобразится в позиции, которая позволит ему переместиться в определенную позицию, в количестве и направленииопределяется в вызове CGAffineTransformTranslate.

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

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

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

0 голосов
/ 19 марта 2014

Я думаю, что вы можете анимировать свойство frame (- animateWithDuration: animations :) вашего viewControllers -view вместо использования преобразования, которое гораздо проще использовать и понимать.

...