9

У меня есть 3 UIViews Header/Tabar/Container, встроенный в ScrollView в ViewController. Так что это моя структура:UICollectionView внутри контейнера UIView: didSelectRowAtIndexPath не вызывается после прокрутки

enter image description here

В ContainerView я загружаю UICollectionView (как это):

let controller = storyboard!.instantiateViewControllerWithIdentifier("myCollectionViewController") as! myCollectionViewController 
controller.delegate = self 

self.addChildViewController(controller) 
controller.view.backgroundColor = UIColor.brownColor() 
self.containerView.addSubview(controller.view) 
controller.didMoveToParentViewController(self) 

Все прекрасно работает, каждый из которых клетки UICollectionView загружаются, ... The единственная проблема заключается в том, что все скрытые ячейки (и даже все части скрытых ячеек) не могут быть выбраны. Я имею в виду, что моя функция «didSelectRowAtIndexPath» не работает для каждого пикселя на первом экране. Это схема моей проблемы:

Это то, что я до прокрутки (слева представляет собой схему, справа то, что я на самом деле есть на экране) -> здесь все работает отлично:

enter image description here

Это то, что я после того, как свиток (слева представляет собой схему, справа то, что я на самом деле есть на экране) -> только пиксели, которые отображались перед Спиральные вызов «didSelectRowAtIndexPath»:

enter image description here

Проблема заключается в том, что self.view.frame не освежает хорошо. У вас есть идея, как я должен изменить этот фрейм и когда?

+0

Как прокручивается панель заголовка и вкладок. у вас есть код для этого. добавьте его. – hasan83

+0

@ hasan83 Я не очень понимаю ваш вопрос. Мой код довольно тяжелый, какая часть кода может вам помочь? – user3369214

+0

Прокрутка представления коллекции не прокручивает заголовок и панель вкладок. Как вы прокручиваете те, которые позволяют просматривать коллекцию, чтобы получить больше места? По-видимому, вы добавили код для обработки этой логики. Добавьте этот код и место его запуска. – hasan83

ответ

1

Определение проблемы:

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

Предлагаемое решение:

Пусть эти дополнительные представления прокручивается вместе с скроллера пунктов.

Как подать заявку!

Самое удобное решение для достижения этого. Появляется в представлении Scroller.Например, UICollectionView предоставляет Дополнительные элементы (Верхние и нижние колонтитулы), которые прокручиваются с элементами коллекции. Переместите заголовок и вкладку в область заголовка UICollectionView. то, реализовать viewForSupplementaryElementOfKind в контроллере представления:

- (nonnull UICollectionReusableView *)collectionView:(nonnull UICollectionView *)collectionView viewForSupplementaryElementOfKind:(nonnull NSString *)kind atIndexPath:(nonnull NSIndexPath *)indexPath 
{ 
    UICollectionReusableView *reusableview = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"Header1" forIndexPath:indexPath]; 

    return reusableview; 
} 

Interface Builder: Область заголовка для UICollectionView уже существует. Но вам нужно установить высоту для этого через конструктор интерфейса, чтобы появиться во время разработки. Не забудьте установить для заголовка идентификатор вида многоразового просмотра.

enter image description here

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

Update:

Рассмотрим для удаления контейнера заголовка и TabBar и повторно добавить его как подвид в его надлежащее место во время выполнения. когда щелкнуть вкладку UICollectionView, перейдите к просмотру многоразового заголовка в методе viewForSupplementaryElementOfKind. когда щелчок ярлыков нажимается, добавьте его поверх представления контейнера меток. и когда это табличное представление передает его заголовку UITableView в методе headerForRow.

+0

Это отличный ответ, но я не хочу иметь дополнительные элементы (я уже пробовал это сначала, но он не работал так, как я хотел). Мое единственное решение - встроить мой CollectionViewController в UIView (называемый Container) внутри моего основного ViewController. Таким образом, я могу переключаться с встраиванием объектов другого типа в мой контейнер, таких как TableViewController, CollectionViewController, UILabels, ... – user3369214

+0

Aha, но наверняка его неправильно иметь вложенные скроллеры. Почему бы вам не подумать о том, чтобы переместить вкладку и заголовок из представления в другой при нажатии кнопки на панели инструментов. Другими словами, когда появляется представление коллекции, удалите заголовок из его супервизора и добавьте его в качестве дополнительного заголовка. И когда метки отображаются, добавьте его как обычный вид, и когда появится представление tableview, добавьте его в виде заголовка. И так далее. Я считаю это наиболее подходящим решением без ошибок. – hasan83

+0

Вы еще это исправили? как вы его решили? – hasan83

3

Вы должны определить вид прокрутки размер содержимого

Создать выход к вашему Scrollview

@IBOutlet weak var scrollview : UIScrollView! 

Сделайте свою высоту, равную сумме высот заголовка, в TabBar и контейнера:

self.scrollView.contentSize = CGSizeMake(self.view.frame.width, header.frame.height + tabBar.frame.height + container.frame.height) 
+0

Я уже сделал это, и это некоторая строка печати, которую я имею при загрузке коллекции: - self.view.frame = (0.0, 64.0, 320.0, 416.0) - self.view.bounds = (0.0, 0.0, 320.0, 416,0) - self.tabBar.frame = (0,0, 275,0, 320,0, 50,0) - self.tabBar.bounds = (0,0, 0,0, 320,0, 50,0) - self.containerView.frame = (0,0, 325,0 , 320,0, 1763,0) - self.containerView.bounds = (0.0, 0.0, 320.0, 1763.0) - self.scrollView.frame (0.0, -20.0, 320.0, 436.0) - self.scrollView.bounds (0.0, 0.0 , 320,0, 436,0) - self.scrollView.contentSize (320.0, 2078.0) – user3369214

+0

Нет необходимости печатать границы. Координаты 'y' и высота неверны в' self.view.frame', они должны быть '(0.0, 0.0, 320.0, 568)', если вы имитируете приложение te на iphone 5/5s (посмотрите [здесь] (http://www.paintcodeapp.com/news/ultimate-guide-to-iphone-resolutions)). Вы не печатали рамку заголовка. и scrollView не должен быть на '-20', его координаты должны быть' (0,0,320,568) ' – Carpsen90

+0

Ну, это правда, я изменю это, но как это решит мою проблему? – user3369214

0

Это похоже на продолжение другой проблемы у вас есть mentioned in another question.

Если вы ищете иерархию раскадровки, я подозреваю, что проблема заключается в том, что вы не меняете высоту своего tab bar view при изменении размера содержимого прокрутки и высоты представления коллекции. Вид коллекции все еще отображается, вероятно, потому, что ваш контейнер tab bar view не содержит содержимого клипа (clipToBounds=false). Но поскольку само представление не распространяется так далеко, штрихи не распознаются представлением и его подзонами.

Убедитесь, что основной вид, вид содержимого прокрутки (размер содержимого), вид панели вкладок и вид коллекций изменены правильно. Поскольку вы решили не идти со стандартной иерархией представлений (дополнительное представление или представление заголовка), вам придется обрабатывать накладные расходы на управление границами представления самостоятельно.

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