iPad - 没有用户互动在屏幕上查看动画
好吧,这是一个新手问题,所以我提前道歉。我有一个UIView,我在界面生成器中放置在屏幕外。当用户按下按钮时,我想在屏幕上为此视图制作动画。它的工作原理,但我不能与UIView中的任何按钮进行交互。我已经读过,当你设置动画时,只有视图被移动,并且实际的对象保留了它们的位置,所以我试图设置UIViews图层的位置,但是它导致我的UIView菜单在左边显示额外的81个像素。发生这种情况时,我可以与按钮交互,但我需要将它与屏幕右侧齐平。下面是我在IBAction为代码在openMenu按钮:iPad - 没有用户互动在屏幕上查看动画
CABasicAnimation *moveView = [CABasicAnimation animationWithKeyPath:@"position"];
moveView.delegate = self;
moveView.duration=0.5;
// If the menu is displayed, close it!
CGPoint currentPosView = [[entirePage layer] position];
CGPoint destView;
[moveView setFromValue:[NSValue valueWithCGPoint:currentPosView]];
if (menuDisplayed) {
// Move right to our destination
destView.x = currentPosView.x;
destView.y = currentPosView.y + 81;
[moveView setToValue:[NSValue valueWithCGPoint:destView]];
// Otherwise, open it
} else {
// Move left to our destination
destView.x = currentPosView.x;
destView.y = currentPosView.y - 81;
[moveView setToValue:[NSValue valueWithCGPoint:destView]];
}
// Animate the view
[[entirePage layer] addAnimation:moveView forKey:@"move"];
// Set the final position of our layer
[[entirePage layer] setPosition:destView];
menuDisplayed = !menuDisplayed;
然后在animationDidStop方法:
CGPoint currentPosMenu = [[menuBar layer] position];
if (menuDisplayed) {
currentPosMenu.x -= 81;
} else {
currentPosMenu.x += 81;
}
[[menuBar layer] setPosition:currentPosMenu];
帮助???
你应该不需要搞乱图层。通过在界面构建器中将视图放置到视图中动画后的位置,可以达到所需的效果。换句话说,首先把它们放在最终/正确的位置。在IB中不要做任何事情。
在您的代码中,在应用程序启动后或在使用UIViewController的-viewDidAppear:方法中,您可以将视图偏移一定量,然后将它们恢复到它们在动画块中的原始位置:
myView.transform = CGAffineTransformMakeTranslation(0,81);
[UIView beginAnimations:@"slideUp" context:nil];
myView.transform = CGAffineTransformIdentity;
[UIView commitAnimations];
至于缺乏对你的看法用户交互,这可能是一些事情。如果你的所有视图都是UIImageView的子视图,UIImageView默认情况下将userInteractionEnabled设置为NO(至少如果你在代码中创建一个 - 我不确定IB的默认设置是否适用于图像视图)。这也可能意味着你的观点的超级观点实际上太小,其框架不包含子视图。 (如果剪辑已开启了上海华,你甚至不能够看到那些有这方面的问题的子视图。)
编辑:
我更仔细地阅读的东西,看你想要的东西移动在按下按钮时,换句话说,视图需要从一开始就隐藏起来。在这种情况下,你仍然可以将所有东西都放在IB的最终位置上,但只要将它们设置为隐藏在IB中即可。当您按下按钮时,在翻译它们之前将视图设置为可见(隐藏=否)。这应该允许他们在IB的最终/正确位置进行布局,确保他们位于适当的超级视图等位置,同时仍然获得所需的动画效果。
暂时忘掉动画;您应该通过设置其frame
属性来移动您的视图。
例如为:
CGRect menuFrame = entirePage.frame;
if (menuDisplayed)
{
menuFrame.origin.x += 81;
}
else
{
menuFrame.origin.x -= 81;
}
entirePage.frame = menuFrame;
// Do your animation here, after the view has been moved
不要担心动画,直到您确认您的观点被放置在正确的位置。一旦你确认代码工作正常,然后在之后执行你的动画你设置了frame
属性。
请注意,您可能根本不需要使用CoreAnimation API,除非您正在做一些复杂的事情。 UIKit可以自己做动画。 E.g:
[UIView beginAnimations:@"MyAnimation" context:NULL];
myFirstView.frame = ...;
myOtherView.frame = ...;
[UIView commitAnimations];
我最近有类似的问题。在其父视图边界之外绘制的视图不能与之交互。核心动画只做动画也是正确的。它不会改变实际的属性。尝试试用userInteractionEnabled。如果这不起作用,那么一旦动画完成后,您可能会变脏并从其超级视图中移除视图,然后立即再次将其添加。 – 2010-12-08 22:05:13
该项目的截止日期临近,但我找到了一个解决方法(但它不是我想要的)。我最初显示UIView,然后将所有内容都滑出视图。当菜单被带回时,触摸交互工作,但必须有另一种方式。 – Jacob 2010-12-08 22:40:24