Я пытаюсь анимировать синусоидальную волну в маленькой рамке, я много искал на 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];
теперь моя проблема заключается в том, что код рисования Жеребьевка только немного маленький сегмент, двигаться в синусоиды , но не рисует линию, только этот маленький сегмент, это все мой код, чтобы вы могли попытаться увидеть проблему, как я могу ее исправить?
Как насчет 'CAShapeLayer' или' CADisplayLink'? –
Я никогда не использовал его, можете ли вы сделать пример, пожалуйста? – Piero
Возможно, вы можете начать с изучения документации и руководств по программированию, а затем я могу ответить на ваши вопросы, а не объяснять все с самого начала. –