从主菜单返回后,UIDynamicAnimator会导致错误

时间:2015-01-26 20:37:46

标签: ios objective-c xcode uikit-dynamics uidynamicanimator

我有两个视图控制器 - 一个是主菜单,另一个是游戏。游戏中有一个下降的盒子,如果用户没有抓住它,它会从屏幕上掉下来并重置在顶部的原始位置。

应用程序加载到主菜单上,第一次去玩,它完美地运行。我可以毫无问题地打出尽可能多的回合。但是,如果我返回主菜单(模态segue)然后返回游戏,一旦我再次尝试启动动画,它就会给我一个错误,说明该框"应该是一个后代UIDynamicAnimator中的参考视图"。我已在下面列出了此特定部分的代码。

我已经搜索了几个小时,无法弄清楚为什么会这样。我可以完全刷新视图控制器,使其工作方式与第一次相同吗?我应该在UIDynamicAnimator中更改我的referenceview参数吗?我不知所措。有人请帮忙!!

_animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];
_gravity = [[UIGravityBehavior alloc] initWithItems:@[box]];
[_animator addBehavior:_gravity];

(我应该提到上面的代码是在IBAction中,但我也尝试在viewDidLoad中添加它并且它没有帮助......)

此外,我收到的官方错误是

  

由于未捕获的异常而终止应用   ' NSInvalidArgumentException',原因:   '查看项目(UIImageView:   0x7ffb11d9efd0; frame =(75 40; 70 70); hidden = YES; autoresize =   RM + BM; userInteractionEnabled = NO; layer = CALayer:0x7ffb11d9faa0)   应该是参考视图的后代   UIDynamicAnimator:0x7ffb11da8120(0.000000s)in   UIView:0x7ffb11da84c0 {{0,0},{375,   667}}

以下是与初始化" box":

有关的所有代码
-(void)viewDidLoad {
box = [[UIView alloc] initWithFrame:CGRectMake(75, 40, 70, 70)];
box.backgroundColor = [UIColor blackColor];
}
-(IBAction)rebounce:(id)sender{
    [self.view addSubview:box];
    box.frame = CGRectMake(75, 40, 70, 70);
    box.hidden = NO;
    _animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view ];
    _gravity = [[UIGravityBehavior alloc] initWithItems:@[box]];
    [_animator addBehavior:_gravity];
    [self newBarrierCollision];
    _collision = [[UICollisionBehavior alloc] initWithItems:@[box]];
    _collision.collisionDelegate = self;
    _collision.action =  ^{
    NSLog(@"%@, %@",
          NSStringFromCGAffineTransform(box.transform),
          NSStringFromCGPoint(box.center));
    };
    UIDynamicItemBehavior* itemBehaviour = [[UIDynamicItemBehavior alloc]            initWithItems:@[box]];
    itemBehaviour.elasticity = 0.6;
    [_animator addBehavior:itemBehaviour];
    timer = [NSTimer scheduledTimerWithTimeInterval:.01 target:self selector:@selector(CheckIfOffscreen) userInfo:nil repeats:YES];
}    
-(void)CheckIfOffscreen{
    if(box.center.y > SH){
    [timer invalidate];
    [_animator removeAllBehaviors];
    box.frame = CGRectMake(75, 40, 70, 70);
}

基本上,盒子掉落,向下旋转,如果它从屏幕上掉下来,动画就会停止,盒子会在它顶部的原始位置被替换,直到用户再次按下按钮。

*****编辑:我有更多可能有用的信息。当我玩游戏时,返回主菜单,然后再次返回,以编程方式对该框执行任何操作会导致应用程序崩溃。我尝试在ViewDidLoad中添加一个标记,这导致它崩溃。它必须与盒子有关,但我无法弄清楚是什么。

1 个答案:

答案 0 :(得分:0)

从错误消息中,我可以推断出这一行会导致问题:

_gravity = [[UIGravityBehavior alloc] initWithItems:@[box]];

您在UIDynamicBehavior子类中使用的每个项目都必须是参考视图的子视图,您在初始化UIDynamicAnimator时将其作为参数传递:

_animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];

因此,box必须是self.view的子视图,但是当您返回游戏控制器时则不是。{{1}}。