2009-03-29 5 views
2

내 iPhone 앱에 대해 아주 간단한 선 그리기 애니메이션을 구현하려고합니다. 지연 후 내보기에 직사각형을 그려야합니다. 내 드로잉 메서드를 실행하려면 performSelector을 사용하고 있습니다. 다음을 통해 호출지연된 그림을 통한 간단한 애니메이션

-(void) drawRowAndColumn: (id) rowAndColumn 
{ 
    int rc = [rowAndColumn intValue]; 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextSetLineWidth(context, 2.0); 
    CGContextSetStrokeColorWithColor(context, currentColor.CGColor); 
    CGRect rect = CGRectMake(rc * 100, 100, 100, 100); 
    CGContextAddRect(context, rect); 
    CGContextDrawPath(context, kCGPathFillStroke); 

} 

:

int col = 10; 
[self performSelector:@selector(drawRowAndColumn:) 
      withObject:[NSNumber numberWithInt:col] 
      afterDelay:0.2]; 

하지만 drawRowAndColumn: 메시지가 실제로 보낼 때 나는 다음과 같은 오류를 얻을, 그것은 더 이상 유효한 CGContextRef에 대한 액세스 권한이없는 것 같습니다 :

를 내가 drawRowAndColumn에 직접 전화로 performSelector을 교체 할 경우
<Error>: CGContextAddRect: invalid context 

, 그것은 잘 작동합니다. 그래서 내 첫 번째 아이디어는 performSelector을 통해 CGContextRef을 전달하는 것이었지만 동시에 여러 인수를 전달하는 방법을 알아낼 수 없습니다 (다른 좋은 질문입니다).

위의 코드에는 어떤 문제가 있습니까?

답변

3

이렇게 언제든지 그릴 수는 없습니다. UIView의 drawRect: 메서드를 구현하고 거기에 드로잉 코드를 넣어야합니다. drawRect:을 실행하려면 코코아가 뷰를 그려야 함을 알리도록해야합니다. 이를 위해서는 setNeedsDisplay 또는 setNeedsDisplayInRect:으로 전화하십시오.

performSelector : withObject : afterDelay를 사용하여 setNeedsDisplay를 호출하면이 방법으로 직접 번역 할 수 있습니다.하지만 이는 애니메이션을 작성하는 좋은 방법은 아닙니다.

당신이 실제로하려는 일에 따라 다르지만, 예를 들어 제안한대로 도면 코드를 drawRect에 넣을 수는 있지만 숨겨진보기를 시작할 수도 있습니다. 그런 다음 performSelector를 사용하여 setHidden : NO를 호출하여 지연 후 표시되도록하거나 숨겨진 상태가 아닌 알파를 0으로 부드럽게 애니메이션을 적용한 다음 UIView 애니메이션 블록에서 알파를 1로 변경합니다. 이 문서에서).

+0

나는 그것이 단순한 무엇인가 알고 있었다, 고마워! –

+1

애니메이션을하기에 좋은 * 방법은 무엇입니까? – mk12

+0

Core Animation 또는 더 높은 수준의 UIView 기반 래퍼를 사용합니다. 그게 내 대답의 마지막 단락 (UIView 애니메이션 블록)에 대한 이야기였습니다. 애니메이션 블록을 시작하고 일부 UIView 속성을 설정 한 다음 애니메이션을 커밋하고 속성 변경 사항이 애니메이션으로 표시됩니다 (타이밍 등을 제어 할 수 있음). – philsquared