2017-02-08 4 views
1

У меня есть контроллер CollectionView с макетом заказных 2 колонок:Swift: пейджинг на экране не работает для представления коллекции макета два столбца

class CVLayout: UICollectionViewFlowLayout { 

override init() { 
    super.init() 
    setupLayout() 
} 

required init?(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder) 
    setupLayout() 
} 

override var itemSize: CGSize { 
    set { 

    } 
    get { 
     let numberOfColumns: CGFloat = 2 

     let itemWidth = (self.collectionView!.frame.width - (numberOfColumns - 1))/numberOfColumns 
     return CGSize(width: itemWidth, height: itemWidth) 
    } 
} 

func setupLayout() { 
    minimumInteritemSpacing = 1 
    minimumLineSpacing = 1 
    scrollDirection = .horizontal 
} 

}

В моем контроллере я установил

class ViewController: UICollectionViewController { 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
    collectionView?.isScrollEnabled = true 
    collectionView?.isPagingEnabled = true 
} 

У меня есть 7 элементов, на экране отображается 6 элементов, и я ожидаю увидеть один элемент на следующей странице, но вместо этого я вижу 4 (3 на предыдущей странице) Я попытался сыграть с количество разделов и элементов в разделе, но это не помогает. То, что я нашел из других тем, заключается в том, что оповещение по умолчанию должно выполняться по экрану, а не по ячейке (в моем случае столбцу). Что я делаю не так?

ответ

1

Если я правильно понимаю ваш вопрос, я не думаю, что вы что-то не так само по себе. Размер содержимого представления коллекции определяется (частично) размером элемента. Сейчас это примерно ширина 3-х элементов (или половина страницы). Я думаю, вам нужно переопределить свойство размера содержимого коллекции, чтобы отражать полные страницы содержимого (в ширину) для достижения желаемого эффекта.

override var collectionViewContentSize: CGSize { 

    if let collectionView = collectionView { 
     let numberOfItems = collectionView.numberOfItems(inSection: 0) 
     let pages = numberOfItems/2 
     let size = CGSize(width: collectionView.frame.width * CGFloat(pages), height: collectionView.frame.height) 
     return size 
    } 

    return CGSize(width: 0, height: 0) 
} 

Пожалуйста, смотрите этот ответ How to expand UICollectionView contentSize when paging enable?. Это немного устарело, но я думаю, что он пытается решить ту же проблему.

+0

Вот что я искал! Я немного изменил код (вычисление количества страниц). И мне также пришлось вычитать высоту навигационного бара, потому что в противном случае мой просмотр коллекции подпрыгивал на свитке. Благодаря! –

0

Прежде всего UICollectionViewFlowLayout не поддерживает пейджинг

Есть два решения, которые я думаю,

первый

использование UIScrollView добавить 7 пунктов просто с возможностью подкачки

второй

использовать UICollectionView, изменяя ваш UICollectionViewFlowLayout

подкласс UICollectionViewFlowLayout для поддержки ПЕЙДЖИНГ

ех)

В Swift3

class CustomCollectionViewFlowLayout: UICollectionViewFlowLayout { 
    override func targetContentOffset(forProposedContentOffset proposedContentOffset: CGPoint, withScrollingVelocity velocity: CGPoint) -> CGPoint { 
     var offsetAdjustment = CGFloat.greatestFiniteMagnitude 
     let horizontalOffset = proposedContentOffset.x 
     let targetRect = CGRect(x: proposedContentOffset.x, y: 0, width: self.collectionView!.bounds.size.width, height: self.collectionView!.bounds.size.height) 
     for layoutAttributes in super.layoutAttributesForElements(in: targetRect)! { 
      let itemOffset = layoutAttributes.frame.origin.x 
      if abs(itemOffset - horizontalOffset) < abs(offsetAdjustment){ 
       offsetAdjustment = itemOffset - horizontalOffset 
      } 
     } 
     return CGPoint(x: proposedContentOffset.x + offsetAdjustment, y: proposedContentOffset.y) 
    } 
} 

Вы можете найти более подробную информацию о поиске UICollectionViewFlowLayout with Paging