0

我正在尝试实现类似于 tvOS 的视差效果。当用户指向一个单元格时(通过 iPadOS 中的鼠标或触控板),我希望光标采用单元格的形式。

我阅读并遵循了 Apple 的相关文档,请参见此处:https ://developer.apple.com/documentation/uikit/pointer_interactions/integrating_pointer_interactions_into_your_ipad_app

但是,我无法使这种效果在细胞上起作用。它适用于我添加到屏幕的随机 UIView,但绝不适用于 UICollectionView 单元格。

在这里,我将添加的 UIPointerInteraction 功能的代码粘贴到了一个基本的 UICollectionView 控制器中。在此示例中,单元格确实识别出它被指向。但是,它不会产生正确的效果(光标不会变形为单元格的大小。

注意:我在collectionView的cellForItemAt方法中调用了cell.addInteraction(UIPointerInteraction(delegate: self)) 。

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
    }
}

4

1 回答 1

0

当我将指针交互添加到其矩形完全填充有非透明视图的集合视图单元格时,我看不到任何视差。

当我将指针交互添加到其矩形未完全填充的集合视图单元格时(想想矩形内的圆形视图),我看到了视差。

用于指针交互的集合视图/单元格的代码也完全相同(很像上面的代码)。我的假设是,如果单元格内有(足够的?)透明度,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)))
}
于 2020-06-16T14:59:25.303 回答