2013-06-05 1 views
5

, так как я не мог использовать фреймворк для создания фотоальбома, я пытаюсь создать свой собственный, используя Collection View, но я застрял в самом начале.Обработка жестов нажатия в UICollectionView

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

здесь основной код, который я создал:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view. 
    [collectionController reloadData]; 
    tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:nil action:@selector(touched)]; 

    tapGesture.numberOfTapsRequired = 1; 


} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView{ 

    return 1; 

} 

-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{ 

    return 6; 
} 

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{ 

    static NSString *cellIdentifier = @"Cell"; 

    CollectionCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath]; 
    [cell.imgCollection setImageWithURL:[NSURL URLWithString:@"http://sallescds.com.br/wp-content/uploads/2012/12/xepop-300x300.jpg"] placeholderImage:[UIImage imageNamed:@"placeholder.png"]]; 

    [cell.imgCollection addGestureRecognizer:tapGesture]; 

    return cell; 
} 

-(void)touched:(UIGestureRecognizer *)tap{ 

    NSLog(@"the touch happened"); 
} 

благодарит ребят.

ответ

14

Несколько вещей, не прямо в коде:

Первый, initWithTarget:action: не следует передавать значение nil для цели. От the docs:

целевой

Объект, который является получателем сообщений, отправленных действий приемником, когда он распознает жест. nil - недопустимое значение.

В вашем случае вы должны пройти self в качестве цели, потому что вы хотите отправить сообщение touched: на текущий экземпляр вашего класса.

Второй, селектор, который вы передали initWithTarget:action:, является неправильным. Вы использовали @selector(touched), но реализация вашего метода - - (void)touched:(UIGestureRecognizer *)tap;, селектор которого @selector(touched:) (mind the :).

Я бы рекомендовал прочитать this question on selectors, если вы смущены.

Третьего, вы не можете прикрепить один UIGestureRecognizer к многократному зрения (см this SO question).

Чтобы сделать его работу, вы можете создать один UITapGestureRecognizer на ячейку коллекции (возможно, в подклассе). Или еще лучше, реализовать свой метод UICollectionViewDelegatecollectionView:didSelectItemAtIndexPath:.

EDIT - Как реализовать collectionView:didSelectItemAtIndexPath::

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view. 

    // Bind the collectionView's delegate to your view controller 
    // This could also be set without code, in your storyboard 
    self.collectionView.delegate = self; 
} 

-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView 
{ 
    return 1; 
} 

-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section 
{ 
    return 6; 
} 

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{ 

    static NSString *cellIdentifier = @"Cell"; 

    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath]; 
    [cell.imgCollection setImageWithURL:[NSURL URLWithString:@"http://sallescds.com.br/wp-content/uploads/2012/12/xepop-300x300.jpg"] placeholderImage:[UIImage imageNamed:@"placeholder.png"]]; 

    return cell; 
} 

// I implemented didSelectItemAtIndexPath:, but you could use willSelectItemAtIndexPath: depending on what you intend to do. See the docs of these two methods for the differences. 
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // If you need to use the touched cell, you can retrieve it like so 
    UICollectionViewCell *cell = [collectionView cellForItemAtIndexPath:indexPath]; 

    NSLog(@"touched cell %@ at indexPath %@", cell, indexPath); 
} 
+0

Понял, я уже устранили проблемы, моя ошибка, когда я переводил свои имена методов на английский. Спасибо за помощь, теперь я должен понять, как это сделать в UICollectionViewDelegate, потому что я понятия не имею. Не могли бы вы привести мне пример или что-то в этом роде? –

+0

Итак, я должен вызвать этот метод - (BOOL) collectionView: (UICollectionView *) collectionView shouldSelectItemAtIndexPath: (NSIndexPath *) indexPath; и создать жест внутри него? –

+2

Это на самом деле гораздо проще. Если вы применяете методы делегатов, вам не нужны распознаватели жестов. Делегат будет называть вашу реализацию своих методов при обнаружении касания. Обратите внимание, что вам не нужно явно вызывать 'shouldSelect..' или' didSelect..', делегат делает это за вас. –

 Смежные вопросы

  • Нет связанных вопросов^_^