涂鸦-每次调setNeedsDisplay以后就会重新调用一次drawRect方法,每次调drawRect方法就会把之前画好的东西删掉

//
//  WJView.m
//  zwj涂鸦
//
//  Created by zwj on 14-9-9.
//  Copyright (c) 2014年 zwj. All rights reserved.
//

#import "WJView.h"

@interface WJView()
@property(nonatomic,strong) NSMutableArray *allPaths;
@end

@implementation WJView

- (void)backto{
    [self.allPaths removeLastObject];
    [self setNeedsDisplay];
}
- (void)clearScreen{
    [self.allPaths removeAllObjects];
    [self setNeedsDisplay];
}

-(NSMutableArray *)allPaths{
    if (_allPaths == nil) {
        _allPaths = [NSMutableArray array];
    }
    return _allPaths;
}

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
    }
    return self;
}

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    UITouch *touch = [touches anyObject];
    CGPoint currentPoint = [touch locationInView:touch.view];
    NSMutableArray *aryCurrentP = [NSMutableArray array];
    [aryCurrentP addObject:[NSValue valueWithCGPoint:currentPoint]];
    [self.allPaths addObject:aryCurrentP];
    [self setNeedsDisplay];
}

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
    UITouch *touch = [touches anyObject];
    CGPoint currentP = [touch locationInView:touch.view];
    NSMutableArray *ary = [self.allPaths lastObject];
    [ary addObject:[NSValue valueWithCGPoint:currentP]];
    [self setNeedsDisplay];
}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
    UITouch *touch = [touches anyObject];
    CGPoint currentP = [touch locationInView:touch.view];
    NSMutableArray *ary = [self.allPaths lastObject];
    [ary addObject:[NSValue valueWithCGPoint:currentP]];
    [self setNeedsDisplay];
}

/**
 * 绘制图形
 */
-(void)drawRect:(CGRect)rect{
    CGContextRef ref = UIGraphicsGetCurrentContext();
    for (NSMutableArray *ary in self.allPaths) {
        for (int i = 0; i < ary.count; i++) {
            if (i == 0) {
                CGPoint firstPoint = [ary[i] CGPointValue];
                CGContextMoveToPoint(ref, firstPoint.x, firstPoint.y);
            } else {
                CGPoint movePoint = [ary[i] CGPointValue];
                CGContextAddLineToPoint(ref, movePoint.x, movePoint.y);
            }
        }
    }
    CGContextSetLineJoin(ref, kCGLineJoinRound);
    CGContextSetLineWidth(ref, 5);
    CGContextStrokePath(ref);
}

@end

时间: 2024-10-13 22:33:53

涂鸦-每次调setNeedsDisplay以后就会重新调用一次drawRect方法,每次调drawRect方法就会把之前画好的东西删掉的相关文章

编写一个程序, 四个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1,要求使用内部类

/**  * @author laishengfeng  * @2014-8-27  * @TODO 编写一个程序,  四个线程,其中两个线程每次对j增加1,  * 另外两个线程对j每次减少1(要求使用内部类线程)  */ public class Test {   public static void main(String[] args) {   MyThread mt = new MyThread();  //MyThread对象   mt.new InnerThread1().start

win7下登陆oracle10g提示:(SP2-1503: 无法初始化Oracle 调用界面;SP2-1503: 无法初始化Oracle 调SP2-0152)

今天刚在自己电脑上装了oracle10g,电脑是win7系统的,电脑自带的系统.装成功后在cmd下输入sqlplus提示:SP2-1503: 无法初始化Oracle 调用界面SP2-1503: 无法初始化Oracle 调SP2-0152.而在PLSQL Developer输入正确的账号和密码后也是出现一个空白提示框,登陆不成功. 解决方法: 在oracle\product\10.2.0\db_2\BIN 目录下  找到  sqlplus.exe   右键属性---兼容性--- 勾选上“ 以管理员

性能测试分析与性能调优诊断--史上最全的服务器性能分析监控调优篇

一个系统或者网站在功能开发完成后一般最终都需要部署到服务器上运行,那么服务器的性能监控和分析就显得非常重要了,选用什么配置的服务器.如何对服务器进行调优.如何从服务器监控中发现程序的性能问题. 如何判断服务器的瓶颈在哪里等 就成为了服务器性能监控和分析时重点需要去解决的问题了. 1     服务器的性能监控和分析 1.1      Linux服务器的性能指标监控和分析 1.1.1       通过vmstat深挖服务器的性能问题 1.1.2       如何通过mpstat 分析服务器的性能指标

关于windows 下每次打开IE 8都弹出欢迎使用Internet Explorer 8 弹窗的关闭方法

今天笔者在安装完windows 操作系统后,发现了一个问题,即每次打开IE 8浏览器,都会弹出一个欢迎界面: 弹窗标题为:设置windows Internet Explorer,具体内容如下图所示: 经过研究发现,最终还是找到关闭弹窗信息的方法,具体步骤如下: 1.运行:gpedit.msc进入组策略管理 2.找到,计算机配置--管理模板--Windows 组件--Internet Explorer,下的[阻止执行首次运行自定义设置] 3.右键编辑,将此项配置成 已启动,选择所需的选项处设置为:

JNI测试-java调用c算法并返回java调用处-1到20阶乘的和

一,java端: 定义native方法, 'public native long factorial(int n);', 该方法用c/c++实现,计算'1到20阶乘的和',参数中'int n'是前n项的阶乘的和(这里是20).返回计算结果,并返回java调用处. 代码为: 1 public class FactorialJava { 2 3 public native long factorial(int n); 4 5 //evaluate the elapse time.and the ex

解决每次打开MyEclipse都弹出有关发送统计信息的弹出窗口的方法

每次打开MyEclispe总是弹出如下窗口, 虽然不是错误和BUG,但是感觉真烦,可如下设置解决. 选中MyEclipse的"Window"-->"Preferences",然后按图中的说明进行操作, ,操作并点击"OK"之后,对话窗口就不会弹出了.

设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1

1 public class Test { 2 3 // 采用 Runnable 接口方式创建的多条线程可以共享实例属性 4 private int i ; 5 6 // 同步增加方法 7 private synchronized void inc(){ 8 i ++; 9 System. out .println(Thread.currentThread().getName()+ "--inc--" + i ); 10 } 11 // 同步减算方法 12 private synchr

设计 4 个线程,其中两个线程每次对 j 增加 1,另外两个线程对 j 每次减少 1。写出程序。

先设计一个类处理加减这一行为: public class ManyThread { private int j = 0; public synchronized void inc(){ j++; System.out.println(Thread.currentThread().getName() + "inc" + j); } public synchronized void dec(){ j--; System.out.println(Thread.currentThread().

web view调h5的方法死活调不到

(WebViewJavascriptBridge注册方法都能调用,只有callhandlename时无论如何也没响应)这个问题真是纠缠我好久了 webview评论区刷新问题终于找到原因了 ,我试着把咨询详情的页面url放在网上的demo里运行  发现是可以运行的,就对比了以下两个demo的区别,有两个区别: 1.如果用的WebViewJavascriptBridge是老版本的话,那么不管第三方是手动拉进去的还是pod进去的 ,都可以用 2.如果用的是最新版本的话,必须是用pod进去的才能调用到c