一,程序布局整理
前言://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)步步完成 画图 程序(中续)的更多相关文章
-
IOS 作业项目(4)步步完成 画图 程序(中)
一,承接上文,继续本文 [UIButton buttonWithType:UIButtonTypeRoundedRect]; 如此声明的按钮才会有点击闪动的效果!如果直接frame方式声明就不会有. ...
-
IOS 作业项目(4)步步完成 画图 程序(问题处理)终结
一,解决换色程序崩溃问题 程序崩溃是因为颜色的内存被释放,添加如下类的内容即可 @implementation TuyaPath - (id)init { self = [super init]; i ...
-
IOS 作业项目(4)步步完成 画图 程序(剧终)
// // CHViewController.m // SuperDrawingSample // // Created by JaikenLI on 13-11-21. // Copyrig ...
-
IOS 作业项目(4)步步完成 画图 程序(上)
先上流程图
-
IOS 作业项目(2) 画图(保存,撤销,笔粗细设定功能)
先上效果图
-
IOS 作业项目 TableView两个section中cell置顶功能实现
点击cell会置顶,其他的下移
-
IOS 作业项目(3) 霓虹灯效果
先上效果图 #import "CHViewController.h"@interface CHViewController (){ int i; int j;}@pro ...
-
IOS 作业项目(1) 关灯游戏 (百行代码搞定)
1,准备工作,既然要开关灯,就需要确定灯的灯的颜色状态 首先想到的是扩展UIColor
-
iOS:项目中疑难Crash问题集锦
项目中疑难Crash问题集锦 iOS App运行中遇到Crash的情况相信大家都遇到过,开发和者测试中遇到了可能很方便的办法就是直接拿着设备连接一下,然后使用Xcode自带的工具就可以解析出Crash ...
随机推荐
-
SQL Server 2008 r2 输入SQL语句不能自动提示的解决办法
先利用“配置工具-SQL Server 配置管理器”关闭所有MSSQLSERVER服务,利用SQL Server Installation Center,进入Maintenance,选择Repair, ...
-
session 安全相关
有一点我们必须承认,大多数web应用程序都离不开session的使用.这篇文章将会结合php以及http协议来分析如何建立一个安全的会话管理机制.我们先简单的了解一些http的知识,从而理解该协议的无 ...
-
Java Servlet Filter(转)
做web开发的人对于Filter应该不会陌生,一直在很简单的使用,但是一直没有系统的总结一下,随着年纪的慢慢长大,喜欢总结一些事情,下面说说我对Filter的理解,官方给出的Filter的定义是在请求 ...
-
九度OJ 1408 吃豆机器人 -- 动态规划
题目地址:http://ac.jobdu.com/problem.php?pid=1408 题目描述: 淘宝公司内部有许多新鲜的小玩具,例如淘宝智能机器人.小时候,大家都玩过那个吃豆子的游戏吧,这机器 ...
-
关于dl dt dd 文字过长换行在移动端显示对齐的探讨总结
关于dl dt dd 文字过长换行在移动端显示对齐的探讨总结 <dl> <dt>抵押房产:</dt> <dd>1.北京市大兴区兴华大街丽园小区3单大兴 ...
-
C#List源码
List // C# 源码 public class List<T> : IList<T>, System.Collections.IList, IReadOnlyList&l ...
-
zookeeper在Dubbo中扮演了一个什么角色
作者:guxiangfly链接:https://www.zhihu.com/question/25070185/answer/188238271来源:知乎著作权归作者所有.商业转载请联系作者获得授权, ...
-
C#中Main函数为什么要static
假设没有static关键字,那意味着需要用生成一个实例后才可以调用这个Main方法,而Main方法是程序入口点,你没有进入Main方法,自然无法生成一个实例,既然没有实例,那就无法调用Main函数,岂 ...
-
创建 Android 项目
创建 Android 项目 上一页下一页 您也应该阅读 项目概览 本课向您介绍如何使用 Android Studio 创建新的 Android 项目并介绍该项目中的一些文件. 在 Android St ...
-
数字证书相关技术 : Versign信任签章
资料网址: 淘宝网站可信服务 http://www.ert7.com/case/eb/1391.html Versign信任签章 http://www.ert7.com/verisign/ssl/29 ...