2013-09-03 2 views
0

테두리에서 반지를 방출하는 iOS에서 사용자 정의보기를 만들려고했습니다. 코어 그래픽을 사용하여 타원을 그렸습니다. 주기적으로 그것을 내고 싶습니다.UIView는 테두리 모양과 일치하는 반지를 나타냅니다.

저는 이것을 달성하기 위해 CAEmitterLayer와 Core Animation을 모두 사용하려고했지만 실제로 원하는 효과를 얻는 방법을 모릅니다. 이상적으로는 타원이 모양 가장자리에서 두께 약 10 픽셀의 반지를 발산하고 그것이 자라면서 멀어지면서 부드럽게 퇴색하고 싶습니다.

처음 시도했을 때 코어 애니메이션을 사용하여 타원이 3 초마다 자라기 만했지만, 타원이 고정되어 있고 움직이는 또 다른 레이어가 있으면 정말 원하는 것이 있습니다.

어떤 제안이 좋을 것입니다.

내 코드가 처음 시도에서 이동했습니다. 그러나 나는 기압이 것은 :

#import "ThumbView.h" 

#import <QuartzCore/QuartzCore.h> 

@implementation ThumbView 

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx { 

    [super drawLayer:layer inContext:ctx]; 

    // Create the emitter layer and make it the same size as the view. 
    CAEmitterLayer *emitterLayer = [CAEmitterLayer layer]; 
    emitterLayer.frame = self.frame; 

    // Apply some attributes to the emitter. 
    emitterLayer.emitterShape = kCAEmitterLayerCircle; 
    emitterLayer.renderMode = kCAEmitterLayerOutline; 
    emitterLayer.emitterSize = CGSizeMake (4, 4); 

    // Create a scale animation that repeats every 3 seconds. 
    CAKeyframeAnimation *scaleAnimation = [CAKeyframeAnimation animationWithKeyPath:@"transform.scale"]; 
    scaleAnimation.duration = 3.0f; 
    scaleAnimation.repeatCount = HUGE_VAL; 
    scaleAnimation.values = @[@1, @1.5f, @1.5f]; 
    scaleAnimation.keyTimes = @[@0, @0.5, @1]; 

    // Create a fade animation that repeats every 3 seconds. 
    CAKeyframeAnimation *glowAnimation = [CAKeyframeAnimation animationWithKeyPath:@"opacity"]; 
    glowAnimation.duration = 3.0f; 
    glowAnimation.repeatCount = HUGE_VAL; 
    glowAnimation.values = @[@1, @0, @0]; 
    glowAnimation.keyTimes = @[@0, @0.5, @1]; 

    [emitterLayer addAnimation:scaleAnimation forKey:@"scale"]; 
    [emitterLayer addAnimation:glowAnimation forKey:@"opacity"]; 

    if (!self.pressed) { 
     [layer insertSublayer:emitterLayer above:layer]; 
    } else { 
     [emitterLayer removeFromSuperlayer]; 
    } 

} 

// Only override drawRect: if you perform custom drawing. 
// An empty implementation adversely affects performance during animation. 
- (void)drawRect:(CGRect)rect { 

    // Drawing code. Draw an elipse here. 
    CGContextRef context = UIGraphicsGetCurrentContext(); 

    CGContextSetFillColorWithColor (context, self.thumbColour.CGColor); 
    CGContextFillEllipseInRect (context, rect); 

} 


@end 

그래서 내가 뭘하려고 한 것은 drawLayer 내에서 에미 터 층을 만드는 것입니다 : inContext : 델리게이트 메소드; 그것에 애니메이션을 적용하십시오. 뷰 레이어에 하위 레이어로 추가합니다.

+0

지금까지 시도한 코드를 더 쉽게 추가 할 수 있습니까? –

+0

.gif를 사용하고 http://blog.stijnspijker.nl/2009/07/animated와 같은 것을 사용 하시겠습니까? 투명 GIF - for iphone-made-easy/gif가 작동하도록 허용 하시겠습니까? 나는 그것이 당신에게 엄청난 문제를 줄 수 있다고 생각합니다. – Lugubrious

+1

나는 아마도 당신이 옳다고 생각합니다. 그것은 많은 슬픔을 덜어 줄 것입니다. 나는 gif를 사용하는 것에 불리하지 않습니다. 코드를 통해보다 효율적으로 작업하려고했지만 그만한 가치가있는 것보다 더 큰 문제가 될 수 있습니다. 더 많은 연구를 해본 결과 emitterLayer를 사용하는 것이 과잉이라고 생각합니다. – tomasbasham

답변

2

하나 이상의 CAShapeLayer 개체를 사용하고 셰이프 레이어에 설치된 CGPath의 눈금을 애니메이션으로 만들 것을 제안합니다.

도형 레이어는 기본적으로 경로의 변경 사항을 애니메이션으로 나타냅니다.

그리려는 타원을 획정하는 모양 레이어 집합을 만들고 원하는 효과를 얻으려면 해당 경로의 배율 설정을 변경할 수 있어야합니다.

+0

반환되는 정보를 - (CALayer *) 레이어에서 CAShapeLayer로 변경하는 것이 좋습니다. 이 레이어에 타원을 만듭니다. 타원을 치는 다른 하위 레이어를 추가하고 스트로크 레이어의 패스에 애니메이션을 적용하여 배율을 조정 하시겠습니까? 재치있는 소리가 들린다 – tomasbasham

+0

- (CALayer *) 레이어에서 반환되는 것을 변경한다는 것은 무엇을 의미합니까? 클래스 메서드 + (Class) layerClass를 구현하는 UIView의 사용자 정의 하위 클래스를 만들어 백업 레이어를 모양 레이어로 만들겠습니까? 네, 그렇게 할 수 있습니다. 그런 다음보기의 기본 레이어는 모양 레이어가 될 수 있으며, 기본 모양에서 자란 동심원 모양을 내뿜는 다른 모양 레이어를 추가 할 수 있습니다. –

+0

그것이 내가 의미했던 것입니다. 나는 틀린 방법을 타이프했다. 치료를 받았다. 감사 – tomasbasham

관련 문제