2012-02-17 3 views
0

drawRect 안에 을 사용하여 색칠 된 사각형을 클립 할 수 있도록보기에서 drawRect을 덮어 쓰는 중입니다. 때로는이 클리핑 된 사각형의 색을 변경합니다. 이 경우 drawRect이 다시 호출되어 새 색상으로 사각형을 다시 그려 클리핑합니다. 이제 색상을 한 번에 변경하지 않고 애니메이션을 적용하고 싶습니다. 문제는 drawRect를 재정의 할 때 애니메이션이 수행되지 않는다는 것입니다 (drawRect가 한 번만 호출되고 즉시 호출 됨).클리핑 할 때 drawRect를 오버라이드하는 것을 피하는 방법

수퍼 클래스의 drawRect을 여전히 오버랩 할 수 있도록이 애니메이션을 수행 할 수있는 방법이 있습니까? 그렇지만 애니메이션은 어쨌든 서브 클래스를 통해 수행되므로 수퍼 클래스의 drawRect가 여러 번 수행됩니다. 생기?

또는 drawRect을 전혀 덮어 쓰지 않아도되고이 마스크를 여하튼 클립 할 수 있습니까? drawRect는 다음과 같은 :

CGContextRef ctx = UIGraphicsGetCurrentContext(); 
CGImageRef maskImage = [[UIImage imageNamed:maskName] CGImage]; 
CGContextClipToMask(ctx, rect, maskImage); 

CGContextSetFillColorWithColor(ctx, self.currentColor); 
CGContextFillRect(ctx, rect); 

답변

0

내가 그것을보기를 마스크하는의 CALayer를 사용하는 것이 좋습니다 생각 (QuartzCore를 가져올 것을 잊지 마세요) :

maskLayer.contents = (id)[UIImage imageNamed:maskName].CGImage; // maskLayer is a CALayer 
view.layer.mask = maskLayer; 

을 이제 당신이 당신의 뷰 컨트롤러의 방법 -(void)animate이 있으리라 믿고, 당신은 그것을 실행해야 타이머를 사용하여 여러 번 호출하거나 performSelector:withObject:afterDelay에 대한 재귀 호출을 사용합니다.

+0

마지막으로 애니메이션을 사용할 수 있도록 접근 방식을 사용하여 drawRect를 재정의 할 필요가 없었습니다. 타이머를 사용하거나 애니메이션 메서드를 재귀 적으로 실행할 필요가 없었습니다. 표준 CoreAnimation을 사용할 수 있기 때문입니다. 고마워요! 한 가지주의 할 점은 png 이미지 또는 선명한 색상의 이미지를 사용해야한다는 것입니다 (흑백 마스크는 더 이상 작동하지 않지만 문제는 없습니다). 또한 마스크 프레임을 maskLayer.frame = [self bounds]를 사용하여 마스크 할 뷰 경계로 설정해야합니다. – JayAr

0

하나의 솔루션은 색상이 변경 될 때마다 시간이 지남에 다시 그리기를 반복하는 화재 타이머를 가지고하는 것입니다. 사용자가 새 색상을 선택하면 NSTimer에 별표가 표시됩니다 (예 : 10x 초). 타이머가 시작되면 시작 색상에서 끝 색상까지 현재 색상을 업데이트하고보기를 무효화합니다. 최종 색상에 도달하면 타이머를 종료하십시오.

+0

감사합니다. 작동해야하는 것처럼 들리지만 어쨌든 (애니메이션) 휠을 재발 명하는 것과 비슷합니다. 다른 옵션이 없다면 이걸 사용하겠습니다. – JayAr

관련 문제