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