如何在 iPhone 应用程序中用手指绘制虚线?

Posted

技术标签:

【中文标题】如何在 iPhone 应用程序中用手指绘制虚线?【英文标题】:How to draw dashed line with finger in iPhone app? 【发布时间】:2013-02-06 12:40:18 【问题描述】:

我需要通过在 iPhone 屏幕上滑动手指在常规间隙处绘制一条带有破折号的线。我为此编写了以下代码,它正在绘制虚线,但间隙不规则,因此看起来不太好。我还提供了显示问题的视频的链接,请帮助!

视频链接: https://dl.dropbox.com/u/56721867/Screen%20Recording%207.mov

   CGPoint mid1 = midPoint__5(previousPoint1, previousPoint2);
   CGPoint mid2 = midPoint__5(currentPoint, previousPoint1);
   CGContextRef context = UIGraphicsGetCurrentContext();
   [self.layer renderInContext:context];
   self.lineColor=[arrObj objectAtIndex:colorTag];
   CGContextMoveToPoint(context, mid1.x, mid1.y);
   CGContextAddQuadCurveToPoint(context, previousPoint1.x, previousPoint1.y, mid2.x, mid2.y);
   CGContextSetLineCap(context, kCGLineCapRound);//use for making circle ,rect or line effect===============
   CGFloat dashArray[] = 2,8,2,8;
   CGContextSetLineDash(context,2,dashArray, 4);
   CGContextSetLineWidth(context, self.lineWidth);
   self.lineColor=[arrObj objectAtIndex:[AppHelper userDefaultsForKey:@"ColorTag"].intValue];//color tag on button click
   CGContextSetStrokeColorWithColor(context, self.lineColor.CGColor);
   CGContextSetAlpha(context, 1.0);
   CGBlendMode blendStyle=isErase?kCGBlendModeClear:kCGBlendModeNormal; 
   CGContextSetBlendMode(context,blendStyle);
   CGContextStrokePath(context);
   [super drawRect:rect];

【问题讨论】:

【参考方案1】:

从代码中看不太清楚,但根据视频和预感,我猜用手指轻扫一次会变成几条线段。这意味着冲刺从头开始多次,在视频中创建效果。您可能需要一个 NSMutableArray 将所有这些 currentPoint 放入其中,然后每次重绘时将它们全部绘制为一条线。

这个问题有更多关于如何用这种方式画线的信息:iPhone Core Graphics thicker dashed line for subview

【讨论】:

我同意这个猜测。在您的 drawRect 中,您应该有一个遍历所有点的循环,并为每个点执行 CGContextAddQuadCurveToPoint,然后是单个 CGContextStrokePath。【参考方案2】:

这是执行您尝试的代码,它使用 Quartz 而不是 CoreGraphics。您可以使用 Quartz 或 CoreGraphics。

//
//  TestView.h
// 
//
//  Created by Syed Arsalan Pervez on 2/18/13.
//  Copyright (c) 2013 SAPLogix. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface TestView : UIView

    NSMutableArray *_points;


@end


//
//  TestView.m
// 
//
//  Created by Syed Arsalan Pervez on 2/18/13.
//  Copyright (c) 2013 SAPLogix. All rights reserved.
//

#import "TestView.h"

@interface UserPoint : NSObject

    BOOL _start;
    BOOL _end;
    CGPoint _point;


@property (assign, nonatomic) BOOL start;
@property (assign, nonatomic) BOOL end;
@property (assign, nonatomic) CGPoint point;

@end

@implementation UserPoint

@end

@implementation TestView

- (id)init

    self = [super init];
    if (self)
    
        _points = [NSMutableArray new];
    
    return self;


- (UserPoint *)addPoint:(CGPoint)point

    UserPoint *_userPoint = [UserPoint new];
    _userPoint.point = point;
    [_points addObject:_userPoint];
    [_userPoint release];

    return [_points lastObject];


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

    UITouch *touch = [touches anyObject];
    UserPoint *_userPoint = [self addPoint:[touch locationInView:self]];
    _userPoint.start = YES;
    _userPoint = nil;


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

    UITouch *touch = [touches anyObject];
    UserPoint *_userPoint = [self addPoint:[touch locationInView:self]];
    _userPoint = nil;

    [self setNeedsDisplay];


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

    UITouch *touch = [touches anyObject];
    UserPoint *_userPoint = [self addPoint:[touch locationInView:self]];
    _userPoint.end = YES;
    _userPoint = nil;

    [self setNeedsDisplay];


- (void)drawRect:(CGRect)rect

    [[UIColor blackColor] setStroke];
    [[UIColor blackColor] setFill];
    UIBezierPath *path = [UIBezierPath bezierPath];
    [path setLineWidth:15];
    CGFloat dash[] = 15,20;
    [path setLineDash:dash count:2 phase:0];
    [path setLineCapStyle:kCGLineCapRound];
    CGPoint lastPoint;
    for (UserPoint *_point in _points)
    
        if (_point.start || _point.end)
            [path moveToPoint:_point.point];
        else
        
            [path addQuadCurveToPoint:_point.point controlPoint:lastPoint];
        
        lastPoint = _point.point;
    
    [path stroke];


- (void)dealloc

    [_points release];

    [super dealloc];


@end

【讨论】:

添加四边形曲线需要复杂的计算,所以请明智地使用并优化它。 感谢您的代码,它正在工作,但我将如何擦除绘图? @Developer 您可以通过多种方式进行操作,这取决于您要如何操作。一种方法是检测触摸并移除相交的点,并将相交的点的前一个点设置为 end = YES,将下一个点设置为 start = YES。 如何找到交叉点?您能否为此提供示例代码?真的很紧急!谢谢!

以上是关于如何在 iPhone 应用程序中用手指绘制虚线?的主要内容,如果未能解决你的问题,请参考以下文章

当手指在 iPhone 上移动时如何在图像顶部画一条线

如何像 iPhone 照片应用程序那样防止自动旋转?

如何擦除 iPhone 中自定义 UIView 上的手指画

iPhone:如何使用 UI 图形 PushContext

如何跟踪触摸时的手指运动以绘制平滑曲线?

如何使用 Core Graphics 绘制箭头?