iOS_DrawView_画板01_Swift_Leader林的博客-程序员宅基地

技术标签: ISO  ios开发  ios  swift  

效果:


基本代码:

// DrawingBoard 画板

class DrawingBoard: UIView {
    /// 线宽
    var lineWidth:CGFloat = 5.0
    /// 线条颜色
    var lineColor:UIColor? = nil
    //  存储路径
    lazy var paths:[HBPath] = {return []}()
    
    override init(frame: CGRect) {
        
        super.init(frame: frame)
        
        backgroundColor = UIColor.clear
    }
    
    required init?(coder aDecoder: NSCoder) {
        
        super.init(coder: aDecoder)
        
    }

    override func draw(_ rect: CGRect) {
        
        for line in paths{
            
            line.drawPath()
        }
    }
    
    func getTouches(touches:Set<UITouch>) -> CGPoint {
        return (touches.first?.location(in: self))!
    }
    // 开始画线
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        
        let point = getTouches(touches: touches)
        
        let path = HBPath.path(beginPoint: point, pathWidth: lineWidth, isEraser: isEraser)
        
        path.pathColor = lineColor
        
        paths.append(path)
         
        setNeedsDisplay()
        
    }
    /// 正在画线
    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
        
        let point = getTouches(touches: touches)
        let path = paths.last
        path?.bezierPath?.addLine(to: point)
        setNeedsDisplay()
    }
    /// 结束画线 
    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        touchesMoved(touches, with: event)   
    }
}

// Path 线条


class Path: NSObject {
    
    var bezierPath:UIBezierPath?
    var beginPoint:CGPoint?
    var pathWidth:CGFloat?
    var pathColor:UIColor?
    
    class func path(beginPoint:CGPoint,pathWidth:CGFloat,isEraser:Bool)->HBPath{
        
        let path = HBPath()
        path.beginPoint = beginPoint
        path.pathWidth = pathWidth
        path.isEraser = isEraser
        let bezier = UIBezierPath()
        bezier.lineCapStyle = CGLineCap.round
        bezier.lineJoinStyle = CGLineJoin.round
        bezier.lineWidth = pathWidth
        bezier.move(to: beginPoint)
        path.bezierPath = bezier
        return path
    }
    
    func drawPath()  {
        pathColor?.set()
        bezierPath?.stroke()
    }
}

// 其他功能后续完善!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/hzdg360/article/details/53405110

智能推荐

SLAM导航机器人零基础实战系列:(三)感知与大脑——6.做一个能走路和对话的机器人..._小虎哥哥爱学习的博客-程序员宅基地

SLAM+语音机器人DIY系列:(三)感知与大脑——6.做一个能走路和对话的机器人摘要 在我的想象中机器人首先应该能自由的走来走去,然后应该能流利的与主人对话。朝着这个理想,我准备设计一个能自由行走,并且可以与人语音对话的机器人。实现的关键是让机器人能通过传感器感知周围环境,并通过机器人大脑处理并输出...

redis预减库存 rabbitmq异步下单_小武小武每天练武的博客-程序员宅基地

