#import "myview.h" @interface myview () @property(nonatomic,assign) float imageY; @end @implementation myview -(instancetype)initWithFrame:(CGRect)frame { if ([super initWithFrame:frame]) { //刷帧,默认每秒60次,不会自动启动,需要加到RunLoop中 CADisplayLink *display=[CADisplayLink displayLinkWithTarget:self selector:@selector(updateimg)]; [display addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode]; //一般用于更新非界面数据 // [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(updateimg) userInfo:nil repeats:YES]; } return self; } -(void)updateimg { //drawRect:方法不能由我们自己手动调用,只能由系统来调用。 //drawRect:调用的时机:当第一次显示或者一个重绘事件发生时调用。 // setNeedsDisplay方法:重新绘制,调用这个方法就会通知自定义的view重新绘制画面,调用drawRect:。 // 提示:当一个view从xib或storyboard创建出来时,会调用awakefromnib方法。 [self setNeedsDisplay]; } -(void)awakeFromNib { NSLog(@"awakefromnib"); } - (void)drawRect:(CGRect)rect { self.imageY+=3; if (self.imageY>rect.size.height) { self.imageY=0; } UIImage *img=[UIImage imageNamed:@"img.jpg"]; [img drawAtPoint:CGPointMake(20, self.imageY)]; } @end
运行效果:图片往下循环移动