web-dev-qa-db-ja.com

CALayerInvalidGeometry '、理由:' CALayerの境界にNaNが含まれています:[0 0; nan nan]ビューのクラッシュ

私はこれについて詳しく調べましたが、この問題に関連するwebViewとテーブルしか取得できないようです。鉱山はまったく異なりますが、同じクラッシュ例外があります。

CALayerInvalidGeometry '、理由:' CALayerの境界にNaNが含まれています:[0 0;ナンナン]

基本的にここにあるのは、画像をフェードおよびスケールするビューです。最近、タイマーが刻むたびにノッチを拡大するのではなく、UIViewアニメーションでCGAffineTransformScaleを使用してコードを変更することにしました。これにより、処理能力が大幅に低下します。

しかし、どのような順序で写真を並べても、19回目以降は常にクラッシュします。それが参照する位置決め座標配列には問題がないようです。これは、長さが6であり、長さに達した後にループするためです。なぜかこのアニメーションコードを実装したので、何らかの理由でクラッシュします。誰もが理由を知っていますか?

クラッシュし始めてから変更した部分は次のとおりです。

-(void) onTimer{

if(scaleTimer_A==5){

    imageView_A.image = [UIImage imageNamed:[attractList_A objectAtIndex:imageIndex_A]];

    imageView_A.frame = CGRectMake(300, 200, 3.86, 3.86);

    imageView_A.center = CGPointMake(attractLocs_x_A[attractLocs_A_index], attractLocs_y_A[attractLocs_A_index]);



    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:2];
    imageView_A.alpha = 1;
    imageView_A.transform = CGAffineTransformScale(imageView_A.transform, 100, 100);
    [UIView commitAnimations]; 
}

if(scaleTimer_A==10){

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:.75];
    imageView_A.alpha = 0;
    imageView_A.transform = CGAffineTransformScale(imageView_A.transform, 1.2, 1.2);
    [UIView commitAnimations]; 

    scaleTimer_A=0;

    imageIndex_A+=1;

    if(imageIndex_A==imageIndex_A_size){
        imageIndex_A=0;
    }

    attractLocs_A_index+=1;

    if(attractLocs_A_index==attractLocs_A_SIZE){
        NSLog(@"Back to zero A");
        attractLocs_A_index=0;
    }
    NSLog(@"Image A =%@", [attractList_A objectAtIndex:imageIndex_A]);
}

scaleTimer_A+=1;}

[〜#〜]編集[〜#〜]

CGAffineTransformIdentityを使用してクラッシュする問題なしに上記のコードを機能させる方法を次に示します。

-(void) onTimer{

if(scaleTimer_A==5){

    imageView_A.image = [UIImage imageNamed:[attractList_A objectAtIndex:imageIndex_A]];

    imageView_A.transform = CGAffineTransformIdentity;

    imageView_A.center = CGPointMake(attractLocs_x_A[attractLocs_A_index], attractLocs_y_A[attractLocs_A_index]);



    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:2];
    imageView_A.alpha = 1;
    imageView_A.transform = CGAffineTransformScale(CGAffineTransformIdentity, 100, 100);
    [UIView commitAnimations]; 
}

if(scaleTimer_A==10){

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:.75];
    imageView_A.alpha = 0;
    imageView_A.transform = CGAffineTransformScale(CGAffineTransformIdentity, 120, 120);
    [UIView commitAnimations]; 

    scaleTimer_A=0;

    imageIndex_A+=1;

    if(imageIndex_A==imageIndex_A_size){
        imageIndex_A=0;
    }

    attractLocs_A_index+=1;

    if(attractLocs_A_index==attractLocs_A_SIZE){
        NSLog(@"Back to zero A");
        attractLocs_A_index=0;
    }
    NSLog(@"Image A =%@", [attractList_A objectAtIndex:imageIndex_A]);
}

scaleTimer_A+=1;}
22

スタックトレースによると、問題はここにあります

imageView_A.frame = CGRectMake(300, 200, 3.86, 3.86);

ImageView_A.transformをidentityに設定してみてください。別の解決策(そして私はより良いと思います)は、スケーリングにUIScrollViewを使用することです(アニメーション化することもできます)。

編集:これを試してください

    imageView_A.image = [UIImage imageNamed:[attractList_A objectAtIndex:imageIndex_A]];

    imageView_A.frame = CGRectMake(300, 200, 3.86, 3.86);

    imageView_A.center = CGPointMake(attractLocs_x_A[attractLocs_A_index], attractLocs_y_A[attractLocs_A_index]);



    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:2];
    imageView_A.alpha = 1;
    imageView_A.frame = CGRectMake(300, 200, 386.0f, 386.0f);
    [UIView commitAnimations]; 
10
Max