Последняя ячейка в UICollectionView обрезается

У меня есть UICollectionView, который отображает вертикальный список ячеек. Это в основном табличное представление, но я использую коллекционное представление для большего количества контроллеров того, как каждая ячейка размещается в представлении. По какой-то причине последняя ячейка в представлении коллекции обрезается. Я могу перетащить вверх, чтобы увидеть нижнюю половину, но как только я отпущу, представление коллекции возвращается на свое место, скрывая нижнюю половину последней ячейки. У меня есть XIB, который содержит представление коллекции, а затем я регистрирую ячейки представления коллекции из другой XIB. Весь этот вид помещен в навигационный контроллер программно. Я думаю, что это должно быть проблемой с autolayout. Поскольку я добавляю контроллер представления, содержащий представление коллекции, в контроллер навигации программным способом, между видом сбора и панелью навигации не устанавливаются никакие ограничения. Если я скрываю созданную панель навигации и просто перетаскиваю ее в IB, ячейка представления коллекции не обрезается. Но я не хочу делать это таким образом. Я попытался программно добавить ограничения, но это тоже не работает. У кого-нибудь есть предложения? Вот как я создаю контроллер навигации и помещаю в него контроллер представления, содержащий представление коллекции. Кроме того, код, который я пытался использовать для добавления ограничений, включает в себя. В настоящее время я делаю это в делегате приложения в didFinishLaunchingWithOptions:

self.homeViewController = [[FFHomeViewController alloc] init];
FFNavigationPanelViewController *navigationController = [[FFNavigationPanelViewController alloc] init];
UINavigationController *frontNavigationController = [[UINavigationController alloc] initWithRootViewController:self.homeViewController];
//    frontNavigationController.navigationBarHidden = YES;
UINavigationController *rearNavigationController = [[UINavigationController alloc] initWithRootViewController:navigationController];


NSLayoutConstraint *topConstraint = [NSLayoutConstraint constraintWithItem:self.homeViewController.collectionView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.homeViewController.navigationController.navigationBar attribute:NSLayoutAttributeBottom multiplier:1.0 constant:0.0];

[self.viewController.frontViewController.view addConstraint:topConstraint];

4 ответа

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

Я смог легко исправить это, установив sectionInset из collectionView,

Просто вставьте этот код в viewDidLoad() если ваш collectionView находится в ViewController или init метод, если это в XIB.

if let flowLayout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout {
  flowLayout.sectionInset.right = flowLayout.itemSize.width / 2
}

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

я использовал .right свойство, потому что я прокручиваю ячейки по горизонтали, в случае с вертикальной прокруткой collectionView просто используйте .bottom имущество.

Не очень хорошее решение, но, по крайней мере, это работает.

Я только столкнулся с подобной проблемой. Проблема связана с тем, что UICollectionView является подклассом UIScrollView, и по какой-то причине объем пространства, выделенный для содержимого, не обновляется, чтобы соответствовать фактическому количеству ячеек, которое у вас есть.

В вашем случае, с одним столбцом элементов, вам нужно установить contentSize вашего UICollectionView так, чтобы он соответствовал объему пространства, необходимому для виртуального отображения всех UICollectionViewCells.

Предполагая, что ваши ячейки имеют высоту 100 пикселей и у вас есть только один раздел, я бы добавил что-то вроде следующего в ViewWillAppear в View Controller:

int itemCount = [self.collectionView numberOfItemsInSection:0];
float contentHeight = (100*itemCount)+100;
CGRect screenFrame = [[UIScreen mainScreen]bounds];
self.collectionView.contentSize = CGSizeMake(screenFrame.size.width, frameHeight);

Добавление дополнительных 100 допускает некоторое пустое место в конце при прокрутке вниз.

Примечание: возможно, я столкнулся со странной ошибкой здесь. Когда я поместил эти вычисления в любой из viewWillLoad|viewWillAppear|viewDidAppear, он, похоже, не вступил в силу, но, как ни странно, помещение его в число OfItemsInSection работает. Это действительно не подходящее место для этого, но может быть побочным эффектом загрузки collectionView из XIB, а не создания его программно.

И последнее замечание: помещение кода contentSize в viewWillLayoutSubviews, кажется, приводит к соответствующему поведению.

С Swift 5 я добился успеха:

      myCollectionView.frame.size.width = myContainingView.bounds.width 

Попробуйте установить размер оценки элемента collectionView как пользовательский в случае автоматического размера ячейки. Это сработало для меня.

Другие вопросы по тегам