В UICollectionView ячейки не будут сидеть на дне
Примечание оказалось, что это была простая ошибка, чтобы ячейки не "сидели на дне". Однако интересный вопрос: "Как перемещать ячейки вверх и вниз". Ниже решения грубой силы: создайте собственный макет потока.
Я был поражен тем, что единственный способ сделать это - полностью подкласс UICollectionViewFlowLayout
и написать некоторый хитрый код в layoutAttributesForElementsInRect
.
Возможно, это поможет кому-то в будущем, так как для layoutAttributesForElementsInRect
очень мало примеров кода. Надеюсь, что это поможет.
-
Оказывается причина, по которой мои ячейки не будут сидеть внизу, заключалась в том, что я ранее имел это в своем UICollectionViewController...
-(void)viewDidLoad
{
[super viewDidLoad];
// the following code is very useful to, for example,
// "nudge short lists towards the middle..." - if you want the list
// to more sit in the middle of the screen, when only a few items.
cvHeight = CGRectGetHeight(self.collectionView.bounds);
[self.collectionView setContentInset:
UIEdgeInsetsMake(cvHeight * 0.175, 0, cvHeight * 0.30, 0) ]; //top,l,b,r
}
конечно, когда я изменился на "размер ячейки полного вида" (по одной ячейке на экран), этот код не работает.
У меня есть простой вид UICollection, который представляет собой ширину iPhone и около 250. Ячейки имеют тот же размер, что и представление коллекции.
Клетки не центрируются, они всегда сидят высоко. (то есть вне представления.)
![enter image description here]()
Мой размер коллекции "размеры" в раскадровке - всего лишь нуль. В чем может быть проблема?
Ответы
Ответ 1
Вот один из способов "грубой силы" решить проблему - написать свой собственный FlowLayout !!
Это работает...
class SimpleFlowLayout: UICollectionViewFlowLayout {
override init() {
super.init()
initialize()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
initialize()
}
func initialize() {
self.scrollDirection = .horizontal
self.minimumInteritemSpacing = 0.0
self.minimumLineSpacing = 0.0
}
override var collectionViewContentSize: CGSize {
return super.collectionViewContentSize
}
override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
let allItems = super.layoutAttributesForElements(in: rect)
for attribute in allItems! {
print ("attribute.frame.origin.y ..... \(attribute.frame.origin.y)")
attribute.frame = CGRect(x: attribute.frame.origin.x,
y: attribute.frame.origin.y + 34,
width: attribute.frame.size.width,
height: attribute.frame.size.height)
// "go figure" ... add 34
}
return allItems;
}
То, как вы "устанавливаете" UICollectionViewFlowLayout, в основном так...
class YourFancyDisplay: UICollectionViewController {
override func viewDidLoad() {
super.viewDidLoad()
collectionView!.contentInset = UIEdgeInsetsMake(0, 0, 0, 0)
collectionView!.collectionViewLayout = SimpleFlowLayout()
...
Ответ 2
Попробуйте это. надеюсь, это может помочь
-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
return collectionView.frame.size;
}
(Для будущих читателей, действительно, вы также, как правило, нуждаетесь в другом...)
-(CGSize) collectionView:(UICollectionView *)collectionView
layout:(UICollectionViewLayout *)collectionViewLayout
sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
return self.view.frame.size;
}
-(UIEdgeInsets)collectionView:(UICollectionView *)collectionView
layout:(UICollectionViewLayout*)collectionViewLayout
insetForSectionAtIndex:(NSInteger)section
{
return UIEdgeInsetsMake(0,0,0,0); //t,l,b,r
}