Skip to content

Commit 2d86535

Browse files
techiemacAlanQuatermain
authored andcommitted
Added multi touch behavior
1 parent b4be4d7 commit 2d86535

2 files changed

Lines changed: 52 additions & 10 deletions

File tree

Classes/AQGridView.h

100644100755
Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,9 +73,11 @@ typedef enum {
7373

7474
// Called before selection occurs. Return a new index, or NSNotFound, to change the proposed selection.
7575
- (NSUInteger) gridView: (AQGridView *) gridView willSelectItemAtIndex: (NSUInteger) index;
76+
- (NSUInteger) gridView: (AQGridView *) gridView willSelectItemAtIndex: (NSUInteger) index numFingersTouch:(NSUInteger) numFingers;
7677
- (NSUInteger) gridView: (AQGridView *) gridView willDeselectItemAtIndex: (NSUInteger) index;
7778
// Called after the user changes the selection
7879
- (void) gridView: (AQGridView *) gridView didSelectItemAtIndex: (NSUInteger) index;
80+
- (void) gridView: (AQGridView *) gridView didSelectItemAtIndex: (NSUInteger) index numFingersTouch:(NSUInteger)numFingers;
7981
- (void) gridView: (AQGridView *) gridView didDeselectItemAtIndex: (NSUInteger) index;
8082

8183
// NOT YET IMPLEMENTED
@@ -124,7 +126,7 @@ extern NSString * const AQGridViewSelectionDidChangeNotification;
124126

125127
UIView * _headerView;
126128
UIView * _footerView;
127-
129+
128130
struct
129131
{
130132
unsigned resizesCellWidths:1;
@@ -146,8 +148,10 @@ extern NSString * const AQGridViewSelectionDidChangeNotification;
146148

147149
unsigned delegateWillDisplayCell:1;
148150
unsigned delegateWillSelectItem:1;
151+
unsigned delegateWillSelectItemMultiTouch:1;
149152
unsigned delegateWillDeselectItem:1;
150153
unsigned delegateDidSelectItem:1;
154+
unsigned delegateDidSelectItemMultiTouch:1;
151155
unsigned delegateDidDeselectItem:1;
152156
unsigned delegateGestureRecognizerActivated:1;
153157
unsigned delegateAdjustGridCellFrame:1;

Classes/AQGridView.m

100644100755
Lines changed: 47 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,25 @@
5050
#import <objc/objc.h>
5151
#import <objc/runtime.h>
5252

53+
// Lightweight object class for touch selection parameters
54+
@interface UserSelectItemIndexParams : NSObject
55+
{
56+
NSUInteger _indexNum;
57+
NSUInteger _numFingers;
58+
};
59+
60+
@property (nonatomic, assign) NSUInteger indexNum;
61+
@property (nonatomic, assign) NSUInteger numFingers;
62+
@end
63+
64+
@implementation UserSelectItemIndexParams
65+
66+
@synthesize indexNum = _indexNum;
67+
@synthesize numFingers = _numFingers;
68+
69+
@end
70+
71+
5372
NSString * const AQGridViewSelectionDidChangeNotification = @"AQGridViewSelectionDidChangeNotification";
5473

5574
@interface AQGridView (AQCellGridMath)
@@ -71,6 +90,7 @@ @interface AQGridView ()
7190
@property (nonatomic, copy) NSIndexSet * animatingIndices;
7291
@end
7392

93+
7494
@implementation AQGridView
7595

7696
@synthesize dataSource=_dataSource, backgroundView=_backgroundView, separatorColor=_separatorColor, animatingCells=_animatingCells, animatingIndices=_animatingIndices;
@@ -158,8 +178,10 @@ - (void) setDelegate: (id<AQGridViewDelegate>) obj
158178

159179
_flags.delegateWillDisplayCell = [obj respondsToSelector: @selector(gridView:willDisplayCell:forItemAtIndex:)];
160180
_flags.delegateWillSelectItem = [obj respondsToSelector: @selector(gridView:willSelectItemAtIndex:)];
181+
_flags.delegateWillSelectItemMultiTouch = [obj respondsToSelector: @selector(gridView:willSelectItemAtIndex:numFingersTouch:)];
161182
_flags.delegateWillDeselectItem = [obj respondsToSelector: @selector(gridView:willDeselectItemAtIndex:)];
162183
_flags.delegateDidSelectItem = [obj respondsToSelector: @selector(gridView:didSelectItemAtIndex:)];
184+
_flags.delegateDidSelectItemMultiTouch = [obj respondsToSelector: @selector(gridView:didSelectItemAtIndex:numFingersTouch:)];
163185
_flags.delegateDidDeselectItem = [obj respondsToSelector: @selector(gridView:didDeselectItemAtIndex:)];
164186
_flags.delegateGestureRecognizerActivated = [obj respondsToSelector: @selector(gridView:gestureRecognizer:activatedForItemAtIndex:)];
165187
_flags.delegateAdjustGridCellFrame = [obj respondsToSelector: @selector(gridView:adjustCellFrame:withinGridCellFrame:)];
@@ -1119,6 +1141,7 @@ - (void) _deselectItemAtIndex: (NSUInteger) index animated: (BOOL) animated noti
11191141

11201142
- (void) _selectItemAtIndex: (NSUInteger) index animated: (BOOL) animated
11211143
scrollPosition: (AQGridViewScrollPosition) position notifyDelegate: (BOOL) notifyDelegate
1144+
numFingersTouch: (NSUInteger) numFingers
11221145
{
11231146
if ( _selectedIndex == index )
11241147
return; // already selected this item
@@ -1131,7 +1154,11 @@ - (void) _selectItemAtIndex: (NSUInteger) index animated: (BOOL) animated
11311154

11321155
if ( notifyDelegate && _flags.delegateWillSelectItem )
11331156
index = [self.delegate gridView: self willSelectItemAtIndex: index];
1134-
1157+
1158+
if ( notifyDelegate && _flags.delegateWillSelectItemMultiTouch )
1159+
index = [self.delegate gridView: self willSelectItemAtIndex: index
1160+
numFingersTouch:numFingers];
1161+
11351162
_selectedIndex = index;
11361163
[[self cellForItemAtIndex: index] setSelected: YES animated: animated];
11371164

@@ -1146,6 +1173,9 @@ - (void) _selectItemAtIndex: (NSUInteger) index animated: (BOOL) animated
11461173

11471174
if ( notifyDelegate && _flags.delegateDidSelectItem )
11481175
[self.delegate gridView: self didSelectItemAtIndex: index];
1176+
1177+
if ( notifyDelegate && _flags.delegateDidSelectItemMultiTouch )
1178+
[self.delegate gridView: self didSelectItemAtIndex: index numFingersTouch:numFingers];
11491179

11501180
// ensure that the selected item is no longer marked as just 'highlighted' (that's an intermediary state)
11511181
[_highlightedIndices removeIndex: index];
@@ -1154,7 +1184,8 @@ - (void) _selectItemAtIndex: (NSUInteger) index animated: (BOOL) animated
11541184
- (void) selectItemAtIndex: (NSUInteger) index animated: (BOOL) animated
11551185
scrollPosition: (AQGridViewScrollPosition) scrollPosition
11561186
{
1157-
[self _selectItemAtIndex: index animated: animated scrollPosition: scrollPosition notifyDelegate: NO];
1187+
[self _selectItemAtIndex: index animated: animated scrollPosition: scrollPosition notifyDelegate: NO
1188+
numFingersTouch: 1];
11581189
}
11591190

11601191
- (void) deselectItemAtIndex: (NSUInteger) index animated: (BOOL) animated
@@ -1272,14 +1303,16 @@ - (void) _gridViewDeferredTouchesBegan: (NSNumber *) indexNum
12721303
//_pendingSelectionIndex = NSNotFound;
12731304
}
12741305

1275-
- (void) _userSelectItemAtIndex: (NSNumber *) indexNum
1306+
- (void) _userSelectItemAtIndex: (UserSelectItemIndexParams*) params
12761307
{
1277-
NSUInteger index = [indexNum unsignedIntegerValue];
1308+
NSUInteger index = params.indexNum;
1309+
NSUInteger numFingersCount = params.numFingers;
12781310
[self unhighlightItemAtIndex: index animated: NO];
12791311
if ( ([[self cellForItemAtIndex: index] isSelected]) && (self.requiresSelection == NO) )
12801312
[self _deselectItemAtIndex: index animated: NO notifyDelegate: YES];
12811313
else
1282-
[self _selectItemAtIndex: index animated: NO scrollPosition: AQGridViewScrollPositionNone notifyDelegate: YES];
1314+
[self _selectItemAtIndex: index animated: NO scrollPosition: AQGridViewScrollPositionNone notifyDelegate: YES
1315+
numFingersTouch: numFingersCount];
12831316
_pendingSelectionIndex = NSNotFound;
12841317
}
12851318

@@ -1323,7 +1356,7 @@ - (BOOL) _gestureRecognizerIsHandlingTouches: (NSSet *) touches
13231356
- (void) touchesBegan: (NSSet *) touches withEvent: (UIEvent *) event
13241357
{
13251358
_flags.ignoreTouchSelect = ([self isDragging] ? 1 : 0);
1326-
1359+
13271360
UITouch * touch = [touches anyObject];
13281361
_touchBeganPosition = [touch locationInView: nil];
13291362
if ( (touch != nil) && (_pendingSelectionIndex == NSNotFound) )
@@ -1391,7 +1424,7 @@ - (void) touchesMoved: (NSSet *) touches withEvent: (UIEvent *) event
13911424

13921425
- (void) touchesEnded: (NSSet *) touches withEvent: (UIEvent *) event
13931426
{
1394-
[[self class] cancelPreviousPerformRequestsWithTarget: self
1427+
[[self class] cancelPreviousPerformRequestsWithTarget: self
13951428
selector: @selector(_gridViewDeferredTouchesBegan:)
13961429
object: nil];
13971430

@@ -1431,10 +1464,15 @@ - (void) touchesEnded: (NSSet *) touches withEvent: (UIEvent *) event
14311464
if ( _flags.allowsSelection == 0 )
14321465
break;
14331466

1467+
NSSet *touchEventSet = [event allTouches];
1468+
14341469
// run this on the next runloop tick
1470+
UserSelectItemIndexParams* selectorParams = [[[UserSelectItemIndexParams alloc] init] autorelease];
1471+
selectorParams.indexNum = _pendingSelectionIndex;
1472+
selectorParams.numFingers = [touchEventSet count];
14351473
[self performSelector: @selector(_userSelectItemAtIndex:)
1436-
withObject: [NSNumber numberWithUnsignedInteger: _pendingSelectionIndex]
1437-
afterDelay: 0.0];
1474+
withObject: selectorParams
1475+
afterDelay:0.0];
14381476

14391477
[hitView release];
14401478

0 commit comments

Comments
 (0)