2016-02-12 2 views
4

Что я хочу сделать, так это отобразить UICollectionView внутри UICollectionViewCell, когда эта ячейка выбрана. Я хочу использовать rbcollectionviewinfofolderlayout, чтобы сложить мой просмотр коллекции и показать новый вид коллекции внутри этого. Однако я не уверен, как это реализовать в моем существующем коде. У меня три вида просмотра внутри одного представления. Я скрываю и раскрываю свои взгляды в зависимости от того, какой пользователь делает выбор. Я использую пользовательскую ячейку xib для ячеек внутри своих представлений коллекции, и у меня есть пользовательский метод collectionviewflowlayout, который гарантирует, что всегда будут отображаться только 3 ячейки по ширине устройства.Как использовать rbcollectionviewinfofolderlayout с пользовательским UICollectionViewCell & CollectionViewLayout

Это то, что выглядит мой контроллер представления.

в моем представленииDidLoad Мне нужно установить RBCollectionViewInfoFolderLayout в мой просмотр коллекции. Как вы видите, переменная layout содержит мой CustomCollectionViewFlow, который я установил как макет представления коллекции, прежде чем я внедрил RBCollectionviewinfofolderlayout.

override func viewDidLoad() { 
    super.viewDidLoad() 

    musicLib.loadLibrary() 

    PlaylistCollectionView.indicatorStyle = UIScrollViewIndicatorStyle.White 
    AlbumCollectionView.indicatorStyle = UIScrollViewIndicatorStyle.White 
    ArtistCollectionView.indicatorStyle = UIScrollViewIndicatorStyle.White 

    layout = CustomCollectionViewFlow() 

    cview = ArtistCollectionView 

    let lay: RBCollectionViewInfoFolderLayout = ArtistCollectionView.collectionViewLayout as! RBCollectionViewInfoFolderLayout 
    lay.cellSize = CGSizeMake(80, 80) 
    lay.interItemSpacingY = 10 
    lay.interItemSpacingX = 0 

    let nib = UINib(nibName: "CollectionViewCell", bundle: nil) 

    cview.registerClass(UICollectionReusableView.self, forSupplementaryViewOfKind: RBCollectionViewInfoFolderHeaderKind, withReuseIdentifier: "header") 
    cview.registerClass(UICollectionReusableView.self, forSupplementaryViewOfKind: RBCollectionViewInfoFolderFooterKind, withReuseIdentifier: "footer") 
    cview.registerClass(collectionViewFolder.self, forSupplementaryViewOfKind: RBCollectionViewInfoFolderFolderKind, withReuseIdentifier: "folder") 
    cview.registerClass(RBCollectionViewInfoFolderDimple.self, forSupplementaryViewOfKind: RBCollectionViewInfoFolderDimpleKind, withReuseIdentifier: "dimple") 


    ArtistCollectionView.collectionViewLayout = lay 
    ArtistCollectionView.registerNib(nib, forCellWithReuseIdentifier: "item") 
    ArtistCollectionView.dataSource = self 
    ArtistCollectionView.delegate = self 

    PlaylistCollectionView.collectionViewLayout = layout 
    PlaylistCollectionView.registerNib(nib, forCellWithReuseIdentifier: "item") 
    PlaylistCollectionView.dataSource = self 

    AlbumCollectionView.collectionViewLayout = layout 
    AlbumCollectionView.registerNib(nib, forCellWithReuseIdentifier: "item") 
    AlbumCollectionView.dataSource = self 
} 

Мои CustomCollectionViewFlow выглядит следующим образом

class CustomCollectionViewFlow: 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 = 3 

     let itemWidth = (CGRectGetWidth(self.collectionView!.frame) - (numberOfColumns - 1))/numberOfColumns 
     return CGSizeMake(itemWidth, itemWidth) 
    } 
} 

func setupLayout() { 
    minimumInteritemSpacing = 0 
    minimumLineSpacing = 0 
    scrollDirection = .Vertical 
} 

} 

я проведу из по наведению все мои кодирования здесь, как это будет становиться на большой поста и другие methodes являются своего рода неуместным в этой точке , Однако то, что я сделал, - это пример приложения, которое я сделал для этого на git here для тех, кто хочет его проверить.

Это изображение показывает, какое состояние моего просмотра было до того, как я внедрил rbcollectionview. Второе изображение показывает, что я пытаюсь достичь

enter image description here

Это как вид должен выглядеть, когда элемент прослушивают

enter image description here

EDIT

I были в состоянии заставить его работать. Мне удалось показать макет, как я и хотел. Так же, как и у меня, прежде чем я выполнил rbcollectionviewinfofolderlayout. Однако кажется, что когда папка больше, чем размер экрана, она фактически не будет складываться. Он будет складываться на секунду и снова рушиться. Это может быть вызвано макетом, который я реализовал. Ниже приведен код, который отвечает за это.

класс, который отвечает за мой макет

class RBCollectionLayout: RBCollectionViewInfoFolderLayout 
{ 
    var view: UIView! 
    init(view: UIView){ 
     super.init() 
     self.view = view 
     setupLayout() 
    } 

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

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

func setupLayout(){ 
    let numberofItems: CGFloat = 3 

    let itemWidth = (CGRectGetWidth(view.frame))/numberofItems 
    cellSize = CGSizeMake(itemWidth, itemWidth) 

    interItemSpacingX = 0 
    interItemSpacingY = 0 
} 
} 

Метод, который рассчитает желаемая с тем, когда на экране меняется с портретной на ландшафтную

override func viewWillLayoutSubviews() { 
    super.viewWillLayoutSubviews() 

    if(view_artist.hidden == false){ 
     guard let ArtistFlowLayout = ArtistCollectionView.collectionViewLayout as? RBCollectionViewInfoFolderLayout else { 
      return 
     } 
     lay = RBCollectionLayout(view: self.view) 
     ArtistCollectionView.collectionViewLayout = lay 
     ArtistFlowLayout.invalidateLayout() 
    } 
} 

это как макет быть установить в моем viewdidload

lay = RBCollectionLayout(view: self.view) 
ArtistCollectionView.collectionViewLayout = lay 

снова весь мой код доступен на моем мерзавца here

ответ

0

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

Вам кажется, что отсутствует ключевой компонент, который является методом делегата collectionView:viewForSupplementaryElementOfKind:atIndexPath:, где вы сообщаете CollectionView, какие представления использовать для различных элементов. Если вы перейдете к GitHub Repo и посмотрите на пример, вы увидите, что в этом методе я возвращаю 4 разных вида в зависимости от запрошенного viewKind. В вашем коде я верю, что вы хотите, чтобы вернуть свой собственный формат представления на основе потока на основе RBCollectionViewInfoFolderFolderKind. Это поместит ваш вид раскладки трех ячеек в расширенную папку выбранной ячейки.

Я клонировал ваше репо, но он, похоже, не обновлен кодом, который вы показываете здесь.

+0

У меня есть этот метод. Я посмотрю на это, постараюсь, и посмотрим, удастся ли это исправить, но у меня возникают сомнения. Черт, я, должно быть, забыл нажать на git. Я тоже сделаю это – NoSixties

+0

Я просто нажал код на свой git. Пожалуйста, взгляните на него снова, если сможете, потому что, поскольку я подозревал, что ваше предложение не сделало это для меня, к сожалению – NoSixties

+0

Я только что обновил свой git снова. Я смог создать макет, как это было раньше, в моем макете. У меня ошибка с папкой, складывающейся сейчас, когда ее прослушивают. Похоже, что он работает глючит, когда папка больше, чем экран. Я тоже редактировал свой вопрос. – NoSixties

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