如何使用drawRect更新我的自定义UIView?

时间:2011-05-31 21:40:11

标签: objective-c quartz-graphics drawrect

我正在尝试在学习的同时构建一些iOS应用程序,并且在理解正确的方法时遇到一些麻烦。

我目前所拥有的是一个视图,它是UIView的子类。很明显,我想将它用作绘图表面。它将位于其他东西之上,如描图纸。

用户应该能够点击一个点然后点击另一个点,并且应该在两个点之间绘制一条线。我得到了触摸数据,我有积分,我能够从drawRect内部绘制东西:最初。

问题是我不确定以后如何更新内容。当一切都加载并且drawRect:是calle时,它会画一条线就好了。但是我如何根据用户的操作绘制新内容或更改已经绘制的内容。我知道我需要调用setNeedsDisplay,而不是如何将数据传递到视图来绘制内容。

我已经阅读了一堆教程/示例,他们都停留在“覆盖drawRect:并绘制一些东西......完成!”。如何将数据传递到视图中以告诉它“嘿,重绘这些东西并添加这个新行”。

或者我是否会以错误的方式解决这个问题?

修改 我会尝试更好地解释我的设置。

我有一个VC。在这个VC的视图中,我在底部有一个工具栏。该区域的其余部分由2个视图占据。一个是保存参考图像的图像视图。一个是位于顶部的清晰自定义视图(描图纸)。他们点击工具栏上的一个按钮,打开一个手势识别器。他们点击屏幕,我收集了点击数据,关闭了手势识别器并且HOPEFULLY画了一条线。除了绘图部分,我已经完成了所有工作。

1 个答案:

答案 0 :(得分:4)

你走在正确的轨道上。听起来你需要跟踪积分。

这是一些示例代码。

LineDrawView.h

#import <UIKit/UIKit.h>
@interface LineDrawView : UIView 
{
    NSMutableArray *lines;
    CGPoint pointA, pointB;
    BOOL activeLine;
}
@end

LineDrawView.m

#import "LineDrawView.h"
@implementation LineDrawView
- (id)initWithFrame:(CGRect)frame 
{
    self = [super initWithFrame:frame];
    if (self) 
    {
        self.backgroundColor = [UIColor blackColor];
        lines = [[NSMutableArray alloc] init];
    }
    return self;
}
- (void)dealloc 
{
    [lines release];
    [super dealloc];
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [super touchesBegan:touches withEvent:event];
    CGPoint point = [[touches anyObject] locationInView:self];
    if ([lines count] == 0) pointA = point;
    else pointB = point;
    activeLine = YES;
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    [super touchesMoved:touches withEvent:event];
    pointB = [[touches anyObject] locationInView:self];
    [self setNeedsDisplay];
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    [super touchesEnded:touches withEvent:event];
    pointB = [[touches anyObject] locationInView:self];
    [lines addObject:[NSArray arrayWithObjects:[NSValue valueWithCGPoint:pointA], [NSValue valueWithCGPoint:pointB], nil]];
    pointA = pointB;
    pointB = CGPointZero;
    activeLine = NO;
    [self setNeedsDisplay];
}

- (void)drawRect:(CGRect)rect
{
    CGContextRef c = UIGraphicsGetCurrentContext();
    CGContextSetLineWidth(c, 2);
    CGContextSetLineCap(c, kCGLineCapRound);
    CGContextSetLineJoin(c, kCGLineJoinRound);
    CGContextSetStrokeColorWithColor(c, [UIColor grayColor].CGColor);
    for (NSArray *line in lines)
    {
        CGPoint points[2] = { [[line objectAtIndex:0] CGPointValue], [[line objectAtIndex:1] CGPointValue] };
        CGContextAddLines(c, points, 2);
    }
    CGContextStrokePath(c);
    if (activeLine)
    {
        CGContextSetStrokeColorWithColor(c, [UIColor whiteColor].CGColor);
        CGPoint points2[2] = { pointA, pointB };
        CGContextAddLines(c, points2, 2);
        CGContextStrokePath(c);
    }
}
@end