2010-10-28 23 views
0

Désolé pour le mauvais titre :(sur mesure UIImageView avec touchesEnded fonctionne uniquement avec la première vue

Je suis un contrôleur qui a un scrollview où j'afficher d'autres vues, dans ce cas, un IngredientImage, qui est une sous-classe de UIImageView:

#import "IngredientImage.h" 

@implementation IngredientImage  

- (id) initWithImage:(UIImage *)image { 
    if (self = [super initWithImage:image]) { 

    } 
    [self setUserInteractionEnabled:YES]; 
    return self; 
} 

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 
    CGPoint location = [[touches anyObject] locationInView:self]; 

    if (CGRectContainsPoint([self frame], location)) { 
     NSLog(@"This works..."); 
    } 
} 

- (void)dealloc { 
    [super dealloc]; 
} 


@end 

et il y a le code qui met les points de vue dans le scrollview

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    [self addIngredients]; 

} 

- (void)addIngredients { 
    NSUInteger i; 
    for (i = 1; i <= 10; i++) { 
     UIImage *image = [UIImage imageNamed:@"ing.png"]; 
     IngredientImage *imageView = [[IngredientImage alloc] initWithImage:image]; 

     // setup each frame to a default height and width, it will be properly placed when we call "updateScrollList" 
     CGRect rect = imageView.frame; 
     rect.size.height = 50; 
     rect.size.width = 50; 
     imageView.frame = rect; 
     imageView.tag = i; // tag our images for later use when we place them in serial fashion 
     [ingredientsView addSubview:imageView]; 
     [imageView release]; 
     [image release]; 
    } 

    UIImageView *view = nil; 
    NSArray *subviews = [ingredientsView subviews]; 

    // reposition all image subviews in a horizontal serial fashion 
    CGFloat curYLoc = INGREDIENT_PADDING; 
    for (view in subviews) { 
     if ([view isKindOfClass:[IngredientImage class]] && view.tag > 0) { 
      CGRect frame = view.frame; 
      frame.origin = CGPointMake(INGREDIENT_PADDING, curYLoc); 
      view.frame = frame; 

      curYLoc += (INGREDIENT_PADDING + INGREDIENT_HEIGHT); 
     } 
    } 

    // set the content size so it can be scrollable 
    [ingredientsView setContentSize:CGSizeMake([ingredientsView bounds].size.width, (10 * (INGREDIENT_PADDING + INGREDIENT_HEIGHT)))]; 
} 

le problème est que seule la première vue gère l'événement tactile, et Je ne sais pas pourquoi :(

Pouvez-vous m'aider?

Merci

Répondre

4

Lorsque vous appelez

CGPoint location = [[touches anyObject] locationInView:self]; 

vous définissez l'emplacement par rapport aux limites de votre imageView. Mais dans votre instruction if,

if (CGRectContainsPoint([self frame], location)) 

vous demandez si l'emplacement est dans votre cadre. Mais le cadre et les limites sont différents. Le cadre donne les coordonnées relatives à votre vue d'ensemble; les limites le donne par rapport à la vue elle-même.

Pour corriger cela, changer votre instruction if lire

if (CGRectContainsPoint([self bounds], location)) 

Maintenant, vous utilisez toujours le même système de coordonnées dans les deux appels et votre problème devrait disparaître.