我有一个问题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
}];
这是我的容器视图控制器之一。 动画似乎没有任何效果的文本productTitleLabel
和productDescriptionTextView
突然改变,仿佛动画块不存在。
- (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
。 我认为这个问题是我试图在同一时间打电话给两个不同的动画/转换块。
如果一个动画在另一个观点经受动画子视图做,你可以体验到两个动画互相干扰的这种行为。 因此,如果执行transitionWithView:self.view
喜欢你的代码片段显示(即主视图),你可以有问题。 如果您执行不同的子视图的两个动画,这个问题可能会消失。 在我原来的答复如下,我:
当我把两部动画部分在不同的子视图,动画可以同时发生无事。
如果你想动画的两个文本标签内容的变化,您可以:
[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上。