与transitionWithView和animateWithDuration问题(Problems

2019-07-05 08:39发布

我有一个问题transitionWithViewanimateWithDuration 。 我的一个的animateWithDuration块不过渡,这是一个突然的变化, transitionWithView不会暂时禁用用户交互。 我检查了文档,并认为我正确地做的一切,但很明显,什么是错的。 下面是代码的两大块:

这是我的主视图控制器ViewController其中有三个集装箱的意见/子视图控制器。 此块移动的容器视图之一,但不阻止来自其他交互用户在ViewController而过渡正在发生。

[UIView transitionWithView:self.view duration:0.5 options:UIViewAnimationOptionCurveEaseOut animations:^ {
        CGRect frame = _containerView.frame;
        frame.origin.y = self.view.frame.size.height - _containerView.frame.size.height;
        _containerView.frame = frame;
}completion:^(BOOL finished) {
     // do something   
}];

这是我的容器视图控制器之一。 动画似乎没有任何效果的文本productTitleLabelproductDescriptionTextView突然改变,仿佛动画块不存在。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{    
    [self.viewController toggleFlavoredOliveOilsTableView];

    if (indexPath.row > 0) {
        NSDictionary *selectedCellDict = [[_flavoredOliveOilsDict objectForKey:@"Unflavored Olive Oils"] objectAtIndex:indexPath.row - 1];

        [UIView animateWithDuration:0.5 delay:0 options:UIViewAnimationOptionTransitionCrossDissolve animations:^ {
            self.viewController.productTitleLabel.text = [_flavoredOliveOilsTableView cellForRowAtIndexPath:indexPath].textLabel.text;
            self.viewController.productDescriptionTextView.text = [selectedCellDict objectForKey:@"Description"];
        }completion:nil];

        if (indexPath.row == 1) {
            [self.viewController setProductDescriptionTextViewFrameForInformationTab];
        }
        else {
            [self.viewController setProductDescriptionTextViewFrameForNonInformationTab];

            //self.viewController.productImageView.image = [UIImage imageNamed:[selectedCellDict objectForKey:@"Image"]];
        }
    }
}

我想,我的大部分动画和过渡块的预期不完全的工作问题有点关系。 谢谢你的帮助。

编辑

我试图完成正朝着容器视图ViewController ,并设置标签,文本视图和图像视图的文本和图像性能; 所有这些都是在主视图。 这些特性的细节通过子视图控制器发送。 该transitionWithView是在称为方法toggleFlavoredOiveOilsTableView被称为在didSelectRowAtIndexPath 。 我认为这个问题是我试图在同一时间打电话给两个不同的动画/转换块。

Answer 1:

如果一个动画在另一个观点经受动画子视图做,你可以体验到两个动画互相干扰的这种行为。 因此,如果执行transitionWithView:self.view喜欢你的代码片段显示(即主视图),你可以有问题。 如果您执行不同的子视图的两个动画,这个问题可能会消失。 在我原来的答复如下,我:

  • 执行transitionWithView上有两个子视图UILabel控制;

  • 把我的视图控制器遏制子视图主视图的子视图中,然后transitionFromViewController被限制到该子视图。

当我把两部动画部分在不同的子视图,动画可以同时发生无事。


如果你想动画的两个文本标签内容的变化,您可以:

[UIView transitionWithView:self.viewController.textLabelsContainerView
                  duration:0.5
                   options:UIViewAnimationOptionTransitionCrossDissolve
                animations:^{
                    self.viewController.productTitleLabel.text = [_flavoredOliveOilsTableView cellForRowAtIndexPath:indexPath].textLabel.text;
                    self.viewController.productDescriptionTextView.text = [selectedCellDict objectForKey:@"Description"];
                }
                completion:nil];

一般来说,我会使用animateWithDuration ,但文本属性不是动画的属性,所以这就是为什么我用transitionWithView ,确保我对那些文本字段的容器。 但是我试着用动画其他控件animateWithDuration ,同时动画的孩子控制器的变化,并能正常工作。

对于过渡子视图控制器,我用transitionFromViewController动画的容器子控制器的意见的交换(它的一部分在自定义容器管理子视图控制器家族的方法)。 为了促进这一进程,我把我的主视图控制器的视图容器视图,并添加子控制器的意见作为容器的子视图。 这样,当我动画孩子的过渡,动画是很好的限制到容器视图。

所以,这里是一些示例代码到一个视图控制器添加到我的容器视图,然后将代码,我用它来使用分段按钮两个子视图控制器之间的过渡:

- (void)addFirstChild
{
    UIViewController *child = [self.storyboard instantiateViewControllerWithIdentifier:@"Stooge"];
    [self addChildViewController:child];

    child.view.frame = self.bottomContainerView.bounds;
    [self.bottomContainerView addSubview:child.view];

    [child didMoveToParentViewController:self];
}

- (void)changedChild
{
    UIViewController *oldController = [self.childViewControllers lastObject];
    UIViewController *newController;

    if (self.segmentedControl.selectedSegmentIndex == 0)
        newController = [self.storyboard instantiateViewControllerWithIdentifier:@"Stooge"];
    else
        newController = [self.storyboard instantiateViewControllerWithIdentifier:@"Marx"];

    [oldController willMoveToParentViewController:nil];
    [self addChildViewController:newController];

    // start off screen below

    CGRect startFrame = self.bottomContainerView.bounds;
    startFrame.origin.y += startFrame.size.height;

    // end up where it's supposed to be, right in the container

    newController.view.frame = startFrame;

    [self transitionFromViewController:oldController
                      toViewController:newController
                              duration:0.5
                               options:0
                            animations:^{
                                newController.view.frame = self.bottomContainerView.bounds;
                            }
                            completion:^(BOOL finished) {
                                [oldController removeFromParentViewController];
                                [newController didMoveToParentViewController:self];
                            }];

}

底线,我没有问题,既动画容器子控制器和家长控制等领域。 也许我不理解您所描述的问题。 或者,也许有一些微妙的关于我们如何动画的差异。 如果你想,我已经把这个上面的代码 ,如果你想看看在GitHub上。



文章来源: Problems with transitionWithView and animateWithDuration