一,程序布局整理

前言://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

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

IOS 作业项目(4)步步完成 画图 程序(中续)的更多相关文章

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

    一,承接上文,继续本文  [UIButton buttonWithType:UIButtonTypeRoundedRect]; 如此声明的按钮才会有点击闪动的效果!如果直接frame方式声明就不会有. ...

  2. IOS 作业项目(4)步步完成 画图 程序(问题处理)终结

    一,解决换色程序崩溃问题 程序崩溃是因为颜色的内存被释放,添加如下类的内容即可 @implementation TuyaPath - (id)init { self = [super init]; i ...

  3. IOS 作业项目(4)步步完成 画图 程序(剧终)

    // //  CHViewController.m //  SuperDrawingSample // //  Created by JaikenLI on 13-11-21. //  Copyrig ...

  4. IOS 作业项目(4)步步完成 画图 程序(上)

    先上流程图

  5. IOS 作业项目(2) 画图(保存,撤销,笔粗细设定功能)

    先上效果图

  6. IOS 作业项目 TableView两个section中cell置顶功能实现

    点击cell会置顶,其他的下移

  7. IOS 作业项目(3) 霓虹灯效果

    先上效果图 #import "CHViewController.h"@interface CHViewController (){    int i;    int j;}@pro ...

  8. IOS 作业项目(1) 关灯游戏 (百行代码搞定)

    1,准备工作,既然要开关灯,就需要确定灯的灯的颜色状态 首先想到的是扩展UIColor

  9. iOS:项目中疑难Crash问题集锦

    项目中疑难Crash问题集锦 iOS App运行中遇到Crash的情况相信大家都遇到过,开发和者测试中遇到了可能很方便的办法就是直接拿着设备连接一下,然后使用Xcode自带的工具就可以解析出Crash ...

随机推荐

  1. JS基础--问题记录

    1. {}var a={};{}是一个空的对象,是 new Object();的简写. 2.判断元素是存在 //jQuery 对象中元素的个数.当前匹配的元素个数. size 将返回相同的值. if ...

  2. <spring:message> 标签

    可以使用<spring:message>标签结合 ResourceBundleMessageSource 的功能,在网页上显示 messages.properties 中的文字讯息,例如在 ...

  3. Chrome开发,debug的使用方法。(转)

    怎样打开Chrome的开发者工具? 你可以直接在页面上点击右键,然后选择审查元素: 或者在Chrome的工具中找到: 或者,你直接记住这个快捷方式: Ctrl+Shift+I (或者Ctrl+Shif ...

  4. SVG格式

    SVG格式 编辑 目 录 概述 简介 优势 实例 展现 1概述 SVG格式 SVG是一种用XML定义的语言,用来描述二维矢量及矢量/栅格图形.SVG提供了3种类型的图形对象:矢量图形(vectorgr ...

  5. c# xml的增删改查操作 xmlDocument 的用法

    1.将xml转换为DataTable string path = "";//xml的位置StringReader sr = null;XmlTextReader xmlReader ...

  6. Junit4的简单使用

    junit4的简单使用 测试套件的使用 测试类1 package com.westward; import static org.junit.Assert.*; import org.junit.Te ...

  7. Power string(poj 2406)

    题目大意,给出一个字符串s,求最大的k,使得s能表示成a^k的形式,如 abab 可以表示成(ab)^2: 方法:首先 先求kmp算法求出next数组:如果 len mod (len-next[len ...

  8. node.js安装及grunt插件,如何进行脚本压缩

    http://gruntjs.com/pluginshttp://gruntjs.com/getting-startedhttp://gruntjs.com/configuring-tasks#glo ...

  9. net IL的一些探索

    查看IL有2个工具比较好用,一个是大名鼎鼎的Reflector,但已经转向收费,另一个是开源的ILSpy,强大好用,对linq和lambda表达示的支持很好.相关的书籍也很多,比如这本Microsof ...

  10. 数据结构-List

    Lis的实现: /////////////////////////////////////////////////////////////////////////////// // // FileNa ...