Пользовательский UIImageVIew с прикосновениями закругленный работает только при первом просмотре - PullRequest
0 голосов
/ 28 октября 2010

Извините за плохой заголовок: (

У меня есть контроллер с прокруткой, где я отображаю некоторые другие представления, в данном случае IngredientImage, который является подклассом 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

и есть код, который помещает представления в представление прокрутки

- (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)))];
}

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

Можете ли вы помочь мне?

Спасибо

1 Ответ

4 голосов
/ 28 октября 2010

Когда вы звоните

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

, вы устанавливаете местоположение относительно границ вашего imageView.Но затем в вашем операторе if,

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

, вы спрашиваете, находится ли местоположение в вашем кадре.Но рамки и границы разные.Кадр дает координаты относительно вашего суперпредставления;bounds дает его относительно самого представления.

Чтобы исправить это, измените свой оператор if на

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

Теперь вы последовательно используете одну и ту же систему координат в обоих вызовах, и ваша проблемадолжен уйти.

...