Как увеличить UIScrollView внутри UICollectionViewCell?
Я пытаюсь добавить UIScrollView
внутри UICollectionViewCell
. Идея заключается в том, что вы можете использовать щепотку, чтобы увеличить UIScrollView
(и вместе с ним, изображение внутри), но scrollview, похоже, не обрабатывает никаких жестов. Я предполагаю, что они пойманы UICollectionView
.
Я установил делегат UIScrollView
как UICollectionViewCell
, но никто из методов делегата не вызван.
EDIT:
Я сделал репозиторий github с кодом (упрощенным, насколько мог). Хотя это всего лишь несколько строк кода, я не вижу, что я сделал неправильно.
EDIT2: после того, как ответ был найден, я добавил исправления к вышеупомянутому репо, надеюсь, что другие считают его полезным:)
https://github.com/krummler/gallery-pinchzoom-example
Ответы
Ответ 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 )
метод сбора данных