我试图使用CATransition
从一侧进行推动画。我在处理两个UIViews
的方法中执行此操作,一个用于背景,另一个用于前景。动画UIView
是前景。但我不希望新内容替换旧内容,因此要将所有旧内容从前景移到后台UIView
预计它只会从一侧对UIView
的推送过渡进行动画制作,但取而代之的是旧的UIView
。有没有办法做我想做的事情,比如锁定UIViews
从前景和背景UIViews
拥有正确内容的那一刻起的状态?从当前状态为UIView创建CATransition
我的代码是这样的:
UIView *newView = argView; // argView is the view passed as a parameter to the method
// move views from foreground to background
for (UIView *v in [fgView subviews]) {
[v removeFromSuperview];
[bgView addSubview:v];
}
// Slide animation
CATransition *transition = [CATransition animation];
transition.duration = 0.5;
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
transition.type = kCATransitionPush;
transition.subtype = kCATransitionFromLeft;
[fgView.layer addAnimation:transition forKey:nil];
[fgView addSubview:newView];
[编辑]我一直在做一些研究。显然(或者我认为可能发生的事情)是背景的UIViews删除采用隐式动画。有没有办法阻止它从动画?
[编辑]答:是的,这是可以做到(禁用隐动画),它是用下面的代码
[CATransaction begin];
[CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions];
for (UIView *v in [fgView subviews]) {
[v removeFromSuperview];
[bgView addSubview:v];
}
[CATransaction commit];
做的这是我做的,它应该工作(根据苹果的开发者门户),但事实并非如此,所以问题仍然存在。
[编辑]大量的测试和阅读的我发现这个问题是在这之后,当我从它的父删除视图的转换或动画不承认这种变化,直到后来,所以响应过时的最新变化。有没有办法强制更新或检查removeFromSuperview
或addSubview
何时完成?
[编辑]我需要的究竟是这样的: 1)UIViews的当前状态为:bgView与阴影的UIView或midView(这种观点不应该被动画)背后旧观点。从不动画的midView。带有当前UIView的fgView。 2)我想将fgView的内容移动到bgView(它不会动画化),并为添加到fgView的新UIView(使用幻灯片,淡入/淡出或翻转动画)的外观设置动画效果。
好像什么,我想在这里做的是无法实现的。嗯......谁会说? – jglievano
你有没有尝试 - [UIView setNeedsDisplay]强制更新你的removeFromSuperview/addSubview调用? – Sam
不幸的是,我不清楚你到底在做什么。是否在两个不同的视图中使用相同的UI元素? UIView只能是一个UIView的子项。另外,为什么你需要为此使用CATransition?使用UIView类方法来转换视图通常更容易。 – Sam