0

2 つのビュー コントローラーがあります。1 つはメイン メニュー、もう 1 つはゲームです。ゲームにはドロップするボックスがあり、ユーザーがそれをキャッチしないと、画面から落ちて上部の元の位置にリセットされます。

アプリはメイン メニューに読み込まれ、初めてプレイするときは完璧に動作します。何回でも問題なくプレイできます。ただし、メイン メニュー (モーダル セグエ) に戻ってからゲームに戻ると、アニメーションを再開しようとするとすぐに、「ボックスは参照ビューの子孫である必要があります」というエラーが表示されます。 UIDynamicAnimator」. この特定のセクションのコードを以下に示します。

何時間も検索しましたが、なぜこれが起こっているのかわかりません。ビュー コントローラを完全に更新して、最初と同じように動作させることはできますか? UIDynamicAnimator の referenceview パラメータを変更する必要がありますか? 私は途方に暮れています。誰か助けてください!!

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

(上記のコードは IBAction にあることに言及する必要がありますが、追加しようとしてもviewDidLoad役に立ちませんでした....)

また、私が得ている公式のエラーは

キャッチされていない例外 'NSInvalidArgumentException' が原因でアプリを終了しています。 UIDynamicAnimator の参照ビューの子孫である必要があります: UIView の 0x7ffb11da8120 (0.000000s): 0x7ffb11da84c0 {{0, 0}, {375, 667}}

「ボックス」の初期化に関係するすべてのコードは次のとおりです。

-(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 にタグを追加しようとしたところ、クラッシュしました。箱に何か入っているはずなのですが、さっぱりわかりません。

4

1 に答える 1