//聯(lián)系人:石虎QQ: 1224614774昵稱:嗡嘛呢叭咪哄
/**
注意點: 1.看 GIF 效果圖.
2.看連線視圖的效果圖.
3.看實現(xiàn)代碼(直接復(fù)制實現(xiàn)效果).
*/
一挟鸠、GIF 效果圖:
二、連線視圖的效果圖:
圖1:
圖2:
圖3:
三亩冬、實現(xiàn)代碼:
=========================
===================================================
==========================
控制器1:SHContext.h
//
//? SHContext.h
//? SnowAnimation(下雪動畫)~demo
//
//? Created by石虎on 2017/8/15.
//? Copyright ? 2017年shihu. All rights reserved.
//
#ifndef SHContext_h
#define SHContext_h
/*
該方法負責(zé)繪制圓角矩形
x1艘希、y2:是圓角矩形左上角的座標(biāo)。
width硅急、height:控制圓角舉行的寬覆享、高
radius:控制圓角矩形的四個圓角的半徑
*/
voidCGContextAddRoundRect(CGContextRefc,CGFloatx1 ,CGFloaty1
,CGFloatwidth ,CGFloatheight ,CGFloatradius)
{
//移動到左上角
CGContextMoveToPoint(c, x1 + radius , y1);
//添加一條連接到右上角的線段
CGContextAddLineToPoint(c , x1 + width - radius, y1);
//添加一段圓弧
CGContextAddArcToPoint(c , x1 + width , y1, x1 + width
, y1 + radius, radius);
//添加一條連接到右下角的線段
CGContextAddLineToPoint(c , x1 + width, y1 + height - radius);
//添加一段圓弧
CGContextAddArcToPoint(c , x1 + width, y1 + height
, x1 + width - radius , y1 + height , radius);
//添加一條連接到左下角的線段
CGContextAddLineToPoint(c , x1 + radius, y1 + height);
//添加一段圓弧
CGContextAddArcToPoint(c , x1, y1 + height , x1
, y1 + height - radius , radius);
//添加一條連接到左上角的線段
CGContextAddLineToPoint(c , x1 , y1 + radius);
//添加一段圓弧
CGContextAddArcToPoint(c , x1 , y1 , x1 + radius , y1 , radius);
}
/*
該方法負責(zé)繪制多角星。
n:該參數(shù)通常應(yīng)設(shè)為奇數(shù)营袜,控制繪制N角星撒顿。
dx荚板、dy:控制N角星的中心凤壁。
size:控制N角星的大小
*/
voidCGContextAddStar(CGContextRefc ,NSIntegern
,CGFloatdx ,CGFloatdy ,NSIntegersize)
{
CGFloatdig =4*M_PI/ n ;
//移動到指定點
CGContextMoveToPoint(c , dx , dy + size);
for(inti =1; i <= n ; i++)
{
CGFloatx =sin(i * dig);
CGFloaty =cos(i * dig);
//繪制從當(dāng)前點連接到指定點的線條
CGContextAddLineToPoint(c , x * size + dx ,y * size + dy);
}
}
/*
該方法負責(zé)繪制花朵。
n:該參數(shù)控制花朵的花瓣數(shù)跪另。
dx拧抖、dy:控制花朵的位置。
size:控制花朵的大小
length:控制花瓣的長度
*/
voidCGContextAddFlower(CGContextRefc ,NSIntegern
,CGFloatdx ,CGFloatdy ,CGFloatsize ,CGFloatlength)
{
//移動到指定點
CGContextMoveToPoint(c , dx , dy + size);
CGFloatdig =2*M_PI/ n;
//采用循環(huán)添加n段二次曲線路徑
for(inti =1; i < n +1; i++)
{
//結(jié)算控制點坐標(biāo)
CGFloatctrlX =sin((i -0.5) * dig) * length + dx;
CGFloatctrlY=cos((i -0.5) * dig) * length + dy;
//結(jié)算結(jié)束點的坐標(biāo)
CGFloatx =sin(i * dig) * size + dx;
CGFloaty =cos(i * dig) * size + dy;
//添加二次曲線路徑
CGContextAddQuadCurveToPoint(c, ctrlX , ctrlY , x , y);
}
}
#endif/* SHContext_h */
=========================
===================================================
控制器2:SHSnowView.m
//
//? SHSnowView.m
//? SnowAnimation(下雪動畫)~demo
//
//? Created by石虎on 2017/8/15.
//? Copyright ? 2017年shihu. All rights reserved.
//
#import"SHSnowView.h"
#import"SHContext.h"
@implementationSHSnowView
//定義雪花的初始化位置
staticCGPointsnowPos[] = {
{20,4},
{50,4},
{80,4},
{110,4},
{140,4},
{170,4},
{200,4},
{230,4},
{260,4},
{290,4}
};
//計算雪花的數(shù)量
staticNSIntegersnowCount =sizeof(snowPos)
/sizeof(snowPos[0]);
-(id) initWithCoder:(NSCoder*)aDecoder
{
self= [superinitWithCoder:aDecoder];
if(self)
{
//控制每隔0.2秒執(zhí)行一次setNeedsDisplay方法刷新自己
[NSTimerscheduledTimerWithTimeInterval:0.2target:self
selector:@selector(setNeedsDisplay)userInfo:nilrepeats:YES];
}
returnself;
}
- (void)drawRect:(CGRect)rect
{
CGContextRefctx =UIGraphicsGetCurrentContext();
//設(shè)置采用白色作為填充色
CGContextSetRGBFillColor(ctx ,1,1,1,1);
for(inti =0; i
{
//保存當(dāng)前繪圖狀態(tài)
CGContextSaveGState(ctx);
//平移坐標(biāo)系統(tǒng)
CGContextTranslateCTM(ctx ,snowPos[i].x,snowPos[i].y);
//旋轉(zhuǎn)坐標(biāo)系統(tǒng)
CGContextRotateCTM(ctx , (arc4random() %6-3) *M_PI/10);
//控制“雪花”下掉
snowPos[i].y+=arc4random() %8;
if(snowPos[i].y>320)
{
snowPos[i].y =4;
}
//創(chuàng)建免绿、并繪制“雪花”
CGContextAddFlower(ctx ,6,0,0,4,8);
CGContextFillPath(ctx);
//恢復(fù)繪圖狀態(tài)
CGContextRestoreGState(ctx);
}
}
@end
================
=======
謝謝!!!