-
Notifications
You must be signed in to change notification settings - Fork 0
/
nnInteractionView.m
148 lines (109 loc) · 3.65 KB
/
nnInteractionView.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
//
// nnInteractionView.m
// wardap
//
// Created by Brice Tebbs on 2/12/11.
// Copyright 2011 northNitch Studios Inc. All rights reserved.
//
#import "nnInteractionView.h"
NSInteger TOUCH_LINE_WIDTH = 10; // How wide should the touch line interaction Ghost be
@implementation nnInteractionView
#pragma mark Properties
@synthesize dragPoints;
@synthesize interactDelegate;
#pragma mark Lifetime
- (void)dealloc {
[dragPoints release];
[super dealloc];
}
-(void)clearDragPoints
{
// Nuke the dragPoints if they exist. But keep an array around
// or make a new one if there isn't one yet.
if (dragPoints)
[dragPoints removeAllObjects];
else
dragPoints = [[NSMutableArray alloc] init];
showPoints = YES;
}
#pragma mark Drawing
// Draw the view
// Here we are just going to show the touches as an interaction ghost
- (void)drawRect:(CGRect)rect {
int i;
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSaveGState(context);
// Set style for the interaction ghost
CGContextSetLineWidth(context, TOUCH_LINE_WIDTH);
CGContextSetRGBStrokeColor(context, 1.0, 0.0, 1.0, 1.0);
CGContextSetLineCap(context, kCGLineCapRound);
CGContextSetLineJoin(context, kCGLineJoinRound);
CGPoint point;
if(showPoints)
{
// Just draw out the array of touches
for(i = 0; i < [self.dragPoints count]; i++)
{
point = [[self.dragPoints objectAtIndex: i] CGPointValue];
if (i == 0)
CGContextMoveToPoint(context, point.x, point.y);
else
CGContextAddLineToPoint(context, point.x, point.y);
}
CGContextStrokePath(context);
}
CGContextRestoreGState(context);
}
#pragma mark Utilities
// Create a rect centered on x,y that is w x w in size
CGRect getBloatedRect(CGFloat x, CGFloat y, CGFloat w)
{
return CGRectMake(x - w/2.0, y-w/2.0, w, w);
}
//
// Add the touches to the drawPoint array and keep track of a dirty rect
//
-(void)addToTouchArray:(NSSet *)touches outRect:(CGRect*)dirtyRect
{
CGPoint p;
p = [[touches anyObject] locationInView:self];
// Set dirty as this new point
*dirtyRect = getBloatedRect(p.x, p.y, TOUCH_LINE_WIDTH);
// If we have something in the list already we are going to merge dirty rect with the
// last item
if ([self.dragPoints count] > 0)
{
CGPoint lastP = [[self.dragPoints lastObject] CGPointValue];
CGRect r2 = getBloatedRect(lastP.x, lastP.y, TOUCH_LINE_WIDTH);
*dirtyRect = CGRectUnion(*dirtyRect, r2);
}
// Add the new point into the list
[self.dragPoints addObject: [NSValue valueWithCGPoint: p]];
// Just redraw what we need to.
[self setNeedsDisplayInRect: *dirtyRect];
}
#pragma mark Touch Handling code
// Handles the start of a touch
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
CGRect dirtyRect;
[self clearDragPoints];
[self addToTouchArray: touches outRect: &dirtyRect];
}
// We are done touching add the point and fire the delegate
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
CGRect dirtyRect;
[self addToTouchArray: touches outRect: &dirtyRect];
[self.interactDelegate touchUpPoints: self.dragPoints];
showPoints = NO;
// Need to redraw the screen now to clear the interaction view
[self setNeedsDisplay];
}
// Add another point to touchArray every time the touch moves
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
CGRect dirtyRect;
[self addToTouchArray: touches outRect: &dirtyRect];
}
@end