0

好吧,这是一个新手问题,所以我提前道歉。我有一个 UIView,我在屏幕外的 Interface Builder 中布置了它。当用户按下按钮时,我想在屏幕上为这个视图设置动画。它可以工作,但我无法与 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]; 

帮助???

4

2 回答 2

0

暂时忘掉动画吧;你应该通过设置它的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 可以自己做动画。例如:

[UIView beginAnimations:@"MyAnimation" context:NULL];
myFirstView.frame = ...;
myOtherView.frame = ...;
[UIView commitAnimations];
于 2010-12-09T04:56:13.147 回答
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 中。当您按下按钮时,在翻译它们之前将视图设置为可见(隐藏=否)。这应该允许它们在 IB 中放置在它们的最终/正确位置,确保它们位于正确的超级视图等上,同时仍然获得你想要的动画效果。

于 2010-12-09T04:35:29.220 回答