iPad - 屏幕上的动画视图无用户互动

时间:2010-12-08 19:32:15

标签: iphone objective-c ipad animation off-screen

好吧这是一个新手问题,所以我提前道歉。我有一个UIView,我在界面生成器屏幕外布局。当用户按下按钮时,我想在屏幕上为该视图设置动画。它有效,但我无法与UIView中的任何按钮进行交互。我已经读过,当你动画时只移动视图并且实际对象保持它们的位置,所以我尝试设置UIViews的图层的位置,但是它导致我的UIView菜单在左边显示额外的81个像素。当发生这种情况时,我可以与按钮进行交互,但我需要它与屏幕右侧齐平。这是我在openMenu按钮上的IBAction中的代码:

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

帮助???

2 个答案:

答案 0 :(得分:0)

你不应该弄乱图层。您可以通过在Interface Builder中将视图设置为视图中的位置后,将它们放置在视图中,从而实现所需的效果。换句话说,首先要把它们放在最终/正确的位置。在IB中不要做任何时髦的事情。

在您的代码中,启动应用程序后或在-viewDidAppear:方法中,如果您使用的是UIViewController,您可以将视图偏移一定量,然后将它们恢复到动画块中的原始位置:

myView.transform = CGAffineTransformMakeTranslation(0,81);

[UIView beginAnimations:@"slideUp" context:nil];
myView.transform = CGAffineTransformIdentity;
[UIView commitAnimations];

至于您的观点缺乏用户互动,这可能是很多事情。如果您的所有视图都是类似UIImageView的子视图,UIImageView默认情况下将userInteractionEnabled设置为NO(至少如果您在代码中构建一个 - 我不确定IB的默认设置是什么用于图像视图)。这也可能意味着您的视图的超级视图实际上太小,其框架不包含子视图。 (如果为超级视图打开剪辑,您甚至无法查看出现此特定问题的子视图。)

编辑:

我仔细阅读了一些内容,并且看到你想要按下按钮来移动内容,换句话说,视图需要从头开始隐藏。在这种情况下,你仍然可以在IB的最终位置放置所有内容,但只是将它们设置为隐藏在IB中。按下按钮时,在翻译之前将视图设置为可见(隐藏= NO)。这应该允许它们布置在IB的最终/正确位置,确保它们位于正确的超视图等,同时仍然获得您想要的动画效果。

答案 1 :(得分:0)

暂时忘掉动画;您应该通过设置其frame属性来移动视图。

E.g:

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