iphone - UIView 动画交互不良

标签 iphone animation uiview

我发现单独的动画之间似乎存在交互,并且我非常感谢任何消除这种效果的建议。

基本上: 我有一个 iPhone 应用程序,其中 Root View 上有一个按钮“a”。点击“a”将 View 推送到导航 View Controller 堆栈上,并带有翻转动画。推送的 View 有一个按钮可以将 View 弹出回根目录。

底层代码:

- (IBAction)pushOneView{
TheAppDelegate *delegate = [[UIApplication sharedApplication] delegate];
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.5];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
[UIView setAnimationTransition: UIViewAnimationTransitionFlipFromRight 
                    forView:delegate.navigationController.view cache:NO];
[delegate.navigationController 
            pushViewController:oneViewController animated:NO];
[UIView commitAnimations];

}

这似乎工作正常,并且动画非常流畅。

Root View 还包括一个 subview (“panelView”)和另一个按钮“b”。 panelView 可以显示其他两个 subview 中的任何一个 - 点击这些 subview 之间的“b”交换,并带有旋转动画。代码:

-(IBAction)swapPanels{
UIViewController *coming;
UIViewController *going;
float rotation;

if (self.aPanel.view.superview == nil) {
    coming = aPanel;
    going = bPanel;
    rotation = 3.14;
}
else {
    coming = bPanel;
    going = aPanel;
    rotation = -3.14;
}

// First half of spin
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.25];
CGAffineTransform swirlTransform = CGAffineTransformMakeRotation(rotation);
panelView.transform = swirlTransform;
[panelView setAlpha:0.1];
[UIView commitAnimations];

// Finish spin
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.25];
CGAffineTransform secondTransform = 
                        CGAffineTransformRotate(swirlTransform, rotation);
panelView.transform = secondTransform;
[panelView setAlpha:1];
[UIView commitAnimations];

// Swap the panels
[going.view removeFromSuperview];
[panelView insertSubview:coming.view atIndex:0];

}

这似乎也工作得很好。每个可交换面板都包含一个选择器和一些标签。

但是,我注意到如果“b”转换在它之前执行,“a”转换就会变得缓慢且不稳定。 换句话说,如果我启动应用程序,来回运行“a”几次,它就会顺利运行。然后来回练习“b”几次。然后再次尝试“a”...“a”现在很不稳定,并且将一直保持这种状态,直到应用程序重新启动。

这是 100% 可重复的。使用模拟器时这很微妙,但在设备上却非常明显。 我已经测试了泄漏——泄漏工具没有显示任何泄漏。 如果从“b”操作中删除动画(只需注释掉动画步骤),则在执行“b” subview 交换后,不会观察到对“a”的影响。 如果将拾取器从可交换面板 Nib 上移除,则同样会消除该影响。 如果'a'动画过渡设置为缓存,那么在'b'之后它不会在中间卡顿,但似乎忽略动画,只是交换 View (这可能是一个感知问题)。

如果我不清楚:我不会同时触发这些单独的操作。在“b”执行并完成之后,动画“a”与“b”从未执行过不同。动画结束后我应该做清理工作吗?我的 subview 交换代码有缺陷吗?或者...?

预先感谢您的任何建议。

最佳答案

您的“b”部分确实有两个重叠的动画。当您使用开始/提交 block 创建动画时,它会被移交给后台线程来执行。在“b”部分中,两个应该连续的动画实际上几乎同时触发。这可能会导致奇怪的行为,可能就像您所看到的那样。

我建议使用如下代码在您的第一个动画中将回调添加到委托(delegate)方法:

[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(rotationAnimationFinished:finished:context:)];

在“b”中的第一个动画 block 内(“旋转的前半部分”)。然后您需要在类中定义回调方法,在本例中

- (void)rotationAnimationFinished:(NSString *)animationID finished:(BOOL)finished context:(void *)context;

在旋转动画的第一部分完成时将调用的委托(delegate)方法中,放置“b”方法中的剩余代码(“完成旋转”注释之后的所有代码)。

通过分离这些动画,可能会防止您看到奇怪的情况。

关于iphone - UIView 动画交互不良,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/842309/

相关文章:

iphone - CFAttributedStringRef 中的内存泄漏

javascript - 如何在网站中制作这样的动画组件?

css - 具有嵌入式 CSS 动画的 SVG 在 iOS 10 和 iOS 11 之间表现不同

ios - 仅将圆角半径设置为 UIView/UIButton 的特定一侧

ios - 渐变不填充 IBDesignable UIView

iphone - 如何获取提取时区( (GMT+05 :30) from systemTimeZone(NSTimeZone)

iphone - 当 UIScrollView 滚动时,我的自定义 UI 元素不会更新

iphone - UICollectionView 动画(插入/删除项目)

javascript - 如何禁用 Sencha Touch 2 页面转换动画?

iphone - 检查 subview 中的点是否在父 View 中