transitionWithView和animateWithDuration的问题

我有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 }]; 

这是在我的容器视图控制器之一。 animation似乎没有效果,因为productTitleLabelproductDescriptionTextView的文本突然变化,就好像animation块不存在一样。

 - (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"]]; } } } 

我认为这些问题有些相关,因为我的大部分animation和转换块并不像预期的那样完全工作。 谢谢你的帮助。

编辑

我试图完成的是在ViewController移动容器视图,并设置标签,文本视图和图像视图的文本和图像属性; 所有这些都是主要观点。 这些属性的细节通过子视图控制器发送。 transitionWithView位于一个名为toggleFlavoredOiveOilsTableView的方法中,该方法在didSelectRowAtIndexPath调用。 我认为问题在于我试图同时调用两个不同的animation/转换块。

如果一个animation是在另一个正在进行animation的视图的子视图上完成的,则可以体验这两个animation相互干扰的行为。 因此,如果你执行transitionWithView:self.view (即在主视图)像你的代码片段build议,你可以有问题。 如果您在不同的子视图上执行这两个animation,问题可能会消失。 我在下面的原始答案中,我:

  • 在具有两个UILabel控件的子视图上执行transitionWithView ;

  • 把我的视图控制器包含子视图在主视图的子视图,然后transitionFromViewController被约束到该子视图。

当我把两个animation部分放在不同的子视图上时,animation可以同时发生而不会发生。


如果您想animation更改两个文本标签的内容,您可以:

 [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 ,但文本属性不是一个animation的属性,所以这就是为什么我使用transitionWithView ,确保我有这些文本字段的容器。 但是我尝试使用animateWithDurationanimation化其他控件,同时animation更改子控制器,并且工作正常。

为了转换子视图控制器,我使用transitionFromViewController来animation交换容器子控制器的视图(这是“自定义容器 ”方法中的“ pipe理子视图控制器”的一部分)。 为了促进这个过程,我在我的主视图控制器的视图上放置了一个容器视图,并将该子控制器的视图添加为该容器的子视图。 这样,当我animation孩子的过渡时,animation很好地被限制到那个容器视图。

所以,下面是一些示例代码添加一个视图控制器到我的容器视图,然后我使用的代码之间转换两个子视图控制器使用分段button:

 - (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]; }]; } 

底线,我没有问题animation两个容器子控制器和父控制器中的字段。 也许我不了解你所描述的问题。 或者,对于我们如何进行animation制作的差异,可能有些微妙之处。 如果你想,我已经把上面的代码放在github上,如果你想看看。