UICollectionView: добавление одного признака распознавания жесткого диска для дополнительного просмотра

У меня есть UICollectionView с дополнительным представлением - по существу, заголовок для коллекции. Всякий раз, когда я добавляю распознаватель жестов в UILabel в headerView.xib, используя конструктор интерфейса, приложение аварийно завершает работу, предоставляя мне

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'invalid nib registered for identifier (MY_HEADER) - nib must contain exactly one top level object which must be a UICollectionReusableView instance'

Что мешает мне добавлять распознаватель жестов в UILabel в дополнительном представлении UICollectionView?

Ответ 1

Итак, похоже, что вы не можете использовать построитель интерфейсов, чтобы добавить распознаватель жестов в дополнительное представление UICollectionView.

Я считаю, что это связано с тем, что при загрузке .xib UICollectionView должен отображаться как одно для супервизора - и когда вы добавляете распознаватель жестов к этому UICollectionView, вы получаете две вещи на уровне супервизора, которые оба соответствуют UICollectionView.

Однако вы можете реализовать свой распознаватель жестов программным путем, используя определение вашего дополнительного представления внутри протокола UICollectionViewReusableView. (Если используется для различения дополнительного представления заголовка и дополнительного нижнего колонтитула позже в коде)

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

    // call headerView methods (to put things into the header UI objects for example)
    [headerView ...];
    [headerView ...];
    [headerView ...];

    // add gesture recognition for tapping on a UIlabel within the header (UICollectionView supplementary view)
    UITapGestureRecognizer *bioTap = [[UITapGestureRecognizer alloc] initWithTarget:headerView action:@selector(handleUILabelTap:)];
    // make your gesture recognizer priority
    bioTap.delaysTouchesBegan = YES;
    bioTap.numberOfTapsRequired = 1;
    [headerView.UILabelName addGestureRecognizer:UILabelTap];

    reusableview = headerView;
}

Ответ 2

Я тоже не смог добавить жест в ячейку через IB.

Однако, мой опыт заключается в том, что с помощью IB вы можете добавить распознаватель жестов к самому коллекционному элементу, перетащив его в элемент collectionView в виде контура НЕ в scrollView, который лежит поверх коллекцииView в графическом представлении.

До сих пор я могу получить только один канал через ячейку и в collectionView.

Ответ 3

Как добавить его программным образом после загрузки загрузочного буфера? альтернативно, в IB вы попытались переместить местоположение значка, который представляет распознаватель выше или ниже того, который представляет представление

Ответ 4

Я добавляю распознаватель жестов, когда дополнительный вид загружен из пера.

class MySuppleMentaryView: UICollectionReusableView
{

    @IBOutlet var label: UILabel!

    weak var delegate: MySuppleMentaryViewDelegate!

    override func awakeFromNib() {
        super.awakeFromNib()

        // NOTE: UILabel MUST enable user interaction to receive touch events.
        // label.isUserInteractionEnabled = true

        let tap = UITapGestureRecognizer(target: self, action: #selector(onClickLabel))
        tap.delaysTouchesBegan = true
        tap.numberOfTapsRequired = 1

        self.label.addGestureRecognizer(tap)
    }

    @objc func onClickLabel() {
        self.delegate.didOnLabel(cell: self)
    }
}

protocol MySuppleMentaryViewDelegate: NSObjectProtocol {
    func didOnLabel(cell: DCScheduleHourLabel)
}

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

    if (kind == UICollectionElementKindSectionHeader) { 
        // NOTE: The cell might be reused.
        // If gesture recognizer is added HERE, 
        // then maybe multiple gesture recognizers are added when reusing the cell. 
        let cell = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: DCScheduleDummyBlock.Identifier, for: indexPath) as! MySuppleMentaryView

        // configure cell
        cell.delegate = self
        return cell                
    }

    return UICollectionReusableView()
}