zoukankan      html  css  js  c++  java
  • 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

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

  • 相关阅读:
    sql命令附加数据库
    数据解析0102
    xml file parser
    c#字定义异常处理类
    simple workflow implement
    High Performance Multithreaded Work Item / Event Scheduling Engine
    字符定位
    C#实现的不重复随机数序列生成算法
    Thread并发数控制
    通过Assembly来创建Type Instance
  • 原文地址:https://www.cnblogs.com/huntaiji/p/3436963.html
Copyright © 2011-2022 走看看