Ios 自动布局动画问题

Ios 自动布局动画问题,ios,animation,autolayout,Ios,Animation,Autolayout,我有3个视图层次结构(popover、page container、pageview),pageview放在pagecontainer中,pagecontainer放在popover中。它们都属于UIView类 我在pagecontainer上添加了一个滑动手势。发生滑动时,页面视图将替换为另一个页面视图。我正在尝试在我滑动之后立即获得动画。它从当前状态开始向左滑动,但当我向右滑动时,它会出错,并且在所有滑动之后,它会继续保持混乱状态。由于某些原因,动画不一致 下面是代码,我尝试将约束放在动画块

我有3个视图层次结构(popover、page container、pageview),pageview放在pagecontainer中,pagecontainer放在popover中。它们都属于UIView类

我在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];


    }
}

自动布局的第一条规则是不能触摸框架

不能更改自动布局层次中视图的边框、边界或中心

阅读你的代码有点让人困惑,所以我不能100%确定你实际上在制作什么动画。但是你需要做的是删除所有的行,比如

pageContainer.frame = CGRectMake(pageContainer.frame.origin.x, pageContainer.frame.origin.y, pageContainerSize.width, pageContainerSize.height);
当你想在屏幕上移动一些东西时,你需要更新约束,这样新的约束就意味着新的布局

例如,如果要设置视图高度的动画,则需要

保留对自动布局约束的引用

@property (nonatomic, strong) NSLayoutConstraint *heightConstraint;
或者

然后更改约束的
常量
属性

// animate the height to 150.
heightConstraint.constant = 150;
并设置布局更改的动画

[UIView animateWithDuration:5.0
                      delay:0.0
                    options: UIViewAnimationOptionBeginFromCurrentState
                 animations:^{
                     [pageContainer.superview layoutIfNeeded];
                 }
                 completion:^(BOOL finished){
                 }];
一旦您知道哪些约束需要更改,您就可以确定如何最好地构建约束,以便为它们设置动画

编辑

您还需要确保您正在关闭自动调整掩码转换大小

[someView setTranslatesAutoresizingMaskIntoConstraints:NO];
不过,我会努力使代码更具可读性。可能会将内容移到不同的函数中,以减少代码复制等


现在读起来很混乱。

自动布局的第一条规则是你不能触摸框架

不能更改自动布局层次中视图的边框、边界或中心

阅读你的代码有点让人困惑,所以我不能100%确定你实际上在制作什么动画。但是你需要做的是删除所有的行,比如

pageContainer.frame = CGRectMake(pageContainer.frame.origin.x, pageContainer.frame.origin.y, pageContainerSize.width, pageContainerSize.height);
当你想在屏幕上移动一些东西时,你需要更新约束,这样新的约束就意味着新的布局

例如,如果要设置视图高度的动画,则需要

保留对自动布局约束的引用

@property (nonatomic, strong) NSLayoutConstraint *heightConstraint;
或者

然后更改约束的
常量
属性

// animate the height to 150.
heightConstraint.constant = 150;
并设置布局更改的动画

[UIView animateWithDuration:5.0
                      delay:0.0
                    options: UIViewAnimationOptionBeginFromCurrentState
                 animations:^{
                     [pageContainer.superview layoutIfNeeded];
                 }
                 completion:^(BOOL finished){
                 }];
一旦您知道哪些约束需要更改,您就可以确定如何最好地构建约束,以便为它们设置动画

编辑

您还需要确保您正在关闭自动调整掩码转换大小

[someView setTranslatesAutoresizingMaskIntoConstraints:NO];
不过,我会努力使代码更具可读性。可能会将内容移到不同的函数中,以减少代码复制等


现在读起来很混乱。

我添加了CGSize pageContainerSize=[pageContainer systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];pageContainer.frame=CGRectMake(pageContainer.frame.origin.x,pageContainer.frame.origin.y,pageContainerSize.width,pageContainerSize.height);抱歉,我添加了上述代码以查找intrisinc内容大小并将其设置为pagecontainer。没有它,我无法看到图幅。是的,我已为所有视图设置了SetTranslatesAutoResizezingMasktoConstraints属性。我不知道现在该怎么办。
setTranslatesAutoResizengMasktoConstraints
未找到。您的意思是
设置TranslatesAutoResizingMaskintoConstraints
?我添加了CGSize pageContainerSize=[pageContainer systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];pageContainer.frame=CGRectMake(pageContainer.frame.origin.x,pageContainer.frame.origin.y,pageContainerSize.width,pageContainerSize.height);抱歉,我添加了上述代码以查找intrisinc内容大小并将其设置为pagecontainer。没有它,我无法看到图幅。是的,我已为所有视图设置了SetTranslatesAutoResizezingMasktoConstraints属性。我不知道现在该怎么办。
setTranslatesAutoResizengMasktoConstraints
未找到。您的意思是
设置翻译自动调整大小GMaskintoConstraints