iOS 制作一个简单的画板

制作简单画板

作为iOS初学者,在学习完UI的几个简单控件(UILable,UITextField,UIButton)之后,就可以制作一个简单的画图板demo,以下是具体制作流程(在MRC下),如有不足之处,还请各位大神们指教 0.0。

1.搭建界面,主要由UIButton,UITextField组成,底部的按钮是UITextField的一个自定义键盘(inputView)

- (void)viewDidLoad {

[super viewDidLoad];

//创建菜单按钮

UIButton *menuButton = [UIButton buttonWithType:UIButtonTypeSystem];

menuButton.frame = CGRectMake(CGRectGetWidth(self.view.bounds) - 80, 40, 60, 40);

[menuButton setTitle:@"菜单" forState:UIControlStateNormal];

[menuButton addTarget:self action:@selector(handleMenuButtonAction:) forControlEvents:UIControlEventTouchUpInside];

[self.view addSubview:menuButton];

//添加textField,但是不想让他显示出来,所以frame = CGRectZero

UITextField *textField = [[UITextField alloc]initWithFrame:CGRectZero];

textField.tag = 123;

[self.view addSubview:textField];

[textField release];

UIView *inputView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, CGRectGetWidth(self.view.bounds), 60)];

inputView.backgroundColor = [UIColor whiteColor];

textField.inputView = inputView;

[inputView release];

NSArray *titles = @[@"减小",@"增大",@"撤销",@"清空",@"颜色"];

CGFloat width = (CGRectGetWidth(self.view.bounds) - 20 * 6) / 5;

CGFloat height = width;

CGFloat originY = (60 - height) / 2;

CGFloat originX = 20;

for (int i = 0 ; i < titles.count; i ++) {

UIButton *button  =  [UIButton buttonWithType:UIButtonTypeSystem];

button.tag = 100 + i;

button.frame = CGRectMake(originX + (width + originX) * i , originY, width, height);

[button setTitle:titles[i] forState:UIControlStateNormal];

button.backgroundColor = [UIColor colorWithRed:arc4random()%256/255.0 green:arc4random()%256/255.0  blue:arc4random()%256/255.0  alpha:0.6];

//将标题的颜色改成白色。

[button setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];

//设置按钮的角半径,为按钮宽带的一半

button.layer.cornerRadius = width / 4.0;

button.layer.masksToBounds = YES;//按指定的半径裁减视图。

[button addTarget:self action:@selector(handleButtonAction:) forControlEvents:UIControlEventTouchUpInside];

[inputView addSubview:button];

}

}

// 以下是菜单按钮的响应方法。

- (void)handleMenuButtonAction:(UIButton *)sender{

//获取textField

UITextField *textField = (UITextField *)[self.view viewWithTag:123];

//判断如果textField当前是第一响应者,则撤销其第一响应者权限,否则让其成为第一响应者。

if (textField.isFirstResponder) {

[textField resignFirstResponder];

}else{

[textField becomeFirstResponder];//成为第一响应者。

}

}

2.创建一个继承NSObject的类LineModel,用于记录线条。

#import <Foundation/Foundation.h>

#import <UIKit/UIKit.h>

//用于记录线条的三元素(轨迹path 颜色color 宽度width)

@interface LineModel : NSObject

@property (nonatomic, retain) UIBezierPath *path;//使用贝塞尔曲线纪录触摸轨迹。

@property (nonatomic, retain) UIColor *color;//线条颜色

@property (nonatomic, assign) CGFloat width;//线条宽度

@end

#import "LineModel.h"

@implementation LineModel

-(void)dealloc{

[_color release];

[_path release];

[super dealloc];

}

@end

3.创建一个继承UI View的子类PaintView,将上面的LineModel,具体实现画图板。

@interface PaintView : UIView

@property (nonatomic, retain) NSMutableArray *allLines;//用于保存画板上的所有线条对象。

@property (nonatomic, retain) UIColor *lineColor;//当前的线条颜色。

@property (nonatomic, assign) CGFloat lineWidth;//当前线条的宽

- (void)undoLastDrawing;//撤销上次绘制

