Метод 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];
}