it-roy-ru.com

UICollectionView с двумя заголовками

Наличие двух заголовков в UICollectionView?

У меня есть UICollectionView, который использует макет потока, который также имеет верхний и нижний колонтитулы:

---------   
| head  |
---------
| A | B |
---------
| C | D |
---------
| foot  |
---------

Иногда я хотел бы иметь два заголовка, вот так:

---------   
| head1 |
---------   
| head2 |
---------
| A | B |
---------
| C | D |
---------
| foot  |
---------

Я застрял на том, как этого добиться. Схема потока, кажется, позволяет только одну голову и одну ногу. Как я могу добавить второй заголовок?


Правка: я также реализовал липкие заголовки - http://blog.radi.ws/post/32905838158/sticky-headers-for-uicollectionview-using - но я только хочу, чтобы первый заголовок был липким. Вот почему я не могу просто включить все в один заголовок.

19
cannyboy

Вам просто нужно использовать простой трюк. Показать верхний и нижний колонтитулы для всех разделов.

В каком разделе вы не хотите показывать нижний колонтитул, просто передайте его нулевой размер как: -

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForFooterInSection:(NSInteger)section
{
    if(section==0)
    {
        return CGSizeZero;
    }

    return CGSizeMake(320, 50);
}

Здесь я использовал два раздела, как 

- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
{
    return 2;
}

И не передал ни одного ряда только в одном разделе, который является последним как 

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
    if (section==1) {
        return 20;
    }
    return 0;
}

И вот мой вывод ---

enter image description here

Red View - верхний колонтитул, а Green One - нижний колонтитул.

Здесь вы можете получить весь файл реализации

35
Warewolf

Этот контент может помочь вам достичь того, что вы хотите

создайте класс CollectionHeaderView и сделайте его производным от UICollectionReusableView и сделайте контейнер, а затем после make 2 uiview и поместите его в этот контейнер

- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath
{
    UICollectionReusableView *reusableview = nil;

    if (kind == UICollectionElementKindSectionHeader) {
        CollectionHeaderView *headerView = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"HeaderView" forIndexPath:indexPath];

        headerView.firstContainer.titleLabel.text = @"MY Header View 1";//Here you can set title 

        headerView.secondContainer.titleLabel.text = @"MY Header View 2";//Here you can set title  
        UIImage *headerImage = [UIImage imageNamed:@"header_banner.png"];
        headerView.firstContainer.backgroundImage.image = headerImage;
       headerView.secondContainer.backgroundImage.image = headerImage;

        reusableview = headerView;
    }

    if (kind == UICollectionElementKindSectionFooter) {
        UICollectionReusableView *footerview = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionFooter withReuseIdentifier:@"FooterView" forIndexPath:indexPath];

        reusableview = footerview;
    }

    return reusableview;
}
5
SachinVsSachin

Вы должны поместить оба заголовка (1 и 2) в другое представление и поместить это представление в качестве заголовка 1. Таким образом, создайте только заголовок в представлении коллекции.

4
rckoenes

Определите ваш UICollectionViewCell, который будет вашим видом заголовка вида UICollectionElementKindSectionHeader - в моем случае у меня есть два заголовка - OfferHeaderCell и APRHeaderCell, определенные ниже:

verticalCollectionView.register(UINib(nibName: "OfferHeaderCell", bundle: nil), forSupplementaryViewOfKind:UICollectionElementKindSectionHeader, withReuseIdentifier: "OfferHeaderCell")
verticalCollectionView.register(UINib(nibName: "APRHeaderCell", bundle: nil), forSupplementaryViewOfKind:UICollectionElementKindSectionHeader, withReuseIdentifier: "APRHeaderCell")

Продолжите и верните заголовок для каждого раздела, а затем установите размер заголовка раздела, чтобы иметь нулевой размер в этой функции UICollectionViewDelegateFlowLayout

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {
    if(section==0) {
        return CGSize.zero
    } else if (section==1) {
        return CGSize(width:collectionView.frame.size.width, height:133)
    } else {
        return CGSize(width:collectionView.frame.size.width, height:100)
    }

}

Важно определить viewForSupplementaryElementOfKind для двух разных разделов, как показано ниже:

func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {

    var reusableview = UICollectionReusableView()
    if (kind == UICollectionElementKindSectionHeader) {
        let section = indexPath.section
        switch (section) {
        case 1:
            let  firstheader: OfferHeaderCell = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "OfferHeaderCell", for: indexPath) as! OfferHeaderCell
            reusableview = firstheader
        case 2:
            let  secondHeader: APRHeaderCell = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "APRHeaderCell", for: indexPath) as! APRHeaderCell
            reusableview = secondHeader
        default:
            return reusableview

        }
    }
    return reusableview
}

И, наконец, источник данных,

func numberOfSections(in collectionView: UICollectionView) -> Int {
    return 3
}

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    if (section==2) {
        return 2
    }
    return 0
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = verticalCollectionView.dequeueReusableCell(withReuseIdentifier: "ReviseOfferCell", for: indexPath)
    cell.backgroundColor = UIColor.white
    return cell
}

Примечание: не забудьте добавить UICollectionFlowLayout, как показано ниже:

// MARK: UICollectionViewDelegateFlowLayout

extension MakeAnOfferController: UICollectionViewDelegateFlowLayout {

        func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {

            if indexPath.item == 0 {
                return CGSize(width: self.view.frame.size.width, height: 626.0)
            }
            return CGSize()
        }

        func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {

            if(section==0) {
                return CGSize.zero
            } else if (section==1) {
                return CGSize(width:collectionView.frame.size.width, height:133)
            } else {
                return CGSize(width:collectionView.frame.size.width, height:100)
            }
        }
    }
2
Tarun

Как вы добавляете один заголовок? Я полагаю, указав заголовки разделов? Рецепт с двумя заголовками будет иметь два подпредставления заголовка в одном главном представлении заголовка.

2
Nirav Bhatt

Что вы можете сделать, это использовать UITableView с двумя разделами и поместить UICollectionView в ячейку второго раздела.

2
DrBug

Получил эту работу, создав два представления в повторно используемом заголовке, реализуя липкий заголовок, только если раздел является вторым разделом. Кроме того, я настраиваю numberOfSection на 2. Получил переключение заголовков, скрывая и показывая представления в viewForSupplementaryElementOfKind.

0
John Paul Manoza