IOS开发基础之画板案例软件的开发

值此元宵佳节,我依然在学习IOS,几天没有更新博客了。今天更新了一下。
源码在我的主页里面。
info.plist里面加入这样的代码,防止截图的时候有问题

<key>NSPhotoLibraryAddUsageDescription</key>
<string>save</string>

主要源代码

//
//  LJView.h
//  画板
//
//  Created by 鲁军 on 2021/2/24.
//#import <UIKit/UIKit.h>NS_ASSUME_NONNULL_BEGIN@interface LJView : UIView
@property(nonatomic,assign)CGFloat lineWidth;@property(nonatomic,strong)UIColor *lineColor;
- (void)clear;- (void)back;- (void)eraser;
@endNS_ASSUME_NONNULL_END
//
//  LJView.m
//  画板
//
//  Created by 鲁军 on 2021/2/24.
//#import "LJView.h"
#import "LJBezierPath.h"@interface LJView ()//@property(nonatomic,strong) LJBezierPath *path;
@property(nonatomic,strong)NSMutableArray *paths ;
@end@implementation LJView//- (LJBezierPath *)path{//    if(!_path){//        _path = [LJBezierPath bezierPath];
//    }
//    return _path;
//}- (NSMutableArray *)paths{if(!_paths){_paths= [NSMutableArray array];}return _paths;
}- (void)clear{[self.paths removeAllObjects];[self setNeedsDisplay];
}- (void)back{[self.paths removeLastObject];[self setNeedsDisplay];
}//橡皮
- (void)eraser{self.lineColor = self.backgroundColor;}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{LJBezierPath *path = [LJBezierPath bezierPath];//起点UITouch *t =touches.anyObject;CGPoint p = [t locationInView:t.view];// [self.path moveToPoint:p];[path moveToPoint:p];[path setLineWidth:self.lineWidth];[path setLineColor1:self.lineColor];[self.paths addObject:path];}- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{// LJBezierPath *path = [LJBezierPath bezierPath];//起点UITouch *t =touches.anyObject;CGPoint p = [t locationInView:t.view];
//    [self.path addLineToPoint:p];[[self.paths lastObject] addLineToPoint:p];[self setNeedsDisplay];}
- (void)drawRect:(CGRect)rect{//    [self.path setLineWidth:self.lineWidth];//    [self.path stroke];// 渲染for(LJBezierPath *path in self.paths ){[path setLineJoinStyle:kCGLineJoinRound];[path setLineCapStyle:kCGLineCapRound];//  [self.lineColor set];[path.lineColor1 set];[path stroke];}
}@end
//
//  LJBezierPath.h
//  画板
//
//  Created by 鲁军 on 2021/2/26.
//#import <UIKit/UIKit.h>NS_ASSUME_NONNULL_BEGIN@interface LJBezierPath : UIBezierPath@property(nonatomic,strong)UIColor *lineColor1;@endNS_ASSUME_NONNULL_END
//
//  LJBezierPath.m
//  画板
//
//  Created by 鲁军 on 2021/2/26.
//#import "LJBezierPath.h"@implementation LJBezierPath@end
//
//  ViewController.m
//  画板
//
//  Created by 鲁军 on 2021/2/24.
//#import "ViewController.h"
#import "LJView.h"@interface ViewController ()
@property (weak, nonatomic) IBOutlet LJView *ljView;
@property (weak, nonatomic) IBOutlet UISlider *lineWidthProgress;
@property (weak, nonatomic) IBOutlet UIButton *firstBtn;@end@implementation ViewController- (IBAction)clear:(id)sender {[self.ljView clear];
}- (IBAction)back:(id)sender {[self.ljView back];
}- (IBAction)eraser:(id)sender {[self.ljView eraser];
}- (IBAction)save:(id)sender {//1开启图片类型的上下文UIGraphicsBeginImageContextWithOptions(self.ljView.bounds.size, NO, 0);//4 获取当前上下文CGContextRef ctx = UIGraphicsGetCurrentContext();//3 截图[self.ljView.layer renderInContext:ctx];//5取图片UIImage *image = UIGraphicsGetImageFromCurrentImageContext();//2.关闭上下文UIGraphicsEndImageContext();//6.保存图片UIImageWriteToSavedPhotosAlbum(image, NULL, NULL, NULL);}
- (IBAction)lineWidthChange:(UISlider *)sender {self.ljView.lineWidth = sender.value;}
- (IBAction)lineColorChange:(UIButton *)sender {self.ljView.lineColor = sender.backgroundColor;}- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view.self.ljView.lineWidth = self.lineWidthProgress.value;[self lineColorChange:self.firstBtn];}@end

IOS开发基础之画板案例软件的开发相关推荐

  1. 【web前端特效源码】使用 HTMLCSSJavaScript实现各种跳跃浮动慢跑翻转旋转坠落的魔幻文字动画效果~太上头了~/动画效果|前端开发|IT软件开发基础入门教程|网页制作|网站开发定制

    b站视频演示效果: [web前端特效源码]使用 HTML&CSS&JavaScript实现各种跳跃浮动慢跑翻转旋转坠落的魔幻文字动画效果~太上头了~/动画效果|前端开发|IT软件开 效 ...

  2. 基于AUTOSAR开发工具链的AUTOSAR软件实战开发---基于工具链AUTOSAR架构的开发流程

    前一节简单介绍了CP AUTOSAR及它的分层结构,本节介绍基于工具链AUTOSAR架构的开发流程,对于多数使用AUTOSAR架构开发汽车电子软件的工程师而言,主要关注的还是如何将AUTOSAR架构应 ...

  3. 基于AUTOSAR开发工具链的AUTOSAR软件实战开发-软件架构设计(二)

    软件功能模块划分 按照软件功能需求和功能安全等级分割软件功能组件,一般ECU通用功能为例,模块划分先按照功能划分,前面我们提到,对于基于标准AUTOSAR开发,当前无论是整车厂还是供应商,其底层开发均 ...

  4. 基于AUTOSAR开发工具链的AUTOSAR软件实战开发

    系列文章目录 前言 AUTOSAR架构概述 基于工具链AUTOSAR架构的开发流程 软件架构设计过程 ARXML开发 基于ARXML的MATLAB/Simulink模型代码开发 前言 AUTOSAR架 ...

  5. Android应用开发基础 余永佳,Android应用开发基础(基于Android4.2、任务驱动式)教学课件作者余永佳赵佩华习题课件.doc...

    任务一 Android开发环境的搭建 第一部分 知识回顾与思考 1.Android的四层架构分别包括哪几层?分别起到什么作用? ?答:Linux内核层(Linux Kernel):基于Linux内核, ...

  6. 基于AUTOSAR开发工具链的AUTOSAR软件实战开发-软件架构设计(一)

    按照需求划分软件功能模块和需求映射 前面介绍了基于工具链的开发流程,本节开始将针对开发流程中的各个环节展开详细介绍,首先从软件架构开始介绍,软件架构的前置输入是软件需求,当软件需求下发后,要制定相应的 ...

  7. linux下软件多语言开发,Qt,多语言软件,开发流程【总结】

    环境 系统版本:ubuntu Qt版本:Qt 5.12 开始 步骤1:先编写一段Qt代码 如下,这个意思就是创建一个Qlabel.其内容 要写成 tr("hello111"),tr ...

  8. c# 无法加载oraops.dll_Robotstudio软件二次开发:基于C#语言的Smart组件开发基础

    Robotstudio软件除了支持Add-Ins插件的二次开发以外,还支持Smart组件的二次开发.开发语言同样是基于.NET框架的C#语言或VB语言.Smart组件是Robotstudio软件中实现 ...

  9. c#获取autocad安装位置_Robotstudio软件二次开发:基于C#语言的Smart组件开发基础

    Robotstudio软件除了支持Add-Ins插件的二次开发以外,还支持Smart组件的二次开发. 开发语言同样是基于 .NET框架的C#语言或VB语言. Smart组件是Robotstudio软件 ...

最新文章

  1. C# 8.0的三个令人兴奋的新特性
  2. 哥伦比亚大学AI实验室主任Hod Lipson:阻碍无人驾驶技术发展的7个误区
  3. Scrum立会报告+燃尽图(十月二十一日总第十二次)
  4. 请编程实现:产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复(百度了一下,get一种高性能算法,非递归)...
  5. 关键字restrict简介
  6. 2020 年开发者生态报告:Python超越Java,Go、Kotlin强势崛起
  7. 流密码:lfsr(线性反馈移位寄存器)
  8. 高性能服务框架-Dubbo实战教程,看这一篇就够了
  9. 图计算:社区发现算法
  10. 自定义函数求两个整数的绝对差值及排序
  11. linux工作札记 - 查看发行版本命令
  12. Windows 7(Win7)下Visual Studio 2012(VS2012)编译jrtplib与MinGW编译jrtplib
  13. Proximal Policy Optimization (PPO) 算法理解:从策略梯度开始
  14. 无线wifi丢包的解决办法
  15. 手机里隐藏了一个无限空间,可以永久保存照片视频,好多人不知道
  16. Android设备硬件序列号(SN、串号)分析
  17. 桌面每日一句--桌面翻译工具(有道翻译,微软翻译,Google翻译)
  18. Netty导学之NIO,Channel、Buffer、Selector详解
  19. 企业级无线渗透与无线数据浅析
  20. Boost.Interprocess.file_mapping内存映射文件

热门文章

  1. serverless搭建html,基于ServerLess的极简网页计数器:源码分析与实践
  2. 李炎恢+php+下载,李炎恢thinkphp视频教程
  3. python批量复制文件问题,python 批量复制不同目录下的文件
  4. javaweb网关_Java网关服务-AIO(三)
  5. python程序调试logging_python-logging模块的简单使用
  6. python3.6 安装opencv_MacOS的Python3.6下安装OpenCV3.2.0
  7. 计算机硬盘工作时应该避免什么,什么是电脑硬盘?有何作用?如何保养它?
  8. julia const报错_我爱Julia之入门-004
  9. char类型是多少 mat_opencv之Mat数据类型
  10. java jpeg压缩解码_图片压缩(iOS)