Последняя ячейка в 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 как пользовательский в случае автоматического размера ячейки. Это сработало для меня.