2012-05-02 3 views
4

Фон: Я хотел анимировать изменение в моем содержании вместе с ориентацией. Положение моего контента относительно self.view.bounds.iOS: Ориентация получить будущее self.view.bounds

Задача: Для того, чтобы анимировать содержимое вместе с границами, мне нужно знать, каковы будут границы обзора в конце. Я могу жестко кодировать его, но я надеюсь найти более динамичный способ.

кода: Так вся анимация проходит в willRotateToInterfaceOrientation согласно следующему:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 
    //centering the image 
    imageView.frame = CGRectMake(self.view.bounds.origin.x + (self.view.bounds.size.width - image.size.width)/2 , self.view.bounds.origin.y + (self.view.bounds.size.height - image.size.height)/2, image.size.width, image.size.height); 
    NSLog(@"%d",[[UIDevice currentDevice] orientation]); 
    NSLog(@"%f", self.view.bounds.origin.x); 
    NSLog(@"%f", self.view.bounds.origin.y); 
    NSLog(@"%f", self.view.bounds.size.width); 
    NSLog(@"%f", self.view.bounds.size.height); 

} 

Границ являются перед тем изменения ориентации. Таким образом, это работает, только если преобразование составляет 180 градусов. Если бы я использовал didRotateFromInterfaceOrientation, анимация будет после изменение ориентации, которое выглядит ужасно.

ответ

11

Используйте willAnimateRotationToInterfaceOrientation:duration: вместо этого. Этот метод вызывается изнутри блока анимации вращения, и все границы были правильно установлены на этом этапе. Docs.

+1

Не знал, что существует :) Спасибо. – Byte

+0

Ах ... долго искал это. Спасибо! –

1

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

imageView = //init imageView 
imageView.autoresizingMask = UIViewAutoresizingFlexibleTopMargin|UIViewAutoresizingFlexibleBottomMargin|UIViewAutoresizingFlexibleLeftMargin|UIViewAutoresizingFlexibleRightMargin; 
//addtional config 

Это означает, что вам нужно только чтобы установить кадр один раз, тогда ImageView всегда будет настраиваться, чтобы оставаться посередине.

Заканчивать ссылка http://developer.apple.com/library/ios/ipad/#documentation/uikit/reference/uiview_class/uiview/uiview.html класса UIView, чтобы посмотреть, что еще можно сделать с помощью свойства autoresizingMask

+0

+1 для отличной идеи. Мне придется пойти на ответ выше, хотя, поскольку это на самом деле то, что я ищу. Спасибо! – Byte

0

Если я правильно понять вас, вам просто нужно поменять местами X/Y координаты и ширина/высота в вы CGRectMake, чтобы получить ваше будущее макет изменения в 90 градусов. Если это изменение на 180 градусов, то оно совпадает с текущим

CGRectMake(self.view.bounds.origin.y + (self.view.bounds.size.height - image.size.height)/2 , self.view.bounds.origin.x + (self.view.bounds.size.width - image.size.width)/2, image.size.height, image.size.width); 
+0

Спасибо, это, однако, довольно взлома. Потому что тогда вам придется обрабатывать 180 градусов флип и т. Д. Не стоит этого. Спасибо за ваши мысли. – Byte

+0

Определенно рубить, но хаки там есть. 3 секунды взломать> чем час на google, если вы на крайнем сроке – JoeCortopassi

Смежные вопросы