一,程序布局整理

前言://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. python中range和xrange的区别

    1.range生成一个列表:xrange生成一个生成器 2.用法都差不多  

  2. uva------Help is needed for Dexter(11384)

    Problem H Help is needed for Dexter Time Limit: 3 Second Dexter is tired of Dee Dee. So he decided t ...

  3. java基础学习之 消息对话款

    package Dome; import java.awt.event.*; import java.awt.*; import javax.swing.*; public class WindowM ...

  4. Java 集合系列 06 Stack详细介绍(源码解析)和使用示例

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  5. UESTC 2016 Summer Training #1 Div.2

    最近意志力好飘摇..不知道坚不坚持得下去.. 这么弱还瞎纠结...可以滚了.. 水题都不会做.. LCS (A) 水 LCS (B) 没有看题 Gym 100989C 水 1D Cafeteria ( ...

  6. JS解析json数据并将json字符串转化为数组的实现方法

    json数据在ajax实现异步交互时起到了很重要的作用,他可以返回请求的数据,然后利用客户端的js进行解析,这一点体现出js的强大,本文介绍JS解析json数据并将json字符串转化为数组的实现方法, ...

  7. 如何在Quagga BGP路由器中设置IPv6的BGP对等体和过滤

    在本教程中,我们会向你演示如何创建IPv6 BGP对等体并通过BGP通告IPv6前缀.同时我们也将演示如何使用前缀列表和路由映射特性来过滤通告的或者获取到的IPv6前缀. 拓扑 服务供应商A和B希望在 ...

  8. PHP后台

    一.ajax提交表单 先引入ajax.js function ajax(url, fnSucc, fnFaild) { //1.创建Ajax对象 var oAjax=null; if(window.X ...

  9. RelativeLayout练习

    <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android=&q ...

  10. 主机无法访问虚拟机上的elasticsearch服务器

    问题: es在linux上搭建好,通过curl -XGET ip:port可以获得服务器信息展示,但是主机在浏览器上无法访问. 原因: 主机通过telnet访问linux的80端口,发现是不通的.可以 ...