Подтвердить что ты не робот

Как увеличить UIScrollView внутри UICollectionViewCell?

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

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

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

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

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

4b9b3361

Ответ 1

Возможно, вы захотите попробовать манипулировать 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 по 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, только его область действия, он все равно будет контролировать масштабирование только этого прокрутки ячейки.

ИЗМЕНИТЬ

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

Ответ 2

Я только что сделал реализацию для SWIFT 3 на iOS 9.3 +, и все, что я сделал, было:

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

пример раскадровки

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

3. Внедрите приведенный ниже код в подклассе коллекцииview

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
     }
}

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

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

Ответ 3

Пожалуйста, добавьте 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;
      }
  }

}

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

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

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

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

Ответ 7

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

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

  @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 in collectionview(_,cellForItem ) метод сбора данных