2011-09-11 2 views
5

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

Проблема в том, что если я изменяю рамку подвидных объектов во время воспроизведения willRotateToInterfaceOrientation, анимация верна, но в кадре супервизор по-прежнему является рамкой из старой ориентации.

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

Каков правильный способ изменения рамок подвид при изменении ориентации?

+0

Я решил эту проблему, написав метод в каждом подсмотре, который будет обрабатывать часть изменения кадра. Я установлю кадр родительского представления в willRotateToInterfaceOrientation, а затем сгенерирую новый аналогичный фрейм с использованием функции CGFrameMake и передам его каждому подвидю. Это сработало для меня .... проверьте, полезно ли это. – Mohammad

+0

Я не совсем понял ваш ответ. В willRotateToInterface я до сих пор не знаю рамки супервизора, потому что вращения еще не произошло. Это проблема. – adamsiton

+0

Я не использую рамку superView для вращения подзонов. Я вычисляю, что будет стоить для кадра superView после вращения, а затем создаст новый CGRect на основе вычислений, а затем передаст это для обработки метода Orientation для каждого subView. Если вы не можете рассчитать, какая будет ценность для кадра SuperView после вращения, то выше не будет работать для вас. – Mohammad

ответ

3

Думаю, вы можете попробовать переопределить layoutSubviews. Там вы можете разбить подзоны в соответствии с текущей ориентацией, не беспокоясь о том, будет или нет RotateFromInterfaceOrientation. layoutSubviews вызывается каждый раз, когда выкладываются виды. Это поможет вам сэкономить время смены кадров с помощью анимации.

НТН,

Акшай

+0

Но это будет означать, что я перемещаю всю логику компоновки в представление, а не в ViewController. В настоящее время я устанавливаю макет subView в соответствии со свойствами UIViewController. Перемещение логики в UIView означает, что я должен подклассифицировать UIView и переместить все параметры в этот настраиваемый subClass. Я не совсем уверен, что эта логика должна быть в UIView, а не в UIVIewController, но я попробую. – adamsiton

4

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

-(void)willAnimateRotationToInterfaceOrientation (UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 
{ 
    float width = UIInterfaceOrientationIsPortrait(toInterfaceOrientation) ? [[UIScreen mainScreen] applicationFrame].size.width : [[UIScreen mainScreen] applicationFrame].size.height; 
//do something with the width now 
//or you can get the height the same way 
} 
Смежные вопросы