IOS 作业项目(4)步步完成 画图 程序(中续)

一,程序布局整理

前言://1,程序启动//2,程序流程框架//3,程序界面一致//4,程序界面功能,

//这里只做页面的固定功能, //在首次创建界面时,我们会指定好固定事件触发前的固定方法 //至于另外程序启动后,运行过程中会添加和减少的事件触发的方法,我们会在另外一个"刷新"方法内实现

在上面7大视图中添加按钮事件,这些事件写在所有外观布局代码的最下边,例如在editScene视图中,我们把所有的事件都写在如下内容处,其余视图中的事件按此方式来写

 //------------------------------------------------------------------------------------------

    //返回按钮功能

     [leftButton addTarget:self action:@selector(editSceneBackMainScene:) forControlEvents:UIControlEventTouchUpInside];

    //保存按钮功能

     [rightButton addTarget:self action:@selector(editSceneBackMainScene:) forControlEvents:UIControlEventTouchUpInside];

    //背景颜色按钮的功能

    [backgroundButton addTarget:self action:@selector(editSceneToBgColorScene:) forControlEvents:UIControlEventTouchUpInside];

    //画笔颜色按钮的功能

    [midButton addTarget:self action:@selector(editSceneToLineColorScene:) forControlEvents:UIControlEventTouchUpInside];

    //画笔大小按钮的功能

     [lineWidthButton addTarget:self action:@selector(editSceneToLineWidthScene:) forControlEvents:UIControlEventTouchUpInside]; 

    //-----------------------------------------------------------------------------------------------------------------------

   二,画图

布局和跳转写好之后,就要完成主要功能,最主要功能是画图,界面三

建立一个画图类,.h文件如下:

@interface TuyaPad : UIView

@property (nonatomic,strong)UIColor * lineColor;

@property (nonatomic,assign)CGFloat lineWidth;

-(UIImage *)getImageFromCurrentContext;

@end

 实现内容如下:

#import "TuyaPad.h"

@interface TuyaPath:NSObject

@property (nonatomic,assign)CGMutablePathRef path;

@property (nonatomic,assign)CGColorRef color;

@property (nonatomic,assign)CGFloat width;

 

@end

 

@implementation TuyaPath

@end

 

@interfaceTuyaPad()

//存储路径信息

@property (nonatomic,strong)NSMutableArray* pathlist;

 

@end

@implementation TuyaPad

{

//触摸路径

    CGMutablePathRef touchPath;

    //中间变量路径

    CGMutablePathRef tempPath;

    //三个触摸点

    CGPoint startPoint,controlPoint,endPoint;

}

 

 

- (id)initWithFrame:(CGRect)frame

{

    self = [super initWithFrame:frame];

    if (self) {

        self.lineColor=[UIColor blackColor];

        self.lineWidth=10.f;

        self.pathlist=[[NSMutableArray alloc]init];

    }

    returnself;

}

 

 

// Only override drawRect: if you perform custom drawing.

// An empty implementation adversely affects performance during animation.

- (void)drawRect:(CGRect)rect

{

    [super drawRect:rect];

    //1,获取当前画布

    CGContextRef context=UIGraphicsGetCurrentContext();

    //2,划线

    for (TuyaPath *path in self.pathlist) {

        //设置描绘颜色

        CGContextSetStrokeColorWithColor(context, path.color);

        //设置线条宽度

        CGContextSetLineWidth(context, path.width);

        //将路径添加到画布上

        CGContextAddPath(context, path.path);

        //设置线条形状

        CGContextSetLineCap(context, kCGLineCapRound);

        //开始描绘

        CGContextStrokePath(context);

    }

}

//触摸开始

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

{

    //实例化tuyaPath对象

    TuyaPath *itemPath=[[TuyaPath alloc]init];

    itemPath.color=self.lineColor.CGColor;

    itemPath.width=self.lineWidth;

    

    //实例化触摸路径对象

    touchPath=CGPathCreateMutable();

    itemPath.path=touchPath;

    //TuyaPath对象添加到路径数组内

    [self.pathlist addObject:itemPath];

    

    //获取触摸对象

    UITouch *touch=[touches anyObject];

    startPoint =[touch previousLocationInView:self];

    controlPoint=[touch previousLocationInView:self];

    endPoint=[touch locationInView:self];

    [self touchesMoved:touches withEvent:event];

}

//触摸移动

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event

{

    //获取触摸对象

    UITouch *touch=[touches anyObject];

    startPoint=controlPoint;

    controlPoint=[touch previousLocationInView:self];

    endPoint=[touch locationInView:self];

    

    CGFloat mid1x=(startPoint.x+controlPoint.x)/2.0;

    CGFloat mid1y=(startPoint.y+controlPoint.y)/2.0;

    CGFloat mid2x=(controlPoint.x+endPoint.x)/2.0;

    CGFloat mid2y=(controlPoint.y+endPoint.y)/2.0;

    

    tempPath=CGPathCreateMutable();

    CGPathMoveToPoint(tempPath, NULL, mid1x, mid1y);

    CGPathAddQuadCurveToPoint(tempPath, NULL, controlPoint.x, controlPoint.y, mid2x, mid2y);

    //将中间变量路径添加到触摸路径内

    CGPathAddPath(touchPath, NULL, tempPath);

    //获取路径数组内的最后一个元素

    TuyaPath *laseItem=[self.pathlist lastObject];

    laseItem.path=touchPath;

    

    //根据中间变量路径,计算最小范围

    CGRect boundingBox=CGPathGetBoundingBox(tempPath);

    boundingBox.origin.x-=self.lineWidth;

    boundingBox.origin.y-=self.lineWidth;

    boundingBox.size.width+=2*self.lineWidth;

    boundingBox.size.height+=2*self.lineWidth;

    //[self setNeedsDisplay];

    [selfsetNeedsDisplayInRect:boundingBox];//在原画板上画bounding区域的内容

}

//触摸结束

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event

{

    //获取触摸路径对象

    TuyaPath *lastPath=[self.pathlist lastObject];

    //指定触摸路径对象结束时,触摸路径是touchPath

    lastPath.path=touchPath;

 

}

-(UIImage *)getImageFromCurrentContext

{

    UIGraphicsBeginImageContext(self.bounds.size);//创建画布用UIGraphicsGetCurrentContext()可以获得

    [self.layerrenderInContext:UIGraphicsGetCurrentContext()];//self.layer当前画布上的内容  渲染到图片画布

    UIImage *result=  UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    

    [self.pathlistremoveAllObjects];

    [selfsetNeedsDisplay];

    return result;

}

@end

主要内容如上,剩下的是细节和部分功能,在下节上主要代码.

原文地址:https://www.cnblogs.com/huntaiji/p/3436963.html