2012-06-12 5 views
0

내가 뭘 하려는지 타이머가 똑딱 때 레이블을 움직이는 것입니다. 창 기반 응용 프로그램이 있습니다.코어 애니메이션 및 NSTimer

  1. while 루프에서 코어 애니메이션을 시도했지만 프로그램이 멈췄습니다.
  2. 타이머 (NSTimer)에 의해 트리거 된 핵심 애니메이션을 시도했지만 아무 일도 발생하지 않습니다.

문제점 : 프로그램을 디버깅했는데 모든 것이 잘 보였지만 모든 명령문이 실행 중이지만 아무 일도 발생하지 않았습니다. 루프의 코어 애니메이션이나 타이머에 의해 트리거 된 애니메이션이 허용되지 않는다고 생각했습니다. 다른 방법이 있습니까?

무엇 내가 가진 것은 :

drawingTimer = [NSTimer scheduledTimeWithTimeInterval:60.0 target:self 
       selector:@selector(slideWords) userInfo:nil repeats:NO]; 

-void (slideWords){ 
randomNumber = 1 + arc4Random()%2; 

if(randomNumber = 1){ 
    Redlabel.alpha = 1.0; 
    RedLabel.frame = CGRectMake(0, -50, 320, 100); 
    [UIWindow animateWithDuration:5.0 animations:^{ 
     Redlabel.alpha = 1.0; 
     Redlabel.frame = CGRectMake(0,300,320,100); 
    }completion:^(BOOL finished){ 
     [UIWindow animateWithDuration:0.5 delay:0.5 options:0 animations:^{ 
      Redlabel.alpha = 0.0; 
     }completion:^(BOOL finished){ 
     }]; 
    }]; 
} 

if(randomNumber = 2){ 
    GreenLabel.alpha = 1.0; 
    GreenLabel.frame = CGRectMake(0, -50, 320, 100); 
    [UIWindow animateWithDuration:5.0 animations:^{ 
     GreenLabel.alpha = 1.0; 
     GreenLabel.frame = CGRectMake(0,300,320,100); 
    }completion:^(BOOL finished){ 
     [UIWindow animateWithDuration:0.5 delay:0.5 options:0 animations:^{ 
      GreenLabel.alpha = 0.0; 
     }completion:^(BOOL finished){ 
     }]; 
    }]; 
} 

}

+0

모든 것을 읽지는 않았지만 조건은 과제를 수행하는 중입니다. 둘 다 true로 평가되고 randomNumber를 변경합니다. 또한 알파 레벨은 1로 지정되고 애니메이션은 1로 설정됩니다 (작업 없음). – danh

+0

난 그냥 RedLabel.alpha에 줄을 적어 라 ..... 나머지; 프로그램이 잘 작동합니다. 문제는 NSTimer에 의해 또는 루프에서 트리거되어야합니다. 그래서 대안을 찾고 있습니다. –

+0

또한 두 레이블의 프레임을 동일한 rect로 설정 한 다음 동일한 rect로 애니메이션을 적용합니다. 하나는 항상 숨겨져 있습니다. 처음부터 다시 시작하고 근본적으로 단순화해야한다고 생각합니다. 루프가 없거나 타이머가없고 무작위가 아닙니다. 그냥 한 레이블을 페이드하고 이동하는 방법 (어쩌면 임시 단추를 추가하여 트리거)을 가져 오십시오. 그런 다음 두 번째 레이블을 작성하십시오. 그런 다음 원하는 두 가지 임의의 경우를 하드 코드 한 다음 임의성을 추가하십시오. 너 거기 갈거야! – danh

답변

1

DANH 그의 의견에 말했듯이, 당신의 모두 진술

if (randomNumber == value) 

하나의 동등해야하는 경우가있다되지 비교 연산자 그것은 대입 연산자입니다. 컴파일러가 그에 대한 경고를 주어야합니다.

두 번째로 animateWithDuration은 UIWindow 메서드가 아닌 UIView 메서드입니다. 나는 UIWindow UIView에서 상속 때문에 컴파일러를 추측하지만 그 방법을 구현하지 않는 하위 클래스 메시지를 클래스 메시지를 보내는 것은 나쁜 생각이다.

귀하의 애니메이션 방법은

[UIView animateWithDuration: x... 

셋째

, 코어 애니메이션이 잘 작동해야 타이머 트리거 읽어야합니다. 그러나 타이머가 반복되지 않으므로 왜 타이머를 사용해야합니까? 지체 된 애니메이션 메서드의 형태를 사용하고 코드를보다 깨끗하게 만듭니다. 그런 다음 타이머 또는 별도의 "slideWords"메소드가 필요하지 않습니다. 코드는 다음과 같을 수 있습니다.

randomNumber = 1 + arc4Random()%2; 

if(randomNumber = 1){ 
    Redlabel.alpha = 1.0; 
    RedLabel.frame = CGRectMake(0, -50, 320, 100); 
    [UIWindow animateWithDuration:5.0 
     delay: 60.0 
     options: 0 
     animations:^{ 
     Redlabel.alpha = 1.0; 
     Redlabel.frame = CGRectMake(0,300,320,100); 
    }completion:^(BOOL finished){ 
     [UIWindow animateWithDuration:0.5 delay:0.5 options:0 animations:^{ 
      Redlabel.alpha = 0.0; 
     }completion:^(BOOL finished){ 
     }]; 
    }]; 
} 

if(randomNumber = 2){ 
    GreenLabel.alpha = 1.0; 
    GreenLabel.frame = CGRectMake(0, -50, 320, 100); 
    [UIWindow animateWithDuration:5.0 
     delay: 60.0 
     options: 0 
     animations:^{ 
     GreenLabel.alpha = 1.0; 
     GreenLabel.frame = CGRectMake(0,300,320,100); 
    }completion:^(BOOL finished){ 
     [UIWindow animateWithDuration:0.5 delay:0.5 options:0 animations:^{ 
      GreenLabel.alpha = 0.0; 
     }completion:^(BOOL finished){ 
     }]; 
    }]; 
} 

넷째 : 따라야 할 코코아의 강력한 명명 규칙이 있습니다. 메소드 이름과 변수 이름은 소문자로 시작해야하며 이름 내의 각 단어는 대문자이어야합니다. 클래스 이름 만 대문자로 작성해야합니다. (... 그들은 C 기능이있어, 애플의 핵심 재단의 기능을 다른 명명 규칙을 따라야하지만, 사람들은 방법이없는)

그래서 "RedLabel"는 "redLabel"와 "GreenLabel" "greenLabel"해야

해야한다
+0

이번에는 UIView에 문제가 있습니다. [창 setHidden : 예]; [newGameView setHidden : NO]; 나는 모두 빈 스크린이다.나는 객관적으로 코딩이 부족하다는 것을 알고있다. 어쨌든 고맙습니다. –

+0

나는 창을 숨김으로 설정해야한다고 생각하지 않는다 : 예. 그것은 모든 것을 숨기고 검은 화면을 보여줍니다. iOS에서는 전체 화면을 담당하는 창이 있으며 현재보기 컨트롤러의 콘텐츠보기를 호스팅합니다. –