iOS 图形图像动画 Core Animation
//Core Animation #define WeakSelf __weak __typeof(self) weakSelf = self #define StrongSelf __strong __typeof(weakSelf) self = weakSelf //添加 - (void)add:(id)sender { [UIView animateWithDuration:1 animations:^{ [UIView setAnimationTransition:UIViewAnimationTransitionCurlDown forView:self.view cache:YES]; [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; }]; } //翻页 - (void)curl:(id)sender { WeakSelf; [UIView animateWithDuration:1 animations:^{ StrongSelf; [UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:self.view cache:YES]; [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; [self.view exchangeSubviewAtIndex:3 withSubviewAtIndex:2]; }]; } //移入 - (void)move:(id)sender { CATransition *trans = [CATransition animation]; trans.duration = 2.0f; trans.type = kCATransitionMoveIn; trans.subtype = kCATransitionFromLeft; [self.view.layer addAnimation:trans forKey:@"animation"]; [self.view exchangeSubviewAtIndex:2 withSubviewAtIndex:3]; } //揭开 - (void)reveal:(id)sender { CATransition *trans = [CATransition animation]; trans.duration = 2.0f; trans.type = kCATransitionReveal; trans.subtype = kCATransitionFromTop; [self.view.layer addAnimation:trans forKey:@"animation"]; [self.view exchangeSubviewAtIndex:2 withSubviewAtIndex:3]; } //立方体 - (void)cube:(id)sender { CATransition *trans = [CATransition animation]; trans.duration = 2.0f; trans.type = @"cube"; trans.subtype = kCATransitionFromLeft; [self.view.layer addAnimation:trans forKey:@"animation"]; [self.view exchangeSubviewAtIndex:2 withSubviewAtIndex:3]; } //收缩 - (void)suck:(id)sender { CATransition *trans = [CATransition animation]; trans.duration = 2.0f; trans.type = @"suckEffect"; [self.view.layer addAnimation:trans forKey:@"animation"]; [self.view exchangeSubviewAtIndex:2 withSubviewAtIndex:3]; } //翻转 - (void)oglFlip:(id)sender { CATransition *trans = [CATransition animation]; trans.duration = 2.0f; trans.type = @"oglFlip"; trans.subtype = kCATransitionFromBottom; [self.view.layer addAnimation:trans forKey:@"animation"]; [self.view exchangeSubviewAtIndex:2 withSubviewAtIndex:3]; } //水波 - (void)ripple:(id)sender { CATransition *trans = [CATransition animation]; trans.duration = 2.0f; trans.type = @"rippleEffect"; [self.view.layer addAnimation:trans forKey:@"animation"]; [self.view exchangeSubviewAtIndex:2 withSubviewAtIndex:3]; }
draw default shape
CGContextRef ctx = UIGraphicsGetCurrentContext(); CGContextSetLineWidth(ctx, 16); CGContextSetRGBStrokeColor(ctx, 0, 1, 0, 1); //straight line const CGPoint points1[] = {CGPointMake(10, 20),CGPointMake(100, 20),CGPointMake(100, 20),CGPointMake(20, 50)}; CGContextStrokeLineSegments(ctx, points1, 4); CGContextSetLineCap(ctx, kCGLineCapSquare); const CGPoint points2[] = {CGPointMake(110, 20),CGPointMake(200, 20),CGPointMake(200, 20),CGPointMake(120, 50)}; CGContextStrokeLineSegments(ctx, points2, 4); CGContextSetLineCap(ctx, kCGLineCapRound); const CGPoint points3[] = {CGPointMake(210, 20),CGPointMake(300, 20),CGPointMake(300, 20),CGPointMake(220, 50)}; CGContextStrokeLineSegments(ctx, points3, 4); //dashed line CGContextSetLineCap(ctx, kCGLineCapButt); CGContextSetLineWidth(ctx, 10); CGFloat patterns1[] = {6,10}; CGContextSetLineDash(ctx, 0, patterns1, 1); const CGPoint points4[] = {CGPointMake(40, 65),CGPointMake(280, 65)}; CGContextStrokeLineSegments(ctx, points4, 2); CGContextSetLineDash(ctx, 3, patterns1, 1); const CGPoint points5[] = {CGPointMake(40, 85),CGPointMake(280, 85)}; CGContextStrokeLineSegments(ctx, points5, 2); CGFloat patterns2[] = {5,1,4,1,3,1,2,1,1,1,1,2,1,3,1,4,1,5}; CGContextSetLineDash(ctx, 0, patterns2, 18); const CGPoint points6[] = {CGPointMake( 40, 105),CGPointMake(280, 105)}; CGContextStrokeLineSegments(ctx, points6, 2); //rectangle CGContextSetStrokeColorWithColor(ctx, [UIColor blueColor].CGColor); CGContextSetFillColorWithColor(ctx, [UIColor blueColor].CGColor); CGContextSetLineWidth(ctx, 14); CGContextSetLineDash(ctx, 0, 0, 0);//cancel dashed style CGContextStrokeRect(ctx, CGRectMake(30, 230, 120, 60)); CGContextSetStrokeColorWithColor(ctx, [UIColor purpleColor].CGColor); CGContextSetLineJoin(ctx, kCGLineJoinRound);//round corner CGContextStrokeRect(ctx, CGRectMake(80, 260, 120, 60)); CGContextSetRGBStrokeColor(ctx, 1.0, 0, 1.0, 1); CGContextSetLineJoin(ctx, kCGLineJoinBevel);//cliped corner CGContextStrokeRect(ctx, CGRectMake(130, 290,120, 60)); CGContextSetFillColorWithColor(ctx, [UIColor redColor].CGColor);//filled rectangle CGContextFillRect(ctx, CGRectMake(30,120, 120, 60)); //oval CGContextSetRGBStrokeColor(ctx, 0, 1, 1, 1); CGContextStrokeEllipseInRect(ctx, CGRectMake(30, 380, 120, 60));//Stroke oval CGContextSetRGBFillColor(ctx, 1, 0, 1, 1); CGContextFillEllipseInRect(ctx, CGRectMake(180, 380, 120, 60));//Filled oval
draw custom shape
CGContextRef ctx = UIGraphicsGetCurrentContext();//get context for (int i = 0; i < 10; i++) { CGContextBeginPath(ctx); CGContextAddArc(ctx, i * 35, i * 35, (i + 1) * 6, 0 , 1.5 * M_PI, 0);//actually 0 means clockwise CGContextClosePath(ctx); CGContextSetRGBFillColor(ctx, 1, 0, 1, (10 - i) * 0.1); CGContextFillPath(ctx); }
draw round rect
CGContextRef ctx = UIGraphicsGetCurrentContext();//get context CGContextBeginPath(ctx); CGFloat x,y,radius,width,height; x = 50; y = 50; radius = 10; width = 90; height = 40; CGContextMoveToPoint(ctx, x + radius, y);//move to left top corner CGContextAddLineToPoint(ctx, x + width - radius, y);//add top line to right top corner CGContextAddArcToPoint(ctx, x + width, y, x + width, y + radius, radius);//add right top corner CGContextAddLineToPoint(ctx, x + width, y + height - radius);//add right line to right bottom corner CGContextAddArcToPoint(ctx, x + width, y + height, x + width - radius, y + height, radius);//add right bottom corner CGContextAddLineToPoint(ctx, x + radius, y + height);//add bottom line to left bottom corner CGContextAddArcToPoint(ctx, x, y + height, x, y + height - radius, radius);//add left bottom corner CGContextAddLineToPoint(ctx, x, y + radius);//add left line to left top corner CGContextAddArcToPoint(ctx, x, y, x + radius, y, radius);//add left top corner CGContextClosePath(ctx); CGContextSetRGBFillColor(ctx, 1, 0, 1, 0.6); CGContextFillPath(ctx);
draw nCorner star
CGContextRef ctx = UIGraphicsGetCurrentContext();//get context CGContextBeginPath(ctx); CGFloat x,y,size; NSInteger nCorner = 5;//n corner x = 150; y = 350; size = 50; CGFloat dig = 4 * M_PI / nCorner;CGContextMoveToPoint(ctx, x, y + size); for (int i = 1; i <= nCorner; i++) { CGFloat _x = sin(i * dig); CGFloat _y = cos(i * dig); CGContextAddLineToPoint(ctx, _x * size + x, _y * size + y); } CGContextClosePath(ctx); CGContextSetRGBFillColor(ctx, 1, 0, 1, 0.6); CGContextFillPath(ctx);
draw flower
CGContextRef ctx = UIGraphicsGetCurrentContext(); CGContextBeginPath(ctx); CGFloat x,y,size,length; NSInteger nCorner = 6;//n corner x = 150; y = 350; size = 30; length = 120;//length should be bigger CGContextMoveToPoint(ctx, x, y + size); CGFloat dig = 2 * M_PI / nCorner; for (int i = 1; i < nCorner + 1; i++) { //count control point CGFloat ctrlX = sin((i - 0.5) * dig) * length + x; CGFloat ctrlY = cos((i - 0.5) * dig) * length + y; //count end point CGFloat _x = sin(i * dig) * size + x; CGFloat _y = cos(i * dig) * size + y; //draw line CGContextAddQuadCurveToPoint(ctx, ctrlX, ctrlY, _x, _y); } CGContextClosePath(ctx); CGContextSetRGBFillColor(ctx, 1, 0, 1, 0.6); CGContextFillPath(ctx);
use coordinate
CGContextRef ctx = UIGraphicsGetCurrentContext(); CGContextTranslateCTM(ctx, 10, 200);//move the coordinate for (int i = 0; i < 50; i++) { CGContextSetRGBFillColor(ctx, 1, 0, 1, 0.3 - i * 0.01); CGContextFillRect(ctx, CGRectMake(0, 0, 150, 75)); CGContextTranslateCTM(ctx, 50, 50); CGContextScaleCTM(ctx, 0.93, 0.93); CGContextRotateCTM(ctx, - M_PI / 10); }
Stay hungry,stay foolish.