Получение правильного кадра внутри willRotateToInterfaceOrientation

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

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

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

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


person adamsiton    schedule 11.09.2011    source источник
comment
Я решил эту проблему, написав метод в каждом подпредставлении, который будет обрабатывать часть смены кадров. Я установлю фрейм родительского представления в willRotateToInterfaceOrientation, а затем сгенерирую новый аналогичный фрейм с помощью функции CGFrameMake и передам его каждому подпредставлению. Это сработало для меня .... проверьте, полезно ли это.   -  person Mohammad    schedule 11.09.2011
comment
Я не совсем понял твой ответ. В willRotateToInterface я до сих пор не знаю кадр superView, потому что вращение еще не произошло. Это проблема.   -  person adamsiton    schedule 11.09.2011
comment
Я не использую фрейм superView для поворота подвидов. Я рассчитываю, какое значение будет иметь кадр superView после поворота, затем создаю новый CGRect на основе расчета, а затем передаю его методу handleOrientation каждого subView. Если вы не можете рассчитать, какое значение будет иметь кадр superView после поворота, то вышеописанное вам не подойдет.   -  person Mohammad    schedule 11.09.2011
comment
Да, к сожалению, я не могу рассчитать, каким будет кадр superView после поворота.   -  person adamsiton    schedule 11.09.2011
comment
Можете ли вы дать какое-либо представление о том, какой контент вы просматриваете? без этого мне было бы трудно что-либо предложить.   -  person Mohammad    schedule 11.09.2011
comment
На самом деле ответ Акшая был тем, что я искал. Спасибо, в любом случае.   -  person adamsiton    schedule 12.09.2011


Ответы (2)


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

person Akshay    schedule 11.09.2011
comment
Но это будет означать, что я перемещаю всю логику компоновки в View, а не в ViewController. В настоящее время я устанавливаю макет subView в соответствии со свойствами UIViewController. Перемещение логики в UIView означает, что я должен создать подкласс UIView и переместить все параметры в этот пользовательский подкласс. Я не совсем уверен, что эта логика должна быть в UIView, а не в UIVIewController, но попробую. - person adamsiton; 11.09.2011

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

-(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
}
person Dash    schedule 19.11.2011