2013-08-21 1 views
1

У меня есть 3 иерархии представлений (popover, page container, pageview), просмотр страниц помещается внутри pagecontainer, а pagecontainer помещается внутри popover. Все они имеют класс UIView.Autolayout Animation issue

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

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

- (IBAction)swipeLeft:(id)sender { 

    if (_currentPage < [_pages count] - 1) { 
     UIView *currentView = _pages[_currentPage]; 
     UIView *pageContainer = [currentView superview]; 

     [currentView removeFromSuperview]; 
     ++_currentPage; 
     if (_pageControl) 
      _pageControl.currentPage = _currentPage; 
     UIView *newPage = _pages[_currentPage]; 


     [pageContainer addSubview:newPage]; 


     newPage.center = CGPointMake(CGRectGetMidX(self.bounds), CGRectGetMidY(self.bounds)); 
     newPage.frame = CGRectIntegral(newPage.frame); 

     [pageContainer.superview layoutIfNeeded]; 

     NSDictionary *pageviews = NSDictionaryOfVariableBindings(newPage); 

     if (SYSTEM_VERSION_LESS_THAN(@"7.0")) 
      [pageContainer addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-10.0-[newPage]-10.0-|" options:0 metrics:nil views:pageviews]]; 

     else if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) 
      [pageContainer addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0.0-[newPage]-0.0-|" options:0 metrics:nil views:pageviews]]; 


     [pageContainer addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0.0-[newPage]-0.0-|" options:0 metrics:nil views:pageviews]]; 

     CGSize pageContainerSize = [pageContainer systemLayoutSizeFittingSize:UILayoutFittingCompressedSize]; 
     pageContainer.frame = CGRectMake(pageContainer.frame.origin.x, pageContainer.frame.origin.y, pageContainerSize.width, pageContainerSize.height); 


     [UIView animateWithDuration:5.0 
           delay:0.0 
          options: UIViewAnimationOptionBeginFromCurrentState 
         animations:^{ 
          [pageContainer.superview layoutIfNeeded]; 

         } 
         completion:^(BOOL finished){ 
         }]; 

     UIWindow *window = [[UIApplication sharedApplication].windows objectAtIndex:0]; 

     [self adjustPopoverOrientationWithCurrentOrientation:window]; 


    } 
} 

и ...

- (IBAction)swipeRight:(id)sender { 
    if (_currentPage > 0) { 
     UIView *currentView = _pages[_currentPage]; 
     UIView *pageContainer = [currentView superview]; 

     [currentView removeFromSuperview]; 
     --_currentPage; 
     if (_pageControl) 
      _pageControl.currentPage = _currentPage; 
     UIView *newPage = _pages[_currentPage]; 

     [pageContainer addSubview:newPage]; 

     newPage.center = CGPointMake(CGRectGetMidX(self.bounds), CGRectGetMidY(self.bounds)); 
     newPage.frame = CGRectIntegral(newPage.frame); 

     [pageContainer.superview layoutIfNeeded]; 

     NSDictionary *pageviews = NSDictionaryOfVariableBindings(newPage); 

     if (SYSTEM_VERSION_LESS_THAN(@"7.0")) 
      [pageContainer addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-10.0-[newPage]-10.0-|" options:0 metrics:nil views:pageviews]]; 

     else if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) 
      [pageContainer addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0.0-[newPage]-0.0-|" options:0 metrics:nil views:pageviews]]; 

     [pageContainer addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0.0-[newPage]-0.0-|" options:0 metrics:nil views:pageviews]]; 

     CGSize pageContainerSize = [pageContainer systemLayoutSizeFittingSize:UILayoutFittingCompressedSize]; 

     pageContainer.frame = CGRectMake(pageContainer.frame.origin.x, pageContainer.frame.origin.y, pageContainerSize.width, pageContainerSize.height); 



     [UIView animateWithDuration:5.0 
           delay:0.0 
          options: UIViewAnimationOptionBeginFromCurrentState 
         animations:^{ 
          [pageContainer.superview layoutIfNeeded]; 

         } 
         completion:^(BOOL finished){ 
         }]; 


     UIWindow *window = [[UIApplication sharedApplication].windows objectAtIndex:0]; 


     [self adjustPopoverOrientationWithCurrentOrientation:window]; 


    } 
} 

ответ

14

Первое правило Автокомпоновка является то, что вы не можете коснуться рамки.

Вы не можете изменить рамки, рамки или центр представления, находящиеся в иерархии автоматического макета.

Чтение вашего кода немного запутанно, поэтому я не уверен на 100%, что вы на самом деле оживляете. Но то, что вам нужно сделать, это удалить все строки, как ...

pageContainer.frame = CGRectMake(pageContainer.frame.origin.x, pageContainer.frame.origin.y, pageContainerSize.width, pageContainerSize.height); 

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

Например, если вы хотите анимировать высоту зрения, то вам нужно ...

Держите ссылку на ограничение Автокомпоновка ...

@property (nonatomic, strong) NSLayoutConstraint *heightConstraint; 

или ...

// if you're creating the constraint in Interface Builder then CTRL drag it like any other outlet. 
@property (nonatomic, weak) IBOutlet NSLayoutConstraint *heightConstraint; 

Затем измените constant свойство ограничения.

// animate the height to 150. 
heightConstraint.constant = 150; 

и анимировать изменение макета ...

[UIView animateWithDuration:5.0 
         delay:0.0 
        options: UIViewAnimationOptionBeginFromCurrentState 
       animations:^{ 
        [pageContainer.superview layoutIfNeeded]; 
       } 
       completion:^(BOOL finished){ 
       }]; 

После того, как вы знаете, какие ограничения нужно изменить, вы можете работать, как лучше строить свои ограничения, так что они могут быть анимированными.

EDIT

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

[someView setTranslatesAutoresizingMaskIntoConstraints:NO]; 

Я бы работать над тем, код более читаемым, хотя. Возможно, переместите материал на разные функции, чтобы уменьшить репликацию кода и т. Д. ...

Сложно читать на данный момент.

+0

Я добавил страницу CGSizeContainerSize = [страницаКонтейнерная системаLayoutSizeFittingSize: UILayoutFittingCompressedSize]; страницаContainer.frame = CGRectMake (страница Контейнер.frame.origin.x, pageContainer.frame.origin.y, pageContainerSize.width, pageContainerSize.height); – Rajashekar

+0

Извините, я добавил вышеуказанный код, чтобы найти размер содержимого intrisinc и установить его в pagecontainer. я не могу увидеть рамку представления без него. Да, я установил свойство setTranslatesAutoresizingMaskToConstraints для всех моих просмотров. Я не уверен, что делать сейчас. – Rajashekar

+0

'setTranslatesAutoresizingMaskToConstraints' не найден. Вы имели в виду 'setTranslatesAutoresizingMaskIntoConstraints'? – Pang