Метод touchesBegan не вызывается, когда я нажимаю на UIImageView из нескольких дисплеев UIImageView так же, как галерея в мобильном телефоне

Я хочу коснуться UIImageView, и это изображение отображается в другом виде в полном размере, используя навигацию. так же, как галерея в мобильном телефоне. просто создаем демо программно. потому что я новичок в разработке iphone.

Вот мой код

- (void)viewDidLoad
{
    NSLog(@"Enter in viewDidLoad method");

    UIScrollView * scroll = [[UIScrollView alloc]initWithFrame:CGRectMake(0, 0, 320, 480)];

    scroll.contentSize = CGSizeMake(320, self.view.frame.size.height+50);

    [self.view setUserInteractionEnabled:YES];
    [scroll setUserInteractionEnabled:YES];
    [self.view addSubview:scroll];

    int x=5;
    int y=5;
    int hei=100;
    int wid=100;
    int k=1;
    for (int i=0; i<3; i++) 
    {
        for(int j=0;j<50;j++)
        {
            imageView = [[UIImageView alloc]initWithFrame:CGRectMake((x+wid)*i+5, (y+hei)*j+5, wid, hei)];
            [imageView setImage:[UIImage imageNamed:@"Motocross.png"]];
            [imageView setUserInteractionEnabled:YES];
            scroll.contentSize = CGSizeMake(320,(y+hei)*j+hei*2);
            [imageView setTag:k];
            [scroll addSubview:imageView];                        

            NSLog(@"The tag is == %d",k++);
            NSLog(@" (%d,%d)x == %d",i,j,(x+wid)*i+5);
            NSLog(@" (%d,%d)y == %d",i,j,(y+hei)*j+5);

        } 

    }

    [super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
    NSLog(@"Exit from viewDidLoad method");
}
//Navigate on touch the imageView.
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{   
    NSLog(@"Enter in touchesBeganWithEvent method");
    UITouch *touch = [touches anyObject];
    if ([touch view] == imageView)
    {
        NSLog(@"Enter in if condition of touch");
        DetailViewController *detailViewController = [[DetailViewController alloc]initWithNibName:@"DetailViewController" bundle:nil];
        detailViewController.imageD = imageView.image;

        [self.navigationController pushViewController:detailViewController animated:YES];
        [detailViewController release];

        NSLog(@"Exit from if condition of touch");
    }
    NSLog(@"Exit from touchesBeganWithEvent method");
}

Я хочу нажать на imageView, и представление перейдет к detailViewController и отобразит это изображение в большом размере. но этот метод touchesBegan не вызывается, когда я нажимаю на imageView. В этом я не создаю массив UIImageView, просто выделю init в цикле.. Спасибо!

3 ответа

Вместо того, чтобы использовать touchesBegan: на вид, рассмотреть возможность добавления UITapGestureRecognizer к каждому виду изображения. Когда просмотр изображения коснулся (вы настраиваете userInteractionEnabled уже, что хорошо), то вы можете получить вид, который коснулся с sender.view,

Обратите внимание, что вы создаете новый экземпляр UITapGestureRecognizer для каждого изображения, которое у вас есть, но цель / действие каждого жеста могут быть одинаковыми.


Проблема с вашим текущим кодом в том, что эта проверка:

if ([touch view] == imageView)

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

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

if ([[touch view] isKindOfClass:[UIImageView class]]) {

(хотя представление прокрутки может иметь другие подклассы представления изображения, кроме тех, которые вы добавляете...)

Вам нужно использовать UICollectionview, а не пытаться жонглировать строками / двоеточиями, прикосновениями к изображениям и т. Д. Хороший учебник здесь... Учебник по UICollectionView(при условии, что вы не поддерживаете ниже iOS 6.0)

Попробуйте приведенный ниже код или лучше использовать коллекцию

    - (void)viewDidLoad
{
    NSLog(@"Enter in viewDidLoad method");

    UIScrollView * scroll = [[UIScrollView alloc]initWithFrame:CGRectMake(0, 0, 320, 480)];

    scroll.contentSize = CGSizeMake(320, self.view.frame.size.height+50);

    [self.view setUserInteractionEnabled:YES];
    [scroll setUserInteractionEnabled:YES];
    [self.view addSubview:scroll];

    int x=5;
    int y=5;
    int hei=100;
    int wid=100;
    int k=1;
    for (int i=0; i<3; i++)
    {
        for(int j=0;j<50;j++)
        {
            UIButton *buttonForImage=[[UIButton alloc]initWithFrame:CGRectMake((x+wid)*i+5, (y+hei)*j+5, wid, hei)];
            [buttonForImage setImage:[UIImage imageNamed:@"Motocross.png"] forState:UIControlStateNormal];
            [buttonForImage addTarget:self action:@selector(imageButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
            scroll.contentSize = CGSizeMake(320,(y+hei)*j+hei*2);
            [buttonForImage setTag:k];
            [scroll addSubview:buttonForImage];

            NSLog(@"The tag is == %d",k++);
            NSLog(@" (%d,%d)x == %d",i,j,(x+wid)*i+5);
            NSLog(@" (%d,%d)y == %d",i,j,(y+hei)*j+5);

        }

    }

    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    NSLog(@"Exit from viewDidLoad method");
}
//Navigate on touch the imageView.
-(void)imageButtonPressed:(UIButton*)sender{

    NSLog(@"Enter in if condition of touch");
    DetailViewController *detailViewController = [[DetailViewController alloc]initWithNibName:@"DetailViewController" bundle:nil];
    detailViewController.imageD = sender.imageView.image;

    [self.navigationController pushViewController:detailViewController animated:YES];
    [detailViewController release];

}
Другие вопросы по тегам