2013-08-07 2 views
1

У меня есть общие генерируемые ImageViews в scrollView. У каждого из этих изображений есть 2 gestureRecognizer для однократного/двойного нажатия на ImageView. Теперь моя проблема заключается в том, как определить, был ли ImageView использован для первого или второго раза. В некоторых сценариях легко использовать тег ImageView, но у меня есть два разных gestureRecognizer на каждом ImageView, и каждый gestureRecognizer использует другой метод идентификации на основе номера тега, чтобы идентифицировать изображение.Идентификация UIImageView без тега

Здесь я генерировать ImageViews динамически:

-(void) initLevels{ 
_level = [Level alloc]; 
_unit = [Unit alloc]; 
self->_units = [[NSMutableArray alloc] init]; 
_keys = [[NSMutableArray alloc] init] 
; 
int x = 0; 
int y = 0; 
int i = 0; 

for (NSObject *object in self->_levels) { 
    if ([object isKindOfClass:_level.class] && i != 0) { 
     x = x + MARGIN_RIGHT + OBJECT_WIDTH; 
     y = 0; 
     } 
    else if ([object isKindOfClass:_unit.class]){ 
     _unit = (Unit *) object; 
     [self->_units addObject:_unit.description]; 
     UIImageView *imageView = [[UIImageView alloc] initWithImage:self.box]; 
     [imageView setFrame:CGRectMake(x, y, OBJECT_WIDTH, BOX_HEIGHT)]; 
     imageView.highlighted = TRUE; 
     imageView.tag = i; //when this is not outlined the gestureRecognizer for singleTapping works but on the other hand the double tap gestureRecognizer just works for the first object, because its' tag is set on 0. 

     UITapGestureRecognizer *doubleTapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(unitDoubleTapped:)]; 
     doubleTapGesture.numberOfTapsRequired = 2; 
     imageView.userInteractionEnabled = YES; 
     [imageView addGestureRecognizer:doubleTapGesture]; 

     UITapGestureRecognizer *singleTapGesture = 
    [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(unitSingleTapped:)]; 
     singleTapGesture.numberOfTapsRequired = 1; 

    //telling the singleTapGesture to fail the doubleTapGesture, so both doesn't fire at the same time 
     [singleTapGesture requireGestureRecognizerToFail:doubleTapGesture]; 
     [imageView addGestureRecognizer:singleTapGesture]; 
     UILabel *labelHeadline = [[UILabel alloc] initWithFrame:CGRectMake(5, 2, 220, 20)]; 
     [labelHeadline setFont:[UIFont boldSystemFontOfSize:12]]; 
     labelHeadline.textAlignment = NSTextAlignmentCenter; 
     [labelHeadline setBackgroundColor:[[UIColor whiteColor] colorWithAlphaComponent:0]]; 

     labelHeadline.text = _unit.headline; 
     labelHeadline.numberOfLines = 0; 
     [labelHeadline sizeToFit]; 

     UILabel *labelPrice = [LabelUtils deepLabelCopy:labelHeadline withText:[NSString stringWithFormat:@"Price: %@",_unit.price] withFrame:NO]; 
     [labelPrice setTextAlignment:NSTextAlignmentLeft]; 
     [labelPrice setFrame:CGRectMake(labelHeadline.frame.origin.x, labelHeadline.frame.origin.y + labelHeadline.frame.size.height + 2, 220, 20)]; 

     UILabel *labelCRM = [LabelUtils deepLabelCopy:labelHeadline withText:[NSString stringWithFormat:@"CRM: %@", _unit.crm] withFrame:NO]; 
     [labelCRM setTextAlignment:NSTextAlignmentLeft]; 

     [labelCRM setFrame:CGRectMake(labelPrice.frame.origin.x, labelPrice.frame.origin.y + labelPrice.frame.size.height + 2, 220, 20)]; 



     UITextView *textView= [[UITextView alloc] initWithFrame:CGRectMake(0,0, OBJECT_WIDTH, OBJECT_HEIGHT)]; 
     [textView addSubview:labelHeadline]; 
     [textView addSubview:labelPrice]; 
     [textView addSubview:labelCRM]; 
     [textView setUserInteractionEnabled:NO]; 
     [textView setEditable:NO]; 
     textView.backgroundColor = [[UIColor whiteColor]colorWithAlphaComponent:0]; 
     textView.textAlignment = NSTextAlignmentLeft; 
     [imageView addSubview:textView]; 
     [_scrollView addSubview:imageView]; 

     y = y + MARGIN_BOTTOM + BOX_HEIGHT; 
    } 
    [self->_keys addObject:[NSNumber numberWithInt:i]]; 
    i++; 
}//remove the last keys which are to much in the _keys array 
while ([self->_keys count] > ([self->_units count])) { 
    [_keys removeLastObject]; 
    i--; 
} 

self.contents = [NSDictionary dictionaryWithObjects:self->_units forKeys:_keys]; 
} 

Вот код два жеста распознавателя

