我正在尝试在学习的同时构建一些iOS应用程序,并且在理解正确的方法时遇到一些麻烦。
我目前所拥有的是一个视图,它是UIView的子类。很明显,我想将它用作绘图表面。它将位于其他东西之上,如描图纸。
用户应该能够点击一个点然后点击另一个点,并且应该在两个点之间绘制一条线。我得到了触摸数据,我有积分,我能够从drawRect内部绘制东西:最初。
问题是我不确定以后如何更新内容。当一切都加载并且drawRect:是calle时,它会画一条线就好了。但是我如何根据用户的操作绘制新内容或更改已经绘制的内容。我知道我需要调用setNeedsDisplay,而不是如何将数据传递到视图来绘制内容。
我已经阅读了一堆教程/示例,他们都停留在“覆盖drawRect:并绘制一些东西......完成!”。如何将数据传递到视图中以告诉它“嘿,重绘这些东西并添加这个新行”。
或者我是否会以错误的方式解决这个问题?
修改 我会尝试更好地解释我的设置。
我有一个VC。在这个VC的视图中,我在底部有一个工具栏。该区域的其余部分由2个视图占据。一个是保存参考图像的图像视图。一个是位于顶部的清晰自定义视图(描图纸)。他们点击工具栏上的一个按钮,打开一个手势识别器。他们点击屏幕,我收集了点击数据,关闭了手势识别器并且HOPEFULLY画了一条线。除了绘图部分,我已经完成了所有工作。
答案 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