2013-06-06 4 views
19

Я пытаюсь добавить UIScrollView внутри UICollectionViewCell. Идея заключается в том, что вы можете использовать щепотку, чтобы увеличить изображение UIScrollView (и вместе с ним изображение внутри), но scrollview, похоже, не справляется с любым жестом. Я предполагаю, что их поймал UICollectionView.Как увеличить UIScrollView внутри UICollectionViewCell?

Я установил делегат UIScrollView как UICollectionViewCell, но никто из методов делегата не вызывается.

EDIT: Я сделал github-репо с кодом (упрощенным, насколько мог). Хотя это всего лишь несколько строк кода, я не вижу, что я сделал неправильно.

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

https://github.com/krummler/gallery-pinchzoom-example

+1

Спасибо за то обновленный код в репозиторий. Это было полезно для меня! – super9

ответ

23

Вы можете попробовать манипулировать UIGestureRecognizers для того, чтобы сделать это. В GalleryViewController:

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

    GalleryImageCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"galleryImageCell" forIndexPath:indexPath]; 

    ImageContext *imageContext = [self.images objectAtIndex:indexPath.row]; 

    cell.imageContext = imageContext; 
    [self.collectionView addGestureRecognizer:cell.scrollView.pinchGestureRecognizer]; 
    [self.collectionView addGestureRecognizer:cell.scrollView.panGestureRecognizer]; 

    return cell; 
} 

От Apple's documentation on UIView:

Прикрепление жест распознаватель к представлению определяет сферу изображаемого жест, заставляя его получить штрихи хит-испытывалась на этой точке зрения и все его подвиды. В представлении сохраняется распознаватель жестов.

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

- (void)collectionView:(UICollectionView *)collectionView 
    didEndDisplayingCell:(UICollectionViewCell *)cell 
    forItemAtIndexPath:(NSIndexPath *)indexPath { 

    // Get the cell instance and ... 
    [self.collectionView removeGestureRecognizer:cell.scrollView.pinchGestureRecognizer]; 
    [self.collectionView removeGestureRecognizer:cell.scrollView.panGestureRecognizer]; 
} 

Поскольку вы не модифицируя делегировать UIGestureRecognizer, всего его объем, он все равно будет контролировать масштабирование Scrollview только, что клетки.

РЕДАКТИРОВАТЬ:

Я добавил panGestureRecognizer в приведенных выше примерах, по предложению от OP, что это было необходимо. Само масштабирование полностью обрабатывается pinchGestureRecognizer, но это правда, что в большинстве случаев после масштабирования изображения до точки, где видно только его подмножество, вы хотите панорамировать, чтобы перемещать видимую часть вокруг. То есть, это часть правильного масштабирования.

+0

Удивительный! Я должен был сделать то же самое для 'panGestureRecognizer', и мне было хорошо идти! Спасибо :) (не могу похвастать наградой, но по какой-то причине, я сделаю это позже.) –

+0

@matehat Im, использующий swift, и мою ячейку didEndDisplaying, я продолжаю получать «найденную нулевую разворачивающуюся необязательную» ошибку. Я попытался сделать это, «пусть пусть», он никогда не будет вызван. :/Вот как я получаю экземпляр: let cell = collectionView.cellForItemAtIndexPath (indexPath) как! FSImageCell –

+0

Мне не нужно было добавлять/удалять указатели gesturer в ячейку. Как щипание, так и панорамирование уже работали для меня в камере, но все же позволяли мне прокручивать по горизонтали через мой просмотр коллекции. Я использовал полноэкранные ячейки для галереи изображений. – thgc

0

Проверьте, мультитач все связанные с ним вида не на. iOS отключил мультитач по умолчанию для большинства просмотров, чтобы сэкономить энергию.

+0

Я попробовал это и попытался подражать некоторым примерам, которые мог найти, но я не могу заставить его работать. Я добавил URL-адрес реплива github в исходное сообщение –