-(void)unitDoubleTapped:(UIGestureRecognizer *)gestureRecognizer{ 
self->_unitViewForDoubleTapIdentification = (UIImageView *)gestureRecognizer.view; 
switch (self->_unitViewForDoubleTapIdentification.tag) { 
    case 0: 
     [_unitViewForDoubleTapIdentification setHighlightedImage:self.transparentBox]; 
     self->_unitViewForDoubleTapIdentification.tag = 1; 
     break; 
    case 1: 
     [_unitViewForDoubleTapIdentification setHighlightedImage:self.box]; 
     self->_unitViewForDoubleTapIdentification.tag = 0; 
     break; 
    default: 
     break; 
} 

} 

и здесь SingleTap

- (IBAction)unitSingleTapped:(id)sender { 
[self dismissAllPopTipViews]; 
UIGestureRecognizer *gestureRecognizer = [UIGestureRecognizer alloc]; 
gestureRecognizer = (UIGestureRecognizer *)sender; 
UIImageView *imageView = [[UIImageView alloc] init]; 
imageView = (UIImageView *)gestureRecognizer.view; 

if (sender == _currentPopTipViewTarget) { 
    // Dismiss the popTipView and that is all 
    self.currentPopTipViewTarget = nil; 
} 
    NSString *contentMessage = nil; 
    UIImageView *contentView = nil; 
    NSNumber *key = [NSNumber numberWithInt:imageView.tag]; 
    id content = [self.contents objectForKey:key]; 

    if ([content isKindOfClass:[NSString class]]) { 
     contentMessage = content; 
    } 
    else { 
     contentMessage = @"A large amount ot text in this bubble\najshdjashdkgsadfhadshgfhadsgfkasgfdasfdhasdkfgaodslfgkashjdfg\nsjfkasdfgkahdjsfghajdsfgjakdsfgjjakdsfjgjhaskdfjadsfgjdsfahsdafhjajdskfhadshfadsjfhadsjlfkaldsfhfldsa\ndsfgahdsfgajskdfgkafd"; 
    } 
    NSArray *colorScheme = [_colorSchemes objectAtIndex:foo4random()*[_colorSchemes count]]; 
    UIColor *backgroundColor = [colorScheme objectAtIndex:0]; 
    UIColor *textColor = [colorScheme objectAtIndex:1]; 

    CMPopTipView *popTipView; 
    if (contentView) { 
     popTipView = [[CMPopTipView alloc] initWithCustomView:contentView]; 
    } 

    else { 
     popTipView = [[CMPopTipView alloc] initWithMessage:contentMessage]; 
    } 
    [popTipView presentPointingAtView:imageView inView:self.view animated:YES]; 
    popTipView.delegate = self; 
    popTipView.disableTapToDismiss = YES; 
    popTipView.preferredPointDirection = PointDirectionUp; 
    if (backgroundColor && ![backgroundColor isEqual:[NSNull null]]) { 
     popTipView.backgroundColor = backgroundColor; 
    } 
    if (textColor && ![textColor isEqual:[NSNull null]]) { 
     popTipView.textColor = textColor; 
    } 

    popTipView.animation = arc4random() % 2; 
    popTipView.has3DStyle = (BOOL)(arc4random() % 2); 

    popTipView.dismissTapAnywhere = YES; 
    [popTipView autoDismissAnimated:YES atTimeInterval:3.0]; 

    [_visiblePopTipViews addObject:popTipView]; 
    self.currentPopTipViewTarget = sender; 
    } 

Упование вы можете помочь мне , заранее спасибо.

+3

Длинный код не означает ясный вопрос! –

+0

Где вы говорите, что «каждый gestureRecognizer использует другой номер тега для идентификации изображения», как ваше изображение имеет более одного тега? –

+0

Я пытаюсь изменить это в противном случае. – user2019219

ответ

0

, что очень много кода, чтобы пройти .. но я добавить больше идентификаторов UIViews (т.е. кроме идентификатора тега) с помощью obj-c runtime associative references ..

Так это категория прилагаю к моему UIView:

#import "UIView+Addons.h" 
#import <objc/runtime.h> 

#define kAnimationDuration 0.25f 

@implementation UIView (Addons) 

static char infoKey; 
static char secondaryInfoKey; 

-(id)info { 
    return objc_getAssociatedObject(self, &infoKey); 
} 

-(void)setInfo:(id)info { 
    objc_setAssociatedObject(self, &infoKey, info, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 
} 

-(id)secondaryInfo { 
    return objc_getAssociatedObject(self, &secondaryInfoKey); 
} 

-(void)setSecondaryInfo:(id)info { 
    objc_setAssociatedObject(self, &secondaryInfoKey, info, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 
} 

@end 

вот пример моего собственного кода, где я использую выше для решения проблемы, аналогичную той, вы столкнулись:

if (![[view info] boolValue]) { // not selected? 
     self.moveToFolderNumber = [view secondaryInfo]; 
     [view setInfo:@YES]; 
    } 
+0

это сработало для вас? – abbood

+0

Я решил это по-своему, я просто добавляю объект doubleTapped в массив и проверял каждый раз, когда вызывается doubleTapped GR, если тот же самый объект находится в массиве. Но спасибо, за ваши усилия. – user2019219

Смежные вопросы