用另一个动画大小更改替换子视图

Posted

技术标签:

【中文标题】用另一个动画大小更改替换子视图【英文标题】:Replace subview with another, animating size change 【发布时间】:2015-05-20 08:53:14 【问题描述】:

我有一个包含一个子视图的容器视图。我想用另一个大小与原始大小不同的视图替换这个子视图,因此容器也应该调整大小。这就是我想要做的事情

UIView *content = NEW_CONTENT;
content.translatesAutoresizingMaskIntoConstraints = NO;

[self.contentContainer layoutIfNeeded]; // the container view

// make the old content disappear first
[UIView animateWithDuration:0.3
                 animations:^
                     UIView *oldContent = [self.contentContainer.subviews firstObject];
                     oldContent.alpha = 0.0f;
                 
                 completion:^(BOOL finished) 
                     // then replace it with a new content
                     [UIView transitionWithView:self.contentContainer
                                       duration:0.1
                                        options:0
                                     animations:^
                                         [[self.contentContainer.subviews firstObject] removeFromSuperview];
                                         [self.contentContainer addSubview:content];
                                         [content autoPinEdgesToSuperviewEdgesWithInsets:UIEdgeInsetsZero];

                                         [self.contentContainer layoutIfNeeded];
                                     
                                     completion:^(BOOL finished)  // completion stuff];
                 ];

旧的内容不透明度动画正确,但布局更改时没有任何动画。我该如何解决?

【问题讨论】:

【参考方案1】:

//3 个视图(container,first,second) 在 vi​​ewdidload 中分配

UIView *container=[[UIView alloc] initWithFrame:CGRectMake(20, 20, 250, 300)];
container.backgroundColor=[UIColor redColor];
[self.view addSubview: container];

UIView *first=[[UIView alloc] initWithFrame:CGRectMake(100, 50, 100, 100)];
first.backgroundColor=[UIColor blueColor];
[self.view addSubview: first];

UIView *second=[[UIView alloc] initWithFrame:CGRectMake(50, 50, 200, 150)];
second.backgroundColor=[UIColor purpleColor];
second.alpha=0;
[self.view addSubview: second];

//删除第一个视图并更改容器框架并添加第二个视图的动画功能

[UIView transitionWithView:first duration:1.0 options:UIViewAnimationOptionTransitionCrossDissolve animations:^
    first.alpha=0.0;

 completion:^(BOOL finished) 
    [UIView transitionWithView:second duration:1.0 options:UIViewAnimationOptionTransitionCrossDissolve animations:^
        container.frame=CGRectMake(50, 10, 100, 200);
        second.alpha=1.0;

     completion:^(BOOL finished) 

    ];
];

我想你正在尝试同样的场景。它在我的情况下完美运行

【讨论】:

以上是关于用另一个动画大小更改替换子视图的主要内容,如果未能解决你的问题,请参考以下文章

用另一个视图替换选项卡

CATransition:视图替换动画:子视图的增删查改

用另一个视图替换视图

iOS - 子视图不使用帧更改进行动画处理

SwiftUI 动画如何与子视图隔离?

UIStackView,通过调整动画大小隐藏子视图