一,程序布局整理

前言://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中的popen和subprocess

    import os from subprocess import Popen, PIPE res = os.popen('xx.exe E:\\test\\file1 E:\\test\\file2' ...

  2. sql server中局部变量与全局变量的 申明与赋值(转)

    来源:http://www.111cn.net/database/mssqlserver/36734.htm 例子:http://www.cnblogs.com/sunxi/p/4497493.htm ...

  3. SQL Server数据库(作业)

    create datebase zuoye2gouse zuoyegocreate table student --学生表( Sno varchar(20) not null primary key, ...

  4. eval()函数使用

    条件:有数据集data[indx],数据集内含有对象data[index].obj1.pama1. 说明:传入参数为var str = 'obj1.pama1',要求取得data[index].obj ...

  5. mysql创建PATH快捷

    1.使其临时生效 PATH=$PATH:/usr/local/mysql/bin 2.永久生效 编辑/etc/profile  添加第79列 然后source /etc/profile 3.输入命令m ...

  6. Android的SwipeToDismiss第三方开源框架模拟QQ对话列表侧滑删除,置顶,将头像图片圆形化处理。

      <Android SwipeToDismiss:左右滑动删除ListView条目Item> Android的SwipeToDismiss是github上一个第三方开源框架(github ...

  7. POJ 1503 Integer Inquiry 大数 难度:0

    题目链接:http://poj.org/problem?id=1503 import java.io.*; import java.math.BigInteger; import java.util. ...

  8. svn自动更新

    果对svn不熟悉,当svn上面有更新时,想看到实时效果,就得去web目录手动更新,比较麻烦 其它svn有一个自动更新的功能 利用 hook   在svn 仓库目录下面有一个hook目录 在post-c ...

  9. 解决:操作无法完成(错误0x00000709)。再次检查打印机名称,并确保打印机已连接到.

    就是重启一下服务器端的Print Spooler服务就行了,这么简单! [控制面板 -  服务 -  Print Spooler]

  10. 近期C++编译问题汇总

    编译c++ 代码中遇到几个问题,汇总一下: 1.编译openssl 遇到问题如图 ,  原因:不支持汇编编译,在perl编译指令中加入: no-asm , 如:perl Configure VC-WI ...