2013-05-03 2 views
1

У меня есть представление, чьи subviews настраиваются на основе ограничений (pre-iOS 6, без автоматического макета). Я вращаю устройство, и представления ожидают их новые позиции и размеры, как ожидалось.Вручную отменяет анимацию вращения одного вида?

Я добавляю новый взгляд на свой XIB. Это представление должно будет изменить положение таким образом, который не может быть описан ограничениями, когда устройство вращается. Можно ли разрешить логику вращения по умолчанию для всех, кроме нового вида?

Если нет (и this question предполагает, что нет), как это должно быть обработано?

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

// Called on "viewWillAppear" 
- (void)adjustLayout 
{ 
    if (UIInterfaceOrientationIsLandscape(self.interfaceOrientation)) 
    { 
     self.myView.frame = CGRectMake(150, 128, 181, 39); 
    } 
    else 
    { 
     self.myView.frame = CGRectMake(119, 148, 181, 39); 
    } 
} 

// Called on willRotateToInterfaceOrientation 
- (void)adjustLayoutToOrientation:(UIInterfaceOrientation)orientation duration:(NSTimeInterval)duration 
{ 
    // This is not really a good way to override the default animations, but it gets the job done. 
    [UIView animateWithDuration:duration animations:^{ 
     if (UIInterfaceOrientationIsLandscape(orientation)) 
     { 
      NSLog(@"frame: %@", NSStringFromCGRect(self.myView.frame)); 
      self.myView.frame = CGRectMake(69, 201, 181, 39); 
     } 
     else 
     { 
      NSLog(@"frame: %@", NSStringFromCGRect(self.myView.frame)); 
      self.myView.frame = CGRectMake(258, 94, 181, 39); 
     } 
    }]; 
} 

ответ

1

Решение макета пользовательских элементов просмотра в методе:

-(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:

Всех изменения макета называется в этом блоке будут анимированные вместе со стандартной анимацией вращения.

Пример:

#import "OSViewController.h" 

@implementation OSViewController 

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation{ 
    return YES; 
} 

-(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{ 
    [self layout]; 
} 

-(void)viewWillAppear:(BOOL)animated{ 
    [super viewWillAppear:animated]; 
    [self update]; 
    [self layout]; 
} 

-(void)update{ 

} 

-(void)layout{ 

} 

@end 
+0

Ваш "раскладка" эквивалентно моему "adjustLayout"? Потому что, если я назову «adjustLayout» в didRotateFromInterfaceOrientation:, мое представление заканчивается в нужном месте, но если я его вызову из willRotateToInterfaceOrientation :: он не ... –

+0

Да, «макет» эквивалентен «adjustLayout», но акцент заключается в том, что он вызван в willAnimateRotationToInterfaceOrientation: duration: NOT willRotateToInterfaceOrientation;) –

+0

Да, это то, что я имел в виду в своем комментарии. Не существует никакой функции willAnimateRotationToInterfaceOrientation без длительности. Это работает для вас? Это не работает для меня ... –