Обнаружение отдельных касаний в нескольких UIImageViews?

#ios #ios4 #uiimageview

#iOS #ios4 #uiimageview

Вопрос:

я добавил около 15-16 UIImageViews в свой просмотр, используя следующий код

 - (void) setUpCellsUsingImage: (UIImage *) masterImage
{
  rows = 4;
 cols = 4;
 containerCellHeight=hight/4;
containerCellWidth=width/4; 


NSInteger row, col;
CGImageRef tempSubImage;
CGRect tempRect;
CGFloat yPos, xPos; 

UIImage * aUIImage;
UIImageView *label;

cellArray = [[NSMutableArray new] autorelease];
int i =0;

for (row=0; row < rows; row  ) {
    yPos = row * containerCellHeight;
    for (col=0; col < cols; col  ) {
        xPos = col * containerCellWidth;
        label = [[UIImageView alloc]init];
        tempRect = CGRectMake(xPos, yPos, containerCellWidth, containerCellHeight);     

        tempSubImage = CGImageCreateWithImageInRect(masterImage.CGImage, tempRect);

        aUIImage = [UIImage imageWithCGImage: tempSubImage];

        imgView = [[UIImageView alloc] initWithImage:aUIImage];

        imgView.tag =i;

        i  ;

        NSLog(@"original tags = %d",label.tag);

        [cellArray addObject: aUIImage];        

        aUIImage = nil;
        CGImageRelease(tempSubImage);

    }
}
}
  

теперь я знаю, что могу определить, какой imageview был затронут с помощью тега ImageView, но я не знаю, как проверить наличие тегов в методе touchesBegan.. что я могу сделать, чтобы дифференцировать uiimageview на основе касания??

 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {


UITouch *myTouch = [touches anyObject];
CGPoint location = [myTouch locationInView:imgView];    

NSLog(@"touch  %@",imgView.tag);

}
  

новый код:

 - (void) setUpCellsUsingImage: (UIImage *) masterImage
{

  rows = 4;
 cols = 4;
 containerCellHeight=hight/4;
containerCellWidth=width/4; 

NSInteger row, col;
CGImageRef tempSubImage;
CGRect tempRect;
CGFloat yPos, xPos; 

UIImage * aUIImage;
UIImageView *label;

cellArray = [[NSMutableArray new] autorelease];
int i =0;

for (row=0; row < rows; row  ) {
    yPos = row * containerCellHeight;
    for (col=0; col < cols; col  ) {
        xPos = col * containerCellWidth;
        label = [[UIImageView alloc]init];
        tempRect = CGRectMake(xPos, yPos, containerCellWidth, containerCellHeight);     

        tempSubImage = CGImageCreateWithImageInRect(masterImage.CGImage, tempRect);

        aUIImage = [UIImage imageWithCGImage: tempSubImage];

        imgView = [[UIImageView alloc] initWithImage:aUIImage];

        [self.view addSubview:imgView]; // i add the uiimageview here

        imgView =CGRectMake(xPos, yPos, containerCellWidth-1, containerCellHeight-1);

        imgView.tag =i;

        i  ;

        NSLog(@"original tags = %d",label.tag);

        [cellArray addObject: aUIImage];        

        aUIImage = nil;
        CGImageRelease(tempSubImage);

    }
}
}



- (void)viewDidLoad {

    UIImage *mImage = [UIImage imageNamed:@"menu.png"];
     hight = mImage.size.height;
     width = mImage.size.width;

    [self setUpCellsUsingImage:mImage];

[`super viewDidLoad];`

}
  

Комментарии:

1. Вы хотели бы узнать, какой вид изображения был затронут, верно?

Ответ №1:

Пожалуйста, попробуйте это:

 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{
    UITouch *myTouch = [touches anyObject];
    CGPoint location = [myTouch locationInView:imgView];    

    UIView *hitView = [self.view hitTest:location withEvent:event];
    NSLog(@"hitView %@",hitView);

    UIImageView *hitImageView = nil;

    if([hitView isKindOfClass:[UIImageView class]]) {
        hitImageView = (UIImageView *)hitImageView;
    } 

    NSLog(@"touched %@", hitImageView);
}
  

Комментарии:

1. нет, все еще не работает.. нельзя ли дифференцировать imgview на основе тега??

2. @hemant, есть ошибки? У меня нет вашего кода, поэтому я не могу понять, что не так. Содержит ли hitView что-либо, пожалуйста, отправьте NSLog. Я добавлю несколько журналов отладки в код. И у меня была опечатка в последнем сообщении журнала, исправил ее.

3. пробовал использовать ваш код, таких ошибок нет, но в журналах hitview и touched отображается нулевое значение

4. @hemant можете ли вы показать мне код, как вы добавляете ImageViews в свой view? Содержит ли self.view их супер-представление?

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

Ответ №2:

Вы можете использовать UIGestureRecognizers начиная с iOS 3.2. Я бы рекомендовал использовать один UIImageView для имеющегося у вас меню и добавить UITapGestureRecognizer для обнаружения одиночных нажатий. Затем используйте locationInView в действии, чтобы увидеть, к какому месту изображения прикоснулся пользователь.

     ...
    UITapGestureRecognizer *tapRecognizer = 
        [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(menuSelect:)];
    [imageView addGestureRecognizer:tapRecognizer];
    [tapRecognizer release]; 
}

- (void)menuSelect:(UIGestureRecognizer *)gesture {
    // get location CGPoint for touch from recognizer
}
  

Это ссылка на очень полезное руководство Apple по распознавателям.