好吧这是一个新手问题,所以我提前道歉。我有一个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];
帮助???
答案 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];