- (void)allClean;//清空画板。

@end

#import "PaintView.h"

#import "LineModel.h"

@implementation PaintView

-(void)dealloc{

[_allLines release];

[_lineColor release];

[super dealloc];

}

-(NSMutableArray *)allLines{

if (!_allLines) {

self.allLines = [NSMutableArray array];

}

return _allLines;

}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{

UITouch *aTouch = touches.anyObject;

CGPoint startPoint = [aTouch locationInView:self.superview];

//创建贝塞尔曲线对象,并设置曲线的起始点。

UIBezierPath *bezierPath = [UIBezierPath bezierPath];

//设置起始点。

[bezierPath moveToPoint:startPoint];

//创建线条模型对象,并保存当前线条的三个数据

LineModel *line = [[[LineModel alloc]init]autorelease];

line.path = bezierPath;

line.color = self.lineColor;

line.width = self.lineWidth;

//添加到数组中等待使用

[self.allLines addObject:line];

}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{

UITouch *aTouch = touches.anyObject;

CGPoint cuttentPoint  = [aTouch locationInView:self.superview];

//获取对应的线条模型(在触摸移动的过程中,数组的最后一个对象对应当前正在绘制的曲线)

LineModel *aLine = self.allLines.lastObject;

//在触摸轨迹上添加点。

[aLine.path addLineToPoint:cuttentPoint];

[self setNeedsDisplay];//调用此方法是通知视图,绘制界面,一旦调用此方法,系统就会自动调用drawRect:方法来绘制界面。

}

- (void)drawRect:(CGRect)rect{

for (LineModel *aLine  in  self.allLines) {

//设置填充颜色

[aLine.color setStroke];

//设置绘制时的线条宽度

[aLine.path setLineWidth:aLine.width];

//开始绘制曲线

[aLine.path stroke];

}

}

- (void)undoLastDrawing{

[self.allLines removeLastObject];

[self setNeedsDisplay];//移除数组中的最后一条曲线对象,并重绘界面。

}

- (void)allClean{

[self.allLines removeAllObjects];

[self setNeedsDisplay];//清除所有曲线。

}

@end

4.将PaintView引入视图控制器中,实现按钮的方法调用。

///重写loadView将PaintView作为视图控制器的视图

- (void)loadView{

PaintView *paintView  = [[PaintView alloc]initWithFrame:[[UIScreen mainScreen]bounds]];

paintView.backgroundColor = [UIColor whiteColor];

self.view = paintView;

//设置默认的宽度和颜色。

paintView.lineWidth = 10;

paintView.lineColor = [UIColor blackColor];

[paintView release];

}

////每个按钮的实现方法。

- (void)handleButtonAction:(UIButton *)sender{

PaintView *paintView = (PaintView *)self.view;

switch (sender.tag) {

case 100:

if (paintView.lineWidth > 2) {

paintView.lineWidth -= 1;

}

break;

case 101:{

paintView.lineWidth += 1;

break;

}

case 102:{

[paintView undoLastDrawing];

break;

}

case 103:{

[paintView allClean];

break;

}

case 104:{

sender.backgroundColor = [UIColor colorWithRed:arc4random() % 256 / 255.0 green:arc4random() % 256 / 255.0  blue:arc4random() % 256 / 255.0  alpha:1];

//设置画笔颜色

paintView.lineColor = sender.backgroundColor;

break;

}

default:

break;

}

}

这样一个简单的涂鸦版就制作成了,里面肯定还有许多不足之处,小博第一次写博,刚接触经验不足,还请各位给点建议,我会继续改进。谢谢。

时间: 2024-10-23 01:08:57

iOS 制作一个简单的画板的相关文章

Android 多媒体开发学习之制作一个简单的画板

