Как добиться эффекта параллакса с помощью UIPointerInteraction для ячеек представления коллекции

Я пытаюсь добиться эффекта параллакса, похожего на эффект tvOS. Когда пользователь указывает на ячейку (с помощью мыши или трекпада в iPadOS), я хочу, чтобы курсор принимал форму ячейки.

Я прочитал и следовал документации Apple по этому вопросу, см. здесь: https://developer.apple.com/documentation/uikit/pointer_interactions/integrating_pointer_interactions_into_your_ipad_app

Однако я не могу заставить этот эффект работать с ячейками. Он работает со случайными UIView, которые я добавляю на экран, но никогда с ячейками UICollectionView.

Здесь я вставил код для добавленной функциональности UIPointerInteraction в голый базовый контроллер UICollectionView. В этом примере ячейка распознает, на что на нее указывают. Однако это не дает должного эффекта (курсор не трансформируется в размер ячейки.

Примечание. Я вызываю cell.addInteraction(UIPointerInteraction(delegate: self)) в методе cellForItemAt в collectionView.

extension CollectionViewController: UIPointerInteractionDelegate {


    func pointerInteraction(_ interaction: UIPointerInteraction, regionFor request: UIPointerRegionRequest, defaultRegion: UIPointerRegion) -> UIPointerRegion? {

         var pointerRegion: UIPointerRegion? = nil

         if let cell = interaction.view as? UICollectionViewCell {

             //pointer has entered one of the collection view cells
             pointerRegion = UIPointerRegion(rect: cell.bounds)
         }

         return pointerRegion
     }

    func pointerInteraction(_ interaction: UIPointerInteraction, styleFor region: UIPointerRegion) -> UIPointerStyle? {

        var pointerStyle: UIPointerStyle? = nil

        if let cell = interaction.view as? UICollectionViewCell {

            let parameters = UIPreviewParameters()
            parameters.visiblePath =  UIBezierPath(rect: cell.bounds)

            let targetedPreview =  UITargetedPreview(view: cell, parameters: parameters)

            let pointerEffect = UIPointerEffect.lift(targetedPreview)

            // Shape the pointer to match the inner path of this view.
            let pointerShape = UIPointerShape.path(UIBezierPath(rect: cell.bounds))

            pointerStyle = UIPointerStyle(effect: pointerEffect, shape: pointerShape)

        }

        return pointerStyle
    }
}


person P. B.    schedule 28.04.2020    source источник


Ответы (1)


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

Когда я добавляю взаимодействие с указателем в ячейку представления коллекции, прямоугольник которой не полностью заполнен (представьте круговое представление внутри прямоугольника), я вижу параллакс.

Код точно такой же для обоих представлений/ячеек коллекции для взаимодействия с указателем (так же, как ваш код выше). Я предполагаю, что Apple применяет параллакс только в том случае, если внутри ячейки есть (достаточная?) прозрачность.

Вот мой текущий код:

func pointerInteraction(_ interaction: UIPointerInteraction, regionFor request: UIPointerRegionRequest, defaultRegion: UIPointerRegion) -> UIPointerRegion? {
    return defaultRegion //I don't think you even need this method unless you want to change the region...
}

func pointerInteraction(_ interaction: UIPointerInteraction, styleFor region: UIPointerRegion) -> UIPointerStyle? {
    return UIPointerStyle(effect: .lift(.init(view: self)))
}
person maxpower    schedule 16.06.2020