2013-07-22 1 views
2

Я пытаюсь анимировать синусоидальную волну в маленькой рамке, я много искал на SO и в Интернете, но единственная цель, которую я смог достичь, это нарисовать статическую синусоидальную волну, которая переводит с одной стороны на другую, но мне не нужен перевод, я хочу, чтобы анимационная нить синусоиды повторялась в кадре. Кто-нибудь может мне помочь? это то, что я теперь делать:Анимация синусоида

Wave.h

@interface Wave : UIView 

@end 

Wave.m

@implementation Wave 

- (id)initWithFrame:(CGRect)frame 
{ 
self = [super initWithFrame:frame]; 
if (self) { 
    // Initialization code 
    self.backgroundColor = [UIColor clearColor]; 
} 
return self; 
} 

- (void)drawRect:(CGRect)rect 
{ 
[[UIColor colorWithRed:0 green:192/255.0 blue:255/255.0 alpha:1] set]; 
CGContextRef context = UIGraphicsGetCurrentContext(); 
CGContextSetLineWidth(context, 1); 
CGContextSetLineJoin(context, kCGLineJoinRound); 
float width = rect.size.width; 
const CGFloat amplitude = 30/4; 
for(CGFloat x = 0; x < width; x += 0.5) 
{ 
    CGFloat y = amplitude * sinf(2 * M_PI * (x/width) * 5) + 30; 

    if(x == 0) 
     CGContextMoveToPoint(context, x, y); 
    else 
     CGContextAddLineToPoint(context, x, y); 
} 

CGContextStrokePath(context); 
} 

затем в UIViewController я это сделать:

- (void)viewDidLoad 
{ 
self.wave = [[Wave alloc] initWithFrame:CGRectMake(self.view.frame.size.width/2-58, 205, 90, 200)]; 
[self.view addSubview:self.wave]; 

[self animateWave]; 
} 

- (void)animateWave { 
[UIView animateWithDuration:2.5 delay:0.0 options:UIViewAnimationOptionRepeat|UIViewAnimationOptionCurveLinear animations:^{ 
    self.wave.transform = CGAffineTransformMakeTranslation(+self.wave.frame.size.width/2, 0); 
} completion:^(BOOL finished) { 
    self.wave.transform = CGAffineTransformMakeTranslation(0, 0); 
}]; 
} 

но я Безразлично» Мне нужен перевод, я хочу непрерывную анимацию рисования.

EDIT:

У меня есть изменить мой вопрос, используя CADisplayLink предложить в комментариях:

// MainView.h

#import <UIKit/UIKit.h> 
#import <QuartzCore/QuartzCore.h> 
#import "AnimationLayer.h" 

@interface MainView : UIView 
{ 
AnimationLayer *alayer; 
} 

@end 

// MainView.m

#import "MainView.h" 

@implementation MainView 

- (id)initWithFrame:(CGRect)frame 
{ 
self = [super initWithFrame:frame]; 
if (self) { 
    // Initialization code 
    [self setBackgroundColor:[UIColor clearColor]]; 

} 
return self; 
} 

- (void)didMoveToSuperview 
{ 
if ([self superview]) 
{ 

    alayer = [[AnimationLayer alloc] init]; 
    alayer.frame = self.frame; 
    [self.layer addSublayer:alayer]; 

} 
} 

@end 

// AnimationLayer.h 

#import <Foundation/Foundation.h> 
#import <QuartzCore/QuartzCore.h> 

@interface AnimationLayer : CALayer 
{ 
CADisplayLink *displayLink; 
} 

@end 

// AnimationLayer.m

#import "AnimationLayer.h" 

static bool _running; 

@implementation AnimationLayer 

- (id)init 
{ 
self = [super init]; 
if (self) 
{ 
    displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(setNeedsDisplay)]; 
    [self setNeedsDisplayOnBoundsChange:YES]; 
} 

return self; 
} 

static CGPoint lastPoint = {0, 0}; 

- (void)drawInContext:(CGContextRef)ctx 
{ 
if (!_running) 
{ 
    [displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode]; 
    _running = YES; 
    return; 
} 

CGContextSetStrokeColorWithColor(ctx, [[UIColor blackColor] CGColor]); 
CGRect rect = CGContextGetClipBoundingBox(ctx); 
CGContextSetLineWidth(ctx, 2); 
CGContextSetLineJoin(ctx, kCGLineJoinRound); 
float width = rect.size.width; 
const CGFloat amplitude = 30/4; 

CGContextMoveToPoint(ctx, lastPoint.x, lastPoint.y); 
lastPoint.x += 0.5; 
lastPoint.y = amplitude * sinf(2 * M_PI * (lastPoint.x/width) * 5) + 30; 
CGContextAddLineToPoint(ctx, lastPoint.x, lastPoint.y); 

CGContextStrokePath(ctx); 

if (lastPoint.x == rect.size.width) 
{ 
    [displayLink invalidate]; 
    _running = NO; 
} 
} 

@end 

и использовать его таким образом в uiviecontroller:

MainView *view = [[MainView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)]; 
[self.view addSubview:view]; 

теперь моя проблема заключается в том, что код рисования Жеребьевка только немного маленький сегмент, двигаться в синусоиды , но не рисует линию, только этот маленький сегмент, это все мой код, чтобы вы могли попытаться увидеть проблему, как я могу ее исправить?

+0

Как насчет 'CAShapeLayer' или' CADisplayLink'? –

+0

Я никогда не использовал его, можете ли вы сделать пример, пожалуйста? – Piero

+0

Возможно, вы можете начать с изучения документации и руководств по программированию, а затем я могу ответить на ваши вопросы, а не объяснять все с самого начала. –

ответ

0

Создайте анимационный объект phase (объявив его @dynamic), что ваш метод drawRect: зависит от; затем анимируйте phase с бесконечным CABasicAnimation.

Here - отличная отправная точка для пользовательских анимационных свойств.

 Смежные вопросы

  • Нет связанных вопросов^_^