一个简单的画板,可以绘制,可以选择颜色,可以保存. 当然了这种工具一般常用的通讯软件都是会有的,比如QQ, 飞秋等 其中我们必须监听手指的触摸事件,手指的触摸事件就分为3种: 按下,抬起,移动. 通常我们只需要关系按下的时候,然后就是整个手指滑动的过程.然后将手指滑动的过程绘制为不同的直线.当然也可以设置绘制的颜色,绘制直线的宽度等. public class MainActivity extends Activity { private int TouchX; private int Touc

在iOS中实现一个简单的画板App

在这个随笔中,我们要为iPhone实现一个简单的画板App,类似于手写输入中写字的面板.但是我们的画板支持画笔颜色的选择. 首先需要指出的是,这个demo中使用QuarzCore进行绘画,而不是OpenGL.这两个都可以实现类似的功能,区别是OpenGL更快,但是QuarzCore更简单. 第一步,新建Xcode项目,项目名称就叫SimplePaint. 第二步,添加QuarzCore.framework到项目中. 第三步,创建一个新类,类名叫Line.它代表在iPhone的屏幕上绘画时候的线.

制作一个简单的文本框输入的网页

题目:制作一个简单的网页(包含一个文本框.一个按钮),在页面上输出用户在文本框输入的内容,要求用JavaScript获取文本框内容. 一.首先利用html在网页上制作表单,代码如下: **onclick事件:onclick 事件会在对象被点击时发生. 二.利用js获取输入信息,并将其输出: 相关知识: 1.给用户确认消息,真正实现交互,使用语句confirm();给用户提示信息,实现单向通信,使用语句alert(). 三.运行结果: 1.用浏览器打开结果如下: 2.输入文本框内容,点击[提交]:

IOS中一个简单的粒子效果实现

1.效果图展示 2.实现思路 1> 首先要实现上面的效果,第一步要处理的就是一个简单的画板,在View上面用鼠标滑动的时候画出线条,这个功能可使用UIBezierPath实现 2> 关于粒子效果的实现,可以创建一个CALayer,然后用CAReplicatorLayer进行复制layer,从而达到粒子效果 3.代码实现 DrawView类的封装与编写 // // DrawView.m // 06-粒子效果 // // Created by xiaomage on 15/6/24. // Cop

c# 自己制作一个简单的项目倒计时器

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace date { public partial class Form1 : Form { public Form1() { InitializeCompo

如何使用AEditor制作一个简单的H5交互页demo

转载自:http://www.alloyteam.com/2015/06/h5-jiao-hu-ye-bian-ji-qi-aeditor-jie-shao/ 本教程演示如何使用AEditor制作一个简单的H5交互页demo: 交互页demo地址: 点击打开H5交互页demo AEditor访问地址: http://aeditor.alloyteam.com Step1:设置页面背景颜色 首先我们设置页面的背景颜色,右击舞台点击“设置背景”: 然后在背景颜色中填上色值rgb(38, 61, 10

制作一个简单的用户界面

制作一个简单的用户界面 这节课里面,我们来开发一个XML布局文件,这个布局文件里面会包含一个text field,文本输入框,和一个按钮button.下一节课里面,会教大家怎么在按下一个按钮的时候,跳转到另一个Activity. 这里先简单解释一下Android界面的构成.AndroidApp的界面是使用View和ViewGroup构建起来的.View通常就是我们常见的UI小部件,比如按钮Button.文本控件TextView等:而ViewGroup是一个View的容器,它可以限制这个容器里面的

【FLEX&amp;YACC】第二天制作一个简单计算器

首先写词法分析器: 词法分析器要返回记号: "+" 返回ADD "-" 返回SUB "*" 返回MUL "/" 返回DIV 输入的实数全部被当作double类型处理 换行符返回CR calc.l: %{#include <stdio.h>#include "y.tab.h"int yywrap(void){ /*免链接库文件*/    return 1;}%}%%[ \t]    { ;}&qu

实例学习SSIS(一)--制作一个简单的ETL包

原文:实例学习SSIS(一)--制作一个简单的ETL包 导读: 实例学习SSIS(一)--制作一个简单的ETL包 实例学习SSIS(二)--使用迭代 实例学习SSIS(三)--使用包配置 实例学习SSIS(四)--使用日志记录和错误流重定向 实例学习SSIS(五)--理论介绍SSIS 参考内容:SQLServer2005的帮助文档. ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.zh-CHS/sqltut9/html/d6d5bb1f-4cb1-4605-9cd6-f60