zoukankan      html  css  js  c++  java
  • 手写板制作----UITouch

    先写一下UITouch的功能和用法:

    UITouch是view本身存在的协议。只需实现它的具体方法就行了。还有就是UIScrollView中没有UITouch这个事件,要想在UIScrollView中实现这个触摸事件,方法就是重写UIScrollView:

    //手指接触到屏幕时触发

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

    //手指在屏幕上移动的时候触发

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

    //一次接触完成 手指离开屏幕的时候触发

     -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;

    //突然强制接触终止时触发(比如:不小心按到锁屏键,或者突然来电话了)

     -(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;

    有了这些监听手指在屏幕上的位置的方法,就可以得到手指在屏幕上某个view中的位置

    -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
    {
       UITouch *touch = [touches anyObject];
       CGPoint point = [touch  locationInView:self];//self 指一个view  现在是自动一个view
    }

    在手指接触屏幕的时候就创建好用于装接下来记录点的容器

    -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
    {
        if (!m_pointArr)
        {
             m_pointArr = [NSMutableArray arrayWithCapacity:50];
        }
        NSMutableArray *mArr = [NSMutableArray arrayWithCapacity:100];
        [m_pointArr addObject:mArr];
    }

    (每接触一次就创建一个动态数组用于装接下来手指划过的点)

    在手指在屏幕上移动的时候将手指经过的点全部记录下来

    -(void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
    {
        UITouch *touch = [touches anyObject];
        CGPoint point = [touch  locationInView:self];
        PointObj *pObj = [[PointObj alloc]initWithX:point.x Y:point.y];
        NSMutableArray *currentArr = [m_pointArr lastObject];
        [currentArr addObject:pObj];
        [self setNeedsDisplay];//这个方法的调用和让view自动调用他的 - (void)drawRect:(CGRect)rect
    }      

       (这里的PointObj类  就是一个点类  生成一个点对象便于放在数组中/* 蛋疼得很这个 数组中只让方对象!!*/)

    #import <Foundation/Foundation.h>
    
    @interface PointObj : NSObject
    @property(nonatomic,assign)float x,y;
    -(instancetype)initWithX:(float)P_X Y:(float)P_Y;
    @end
    #import "PointObj.h"
    
    @implementation PointObj
    -(instancetype)initWithX:(float)P_X Y:(float)P_Y
    {
        if (self = [super init])
        {
            _x = P_X;
            _y = P_Y;
        }
        return self;
    }
    @end

    记录的点有了,下面就是将记录下来的点绘成图形啦  这里要用到quarz2d绘图那里的知识!!

    - (void)drawRect:(CGRect)rect
    {
        if (m_pointArr && m_pointArr.count > 0)
        {
            for (NSMutableArray *item in m_pointArr)
            {
                if (item.count > 2)
                {
                    PointObj *firstObj = [item firstObject];
                    CGContextRef ctf = UIGraphicsGetCurrentContext();
                    CGContextMoveToPoint(ctf, firstObj.x, firstObj.y);
                    for (int i = 1; i < item.count; i++)
                    {
                        PointObj *oneObj = [item objectAtIndex:i];
                        CGContextAddLineToPoint(ctf, oneObj.x, oneObj.y);
                    }
                    
                    CGContextSetFillColorWithColor(ctf, [UIColor blackColor].CGColor);
                    CGContextSetLineWidth(ctf, 5.0); //线条的宽度
                    //将会出的线渲染出来
                    CGContextStrokePath(ctf);
    
                }
            }
        }
    }

    到此为止  手写的功能已经实现啦!!

    绘制的图形有了之后只需要通过截屏  或者区域截取又或者对一个View截取  得到一个Image的对象  

    下面介绍一些截屏的方法

    1.直接截取一个view中的一部分区域 (如果直接传入view.bounds那就是直接截取这个view)

    - (UIImage *)screenshotWithRect:(CGRect)rect;
    {
        UIGraphicsBeginImageContextWithOptions(rect.size, NO, [UIScreen mainScreen].scale);
        
        CGContextRef context = UIGraphicsGetCurrentContext();
        if (context == NULL)
        {
            return nil;
        }
        CGContextSaveGState(context);
        CGContextTranslateCTM(context, -rect.origin.x, -rect.origin.y);
        if( [self respondsToSelector:@selector(drawViewHierarchyInRect:afterScreenUpdates:)])
        {
            [self drawViewHierarchyInRect:self.bounds afterScreenUpdates:NO];
        }
        else
        {
            [self.layer renderInContext:context];
        }
        CGContextRestoreGState(context);
        UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        
        return image;
    }

    2.对手机屏幕截屏

    - (UIImage *)getImageWithFullScreenshot
    {
        // Source (Under MIT License): https://github.com/shinydevelopment/SDScreenshotCapture/blob/master/SDScreenshotCapture/SDScreenshotCapture.m#L35
        
        BOOL ignoreOrientation = [[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0?YES:NO;
        UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
        
        CGSize imageSize = CGSizeZero;
        if (UIInterfaceOrientationIsPortrait(orientation) || ignoreOrientation)
            imageSize = [UIScreen mainScreen].bounds.size;
        else
            imageSize = CGSizeMake([UIScreen mainScreen].bounds.size.height, [UIScreen mainScreen].bounds.size.width);
        
        UIGraphicsBeginImageContextWithOptions(imageSize, NO, [UIScreen mainScreen].scale);
        CGContextRef context = UIGraphicsGetCurrentContext();
        
        for (UIWindow *window in [[UIApplication sharedApplication] windows])
        {
            CGContextSaveGState(context);
            CGContextTranslateCTM(context, window.center.x, window.center.y);
            CGContextConcatCTM(context, window.transform);
            CGContextTranslateCTM(context, -window.bounds.size.width * window.layer.anchorPoint.x, -window.bounds.size.height * window.layer.anchorPoint.y);
            
            // Correct for the screen orientation
            if(!ignoreOrientation)
            {
                if(orientation == UIInterfaceOrientationLandscapeLeft)
                {
                    CGContextRotateCTM(context, (CGFloat)M_PI_2);
                    CGContextTranslateCTM(context, 0, -imageSize.width);
                }
                else if(orientation == UIInterfaceOrientationLandscapeRight)
                {
                    CGContextRotateCTM(context, (CGFloat)-M_PI_2);
                    CGContextTranslateCTM(context, -imageSize.height, 0);
                }
                else if(orientation == UIInterfaceOrientationPortraitUpsideDown)
                {
                    CGContextRotateCTM(context, (CGFloat)M_PI);
                    CGContextTranslateCTM(context, -imageSize.width, -imageSize.height);
                }
            }
            
            if([window respondsToSelector:@selector(drawViewHierarchyInRect:afterScreenUpdates:)])
                [window drawViewHierarchyInRect:window.bounds afterScreenUpdates:NO];
            else
                [window.layer renderInContext:UIGraphicsGetCurrentContext()];
            
            CGContextRestoreGState(context);
        }
        
        UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
        
        UIGraphicsEndImageContext();
        
        return image;
    }

      

    文章到此就结束了,希望对路过的人有所帮助!!!!!

  • 相关阅读:
    Java中只有按值传递,没有按引用传递!(两种参数情况下都是值传递)
    最简单的struts实例介绍
    Spring中bean的五个作用域简介(转载)
    Spring配置文件
    轻松搞定面试中的二叉树题目 (转)
    二叉树
    稳定排序与非稳定排序判别方法
    Yii的缓存机制之动态缓存
    Yii的缓存机制之数据缓存
    Yii的缓存机制之页面缓存
  • 原文地址:https://www.cnblogs.com/Mgs1991/p/5136730.html
Copyright © 2011-2022 走看看