0
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch 
{    
    if (touch.view == [self myScrollView]) //<- whatever your scrollView is called 
    { 
     return YES; 
    } 
    return NO; 
} 

Не знаете свой код, но попробуйте сыграть с указанным выше кодом, чтобы узнать, можете ли вы отфильтровать свои штрихи на нужные вам объекты. Вышеуказанный код находится от .

+0

Спасибо, я добавил его в коллекцию cellviewcell, это, похоже, не вызвано для scrollview в нем, только для внешнего вида. –

0

Делегаты не получают вызов, потому что вы добавили его в UICollectionview. События касания доступны для коллекции, которая является надзором и, следовательно, недоступна для просмотра внутри. Возможно, вам придется подумать о другом способе достичь этой модели.

UICollectionView оказывает ту же схему, UITableView, Проблема occours в Tableview внутри Scrollview, что сенсорное событие принимается Scrollview [который является SuperView] и сделать TableView прокручивать в этом случае свитком scrollview должен быть отключен. Это другая версия этой проблемы.

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

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

2

Пожалуйста, добавьте Scrollview в камере и текущий вид клеточного изображения добавить в Scrollview. затем использовать ниже код:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    ImageContext *context = [self.images objectAtIndex:indexPath.row]; 
    ImageCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"imageCell" forIndexPath:indexPath]; 
    cell.cellScrollView.autoresizesSubviews = YES; 
    cell.cellScrollView.multipleTouchEnabled =YES; 
    cell.cellScrollView.maximumZoomScale = 4.0; 
    cell.cellScrollView.minimumZoomScale = 1.0; 
    cell.cellScrollView.clipsToBounds = YES; 
    cell.cellScrollView.delegate = self; 
    cell.cellScrollView.zoomScale = 1.0; 

    [cell.imageView setImage:[UIImage imageNamed:context.thumbImageUrl]]; 

return cell; 
} 
-(UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView 
{ NSLog(@"%i",scrollView.subviews.count); 
    for (UIView *v in scrollView.subviews) { 
    if ([v isKindOfClass:[UIImageView class]]) { 
     return v; 
     } 
    } 

}

15

Я только что сделал реализацию для СВИФТ 3 на IOS 9.3+ и все, что я сделал, было:

1. Поместите вид изображения внутри Scrollview

storyboard example

2. Подключить делегат scrollview к классу ячейки коллекции

3. Реализовать код ниже на CollectionView подкласса

class FullScreenImageTextDetailCollectionViewCell: UICollectionViewCell, UIScrollViewDelegate { 

    @IBOutlet var scrollview: UIScrollView! 
    @IBOutlet weak var backgroundImageView: UIImageView! 

    override func awakeFromNib() { 
     self.scrollview.minimumZoomScale = 0.5 
     self.scrollview.maximumZoomScale = 3.5 
     self.scrollview.delegate = self 
    } 

    func viewForZooming(in scrollView: UIScrollView) -> UIView? { 
     return self.backgroundImageView 
    } 
} 

Нет жест распознаватель добавление и удаление на контроллере CollectionView родителя необходимо, работал как шарм!

Спасибо за предыдущие примеры для достижения этого!

+0

Отличный ответ. Включение ключевого вызова делегата viewForZooming в классе ячеек. –

+0

спасибо @ alku83! – mourodrigo

+0

спасибо, что это работает для меня –

0
I've set the delegate of the UIScrollView to be the UICollectionViewCell, but none of the delegate methods are being called. 

Для этого просто определить одну функцию в collectionViewCell

@IBOutlet weak var mainScrollView:UIScrollView! 
    func setup(){ 
     mainScrollView.minimumZoomScale=1 
     mainScrollView.maximumZoomScale=10.0 

     mainScrollView.delegate=self 

    } 

    func viewForZooming(in scrollView: UIScrollView) -> UIView? { 
     return yourimageviewinside of scrollview 
    } 

вызов этого FUCTION в collectionview(_,cellForItem) методом CollectionView

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