减缓存 添加队列@ResponseBody @RequestMapping("/{path}/domiaosha") public ResultBean findall(@RequestParam("goodsId") Long goodsId, @PathVariable String path, User user, long addresssId) throws Exception { if (user == null) { return.

Mysql 源码包安装步骤_heavstar的博客-程序员宅基地

mysql 源码安装步骤,记录以备忘源码安装好处,据说速度更快    也不用分32位,64位,也就是说不分平台.mysql 源码安装步骤一。解压tar zxvf mysql-5.1.53.tar.gz 二。建启动用户groupadd mysqluseradd -g mysql mysql三。配置./configure --prefix=/usr/local/mysql -localstatedir=/home/mysql --with-unix-socket-path=/tmp/mysql.sock --e

Spring Boot开发简单网页(员工管理系统)(十三):整合MyBatis+MySQL_TanaStudy的博客-程序员宅基地

整合MyBatis+MySQL1、创建数据库2、导入依赖3、配置mybatis和mysql4、pojo层5、mapper层6、Mapper接口类的.xml映射文件7、service层调用dao层8、controller层调用service层在前面的项目中我们的数据库是在dao层伪造的,并没有连接到数据库现在我们使用MySQL来存储员工信息,并整合MyBatis来操作数据库中的数据。1、创建数据库CREATE DATABASE mydatabase;DROP TABLE IF EXISTS `Em

nyoj 1129 Salvation 模拟_flyawayl的博客-程序员宅基地

思路:每个坐标有四种状态,每个点对应的每种状态只能走一个方向,如果走到一个重复的状态说明根本不能走到终点,否则继续走即可。      坑点:有可能初始坐标四周都是墙壁,如果不判断下可能会陷入是死循环。贴上测试数据:3 3###T####XNAC代码#include #include #include #include #include #inclu

Java之Map对象复制小例子_javaPie的博客-程序员宅基地_java map复制

Java之Map对象复制小例子标签: java2016-05-19 22:34 73人阅读 评论(0) 收藏 举报 分类: 一步一步学Java(23) 版权声明:本文为博主原创文章,未经博主允许不得转载。目录(?)[+]开心一笑提出问题Map对象的简单复制问题????解决问题

随便推点

常见视频编码格式解析_houxiaoni01的博客-程序员宅基地

常见视频编码格式解析常见视频编码格式解析1.MPEG2-TS编码技术1.1.MPEG-TS简介1.2.基本概念及TS流概述1.3.基本流程1.4.TS流传输包(简称TS包)结构分析1.4.1.TS包包头1.4.2.TS包净荷部分1.5.PS节目流2.MPEG-4编码技术2.1.MPEG-4概述2.2.MPEG-4各部分2.3.MPEG-4层次结构3.H...

Python: 使用IP2Location 地理数据库解析IP所在的地理位置_miaow~miaow的博客-程序员宅基地_ip2location python

一、注册&amp;下载数据库目前如果要使用 IP2Location 提供的数据库,需要先注册,然后才让下载,主页位置:免费IP地理位置数据库。完成注册和登录后,可以在下载页面(IP2Location LITE Log InIP2Location LITE log in.https://lite.ip2location.com/database-download)看到下载选项...

性能测试实施(1)之团队组建_不潇洒的鱼的博客-程序员宅基地

随着时间的演变和IT的发展,软件已经成为一门工程,单打独斗早已被淘汰,团队合作才是基础。而性能测试作为大型软件工程中的重要组成部分,我们需要什么样的团队才能更好的性能测试工作的实施,提高软件的性能呢?一次好的性能测试实施离不开团队的良好合作。狭义上讲:性能测试团队仅仅包括性能测试实施团队。广义上说,它包含着所有为软件性能服务的人群。性能测试团队主要由以下三部分组成:1.性能测试实施团队

未明学院:Python竟然还能用在这些行业?_EnlightenAcademy的博客-程序员宅基地

Python自20世纪90年代初诞生以来,凭借着它简单易上手的特征以及应用的广泛性,超越了C、Java、R等其他语言,成为了目前世界上最受欢迎的编程语言。2019年IEEE Spectrum榜单中,Python语言蝉联三年第一。2019年编程语言流行指数(PYPL)排行榜公布的最新榜单中,多年王者Java跌落神坛,Python则登顶第一。在 Goldman Sachs 发布的一份针对全...

Windows上VS使用ADO远程访问PostgreSQL_无比机智的永哥的博客-程序员宅基地_ado postgresql

Windows使用odbc访问PostgreSQL1.下载postgresql相应的odbc驱动安装文件(32位或者64位),msi文件,网址:http://www.postgresql.org/ftp/odbc/versions/msi/ next安装,安装目录为C:\Program Files (x86)\psqlODBC或者C:\Program Files\psqlODBC

从命令行中运行Ant脚本_flexrhythm的博客-程序员宅基地_命令行 执行ant

<br />在用eclipse上的可视化Ant工具时有时会出现编译不了的情况,是不是程序有错误?如果程序有错误这种情况也会发生,为了找出错误我们需要在命令行下编译ant脚本。为了在命令行下编译ant脚本,我们需要把Eclipse上的ant工具路径C:/sw/eclipse/plugins/org.apache.ant_1.7.0.v200803061910/bin;添加进系统变量path上去,这样我们就可以直接在命令行下输入ant脚本而不需要添加路径。在命令行下运行ant脚本时,我们发现有时候在

推荐文章

热门文章

相关标签