CALayerInvalidGeometry ', причина:' CALayer границ содержит NaN: [0 0;nan nan] крушение в поле зрения - PullRequest
21 голосов
/ 02 февраля 2011

Я много в этом разбирался, но я могу только получить webView и таблицы, относящиеся к этой проблеме. Мой совершенно другой, похоже, с тем же исключением аварии:

CALayerInvalidGeometry ', причина:' CALayer границ содержит NaN: [0 0; nan nan]

По сути, у меня есть представление, которое выцветает и масштабирует изображения. Недавно я решил изменить свой код, используя CGAffineTransformScale в анимации UIView, вместо того, чтобы увеличивать масштаб каждый раз, когда срабатывает таймер. Это использует намного меньше вычислительной мощности.

Но независимо от того, в каком порядке у меня есть фотографии, они всегда вылетают после 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;}

EDIT

Вот как я получил приведенный выше код для работы без проблем сбоев при использовании 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;}

1 Ответ

10 голосов
/ 02 февраля 2011

Согласно трассировке стека проблема здесь

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

Попробуйте установить для imageView_A.transform идентификатора.Другое решение (и я думаю, что лучше) будет использовать 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]; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...