transitionWithView和animateWithDuration的问题
我有transitionWithView
和animateWithDuration
问题。 我的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似乎没有效果,因为productTitleLabel
和productDescriptionTextView
的文本突然变化,就好像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
,确保我有这些文本字段的容器。 但是我尝试使用animateWithDuration
animation化其他控件,同时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上,如果你想看看。