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]; 

帮助???

+0

我最近有类似的问题。在其父视图边界之外绘制的视图不能与之交互。核心动画只做动画也是正确的。它不会改变实际的属性。尝试试用userInteractionEnabled。如果这不起作用,那么一旦动画完成后,您可能会变脏并从其超级视图中移除视图,然后立即再次将其添加。 – 2010-12-08 22:05:13

+0

该项目的截止日期临近,但我找到了一个解决方法(但它不是我想要的)。我最初显示UIView,然后将所有内容都滑出视图。当菜单被带回时,触摸交互工作,但必须有另一种方式。 – Jacob 2010-12-08 22:40:24

你应该不需要搞乱图层。通过在界面构建器中将视图放置到视图中动画后的位置,可以达到所需的效果。换句话说,首先把它们放在最终/正确的位置。在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];