Ответ 1
Я немного опоздал, но вот мои 2 цента, когда я столкнулся с аналогичной проблемой, чтобы решить проблему неспособности Autolayout обнаружить Compact Width/Compact Height для iPhone с iOS 7. В iOS 7 нет свойства activated
, поэтому мне пришлось добавлять/удалять их.
Я создал два метода для добавления и удаления ограничений, и эти ограничения уже установлены на IB, и я ссылаюсь на их свойства IBOutlet. Поэтому, поскольку я удаляю их, в отличие от других объектов IB, я должен установить их в strong
, а не weak
. В противном случае, как только я их удалю, они будут уничтожены, и я не смогу ссылаться на них еще раз, чтобы повторно добавить их.
Вот мой метод удаления ограничений:
-(void)removeiOS7andiPhone4inLandscapeToOrientation:(UIInterfaceOrientation)toInterfaceOrientation{
if( !UIInterfaceOrientationIsLandscape(toInterfaceOrientation )&&(NSFoundationVersionNumber<=NSFoundationVersionNumber_iOS_7_1)&&( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone )){
// if iPhone with iOS 7 on portrait remove Constraints here
}
}
и вот метод сумматора ограничений:
-(void)addiOS7andiPhone4inLandscapeToOrientation:(UIInterfaceOrientation)toInterfaceOrientation{
if( UIInterfaceOrientationIsLandscape(toInterfaceOrientation )&&(NSFoundationVersionNumber<=NSFoundationVersionNumber_iOS_7_1)&&( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone )){
// if iPhone with iOS 7 on landscape add Constraints here
}
}
Как для вызова этих методов, как вы пробовали, вызовите оба из них в viewWillAppear
(нет необходимости звонить в viewWillDisappear
) и viewWillTransitionToSize
(в моем случае это willRotateToInterfaceOrientation
, так как viewWillTransitionToSize
доступен только после iOS 8). Вызов их впоследствии имеет смысл, ведь только один из них будет запущен из-за проверки их портретной/альбомной ориентации с помощью if
, прежде чем вносить необходимые изменения.
и вот мое определение метода willRotateToInterfaceOrientation
:
-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{
[super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
// this will be run only if orientation is on Portrait
[self addiOS7andiPhone4inLandscapeToOrientation:toInterfaceOrientation];
// this will be run only if orientation is on Landscape
[self removeiOS7andiPhone4inLandscapeToOrientation:toInterfaceOrientation];
}
и выполните аналогичный вызов в viewWillAppear
.
УВЕДОМЛЕНИЕ: убедитесь, что в этих методах вы выполняете точную противоположность, и вы не обязательно добавляете ограничения только в addConstraintMethod и удаляете только в removeConstraintMethod. В моем случае я добавляю и удаляю ограничения в каждом из них, поэтому наименование методов точно не отражает их истинную роль, но пока вы делаете точные противоположности, вам хорошо идти.