NSCollectionView с верхним и нижним колонтитулом

Мне нужно что-то вроде этого:

введите здесь описание изображения

Но мой код делает это:

введите здесь описание изображения

func collectionView(collectionView: NSCollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> NSView {
    let a = myView()
    if kind == NSCollectionElementKindSectionHeader {
        a.frame = NSMakeRect(0, 0, 1000, 10)
    }
    else if kind == NSCollectionElementKindSectionFooter {
        a.frame = NSMakeRect(0, 0, 1000, 12)
    }
    return a
}

func numberOfSectionsInCollectionView(collectionView: NSCollectionView) -> Int {
    return 3
}

override func numberOfItemsInSection(section: Int) -> Int {
    if section == 0 {
        return 5
    }
    else if section == 1 {
        return 5
    }
    return 10
}

Два верхних и нижних колонтитула находятся в позиции x=0,y=0, так как же вычислить позицию y из моих пользовательских представлений (верхний и нижний колонтитулы)?


person Geek20    schedule 13.01.2016    source источник
comment
Вам нужна горизонтальная прокрутка или фиксированная ширина?   -  person Arun Ammannaya    schedule 13.01.2016
comment
@ArunAmmannaya Фиксированная ширина   -  person Geek20    schedule 13.01.2016
comment
Тогда этого можно легко добиться с помощью UITableview. UITableview идеально подходит для таких требований.   -  person Arun Ammannaya    schedule 13.01.2016
comment
Вы используете для этого CollectionViewLayout?   -  person Harry Ng    schedule 13.01.2016
comment
@ArunAmmannaya numberOfItemsInSection возвращает числа динамики (этот код является примером).   -  person Geek20    schedule 13.01.2016
comment
Да. Тем не менее мы можем добиться этого с помощью UITableview. numberOfItemsInSection должен возвращать totalNumberOfItems/numberOfItemPerRow. Если элементы totalNumberOfItems не кратны numberOfItemPerRow, то последняя строка раздела должна скрывать лишние элементы.   -  person Arun Ammannaya    schedule 13.01.2016
comment
@HarryNg нет, должен?   -  person Geek20    schedule 13.01.2016
comment
@ArunAmmannaya как насчет перетаскивания? NSCollectionView делает это проще всего, не так ли?   -  person Geek20    schedule 13.01.2016
comment
Верхний и нижний колонтитул @Geek20 предоставляются в NSCollectionViewFlowLayout.   -  person Harry Ng    schedule 13.01.2016


Ответы (2)


Согласно примерному проекту Apple CocoaSlideCollection, верхний и нижний колонтитулы разделов доступны NSCollectionViewFlowLayout, подробнее см. AAPLBrowserWindowController и AAPLWrappedLayout.

Чтобы преобразовать в Swift и английский: P, краткое объяснение приведено ниже:

  1. Реализует протокол NSCollectionViewDelegateFlowLayout
  2. Реализует два метода referenceSizeForHeaderInSection и referenceSizeForFooterInSection
  3. viewForSupplementaryElementOfKind будет вызываться после шага 2

Для шага 3 я использую следующий код

func collectionView(collectionView: NSCollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> NSView {
    var nibName: String?
    if kind == NSCollectionElementKindSectionHeader {
        nibName = "Header"
    } else if kind == NSCollectionElementKindSectionFooter {
        nibName = "Footer"
    }
    let view = collectionView.makeSupplementaryViewOfKind(kind, withIdentifier: nibName!, forIndexPath: indexPath)
    return view
}

Используемый здесь идентификатор nibName ссылается на два файла пера, которые я создал для установки NSView, а именно Header.xib и Footer.xib

Это результат collectionView, который я получаю.

NSCollectionView с верхним и нижним колонтитулом

Надеюсь, это поможет, я создаю видеоурок для этого. Помогите поможет.

Редактировать 1:

Доступен пример кода

person Harry Ng    schedule 13.01.2016

Я думаю, вы должны проверить две вещи

Во-первых, нажмите на инспектор атрибутов представления коллекции.

вы можете увидеть два флажка, как это

аксессуары * раздел Верхний колонтитул, раздел Нижний колонтитул

Во-вторых, ключевое слово override.

Я думаю, вы должны поставить ключевое слово override перед вашим ключевым словом func!

person Lucy Jeong    schedule 13.01.2016
comment
Конечно; почему override? Он просто реализует функцию в протоколе. Компилятор должен жаловаться, что это не метод переопределения. - person Nicolas Miari; 13.01.2016
comment
Вы уверены насчет верхнего и нижнего колонтитула раздела? потому что я их не вижу. Xcode 7.2 - person Geek20; 13.01.2016
comment
@NicolasMiari о, я не знаю об этом, если это протокол, это не проблема! - person Lucy Jeong; 13.01.2016
comment
@ Geek20, если щелкнуть пустую область в раскадровке представления коллекции, вы увидите раздел аксессуаров в инспекторе атрибутов. Он доступен в Xcode 7.2. - person Lucy Jeong; 13.01.2016
comment
@Люси права. Инспектор атрибутов выглядит совершенно иначе для приложений OSX и приложений iOS. Нет группы флажков «Аксессуары». - person Nicolas Miari; 13.01.2016
comment
Но есть размер заголовка и размер нижнего колонтитула. Убедитесь, что они не равны 0. - person Nicolas Miari; 13.01.2016
comment
@NicolasMiari Я установил значения размера заголовка и размера нижнего колонтитула, но это не работает. - person Geek20; 13.01.2016