可修改直线画板

最近涉及到画板,需求是这样

  • 画直线
  • 可以选中直线,选中后进入编辑状态(改变颜色,并且在两端绘制可选中标记)
  • 当直线为可操作状态时,点击两端标记,可以改变端点位置
  • 可以删除线段
  • 可以上下左右移动编辑状态的直线
    下载

画直线

画直线

0001.gif

进入编辑状态,并且可以拖动直线两端

huaban003.gif

1.创建一个PathStyle类,里面保存了贝塞尔路劲的属性,但是我没有保存一个被贝塞尔对象,为什么后面再说

// 线段颜色
@property (nonatomic ,strong) UIColor *color;
// 线宽
@property (nonatomic ,assign) CGFloat width;
// 秒边 或者 充满
@property (nonatomic ,assign) PrintStyle printStyle;
// 画直线
@property (nonatomic ,assign) DrawStyle drawStyle;
// 画笔起点
@property (nonatomic, assign) CGPoint one;
// 画笔终点
@property (nonatomic, assign) CGPoint two;
// 时候隐藏图案
@property (nonatomic, assign) BOOL hiddenCir;

2..保存起点和终点

- (void)touchesMoved:(NSSet<UITouch*>*)touches withEvent:(UIEvent*)event
{
    CGPoint point = [touches.anyObject locationInView:self];
    
    // 当拖动大于8时,我们认为用户是想画线,显示小圆点
    // 绘制第二个点
    // 如果没有选中某个点,就把点复制给第二个点
    if (!_onDraw) {
        
        if (point.x - _currentPoint.x < -8 || point.x - _currentPoint.x > 8) {
            [self.delegate handLine];
            _currentPoint = [touches.anyObject locationInView:self];
            self.currentStyle.hiddenCir = NO;
            self.currentStyle.two = _currentPoint;
        }
    }
    else {// 如果选中某个点,就赋值给某个点
        _currentPoint = [touches.anyObject locationInView:self];
        self.currentStyle.one = _onOne ? _currentPoint : self.currentStyle.one;
        self.currentStyle.two = _onTwo ? _currentPoint : self.currentStyle.two;
    }
    [self setNeedsDisplay];
}

3.画线


- (UIBezierPath*)drawLine
{
    UIBezierPath* path = [UIBezierPath bezierPath];
    [path moveToPoint:self.currentStyle.one];
    [path addLineToPoint:self.currentStyle.two];
    [self.currentStyle.color setStroke];
    [path setLineWidth:self.currentStyle.width];
    return path;
}
//画线,并画出可编辑的圆圈
- (void)drawLinePath
{
    if (self.currentStyle != nil) {
        UIBezierPath* cir1 = [UIBezierPath bezierPathWithArcCenter:self.currentStyle.one
                                                            radius:5
                                                        startAngle:0
                                                          endAngle:2 * M_PI
                                                         clockwise:1];
        
        [cir1 stroke];
        UIBezierPath* cir2 = [UIBezierPath bezierPathWithArcCenter:self.currentStyle.two
                                                            radius:5
                                                        startAngle:0
                                                          endAngle:2 * M_PI
                                                         clockwise:1];
        [cir2 stroke];
        
        [[self drawLine] stroke];

    }
}

实现选中直线

长按直线一秒钟,直线进入编辑状态,可以移动,删除

画板002.gif

添加一个手势到画板上

// 判断是否选中
- (BOOL)jugdeIncludeboundaryWithTouchPoint:(CGPoint)nowPoint{
    // 在非画线下才能选中
    if (!_ishandle) {
        // 遍历路劲
        for (PathStyle *style in self.pathArr) {
            
            CGPoint startCD = style.one;
            CGPoint endCD = style.two;
            // 斜率
            CGFloat k = ((CGFloat)endCD.y - startCD.y) / (endCD.x - startCD.x);
            CGFloat CK = 15;
            CGFloat sina = CK * sqrt(k*k / (k * k + 1));
            // 拿到长按的线与Y轴的交点
            CGFloat Startvalue = nowPoint.y - nowPoint.x * k;
            // 拿到过触摸点与长按的线平行的线与Y轴交点
            CGFloat EndValue = startCD.y - startCD.x * k;
            // 将Y轴交点的坐标差转换为平行线垂直方向距离
            CGFloat chang = (Startvalue - EndValue) * sqrt(1/(k*k +1));
            CGFloat bigInteger = endCD.x  >= startCD.x  ? endCD.x  : startCD.x;
            CGFloat lowInteger = endCD.x  <= startCD.x  ? endCD.x  : startCD.x;
            if (nowPoint.x >= lowInteger - sina && nowPoint.x <= bigInteger + sina) {
                
                // 点击点在范围内
                if (chang <= CK && chang >= -CK) {
                    // 保存编辑的style
                    if (self.currentStyle != nil) {
                        self.currentStyle.color = [UIColor blackColor];
                        [self.pathArr addObject:self.currentStyle];
                    }
                    NSLog(@"选中了");
                    self.selectIndex = 3;
                    self.currentStyle = style;
                    [self.pathArr removeObject:style];
                    // 弹出操作视图
                    [self.delegate handLine];
                    return YES;
                }
            }
            
        }
    }
    
    return NO;

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容