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+
5372NSString * 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