我正在努力实现与tvOS类似的视差效果。当用户指向一个单元格(通过iPadOS中的鼠标或触控板(时,我希望光标采用单元格的形式。
我阅读并遵循了苹果关于这方面的文档,请参阅此处: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
}
}
当我向矩形完全由不透明视图填充的集合视图单元格添加指针交互时,我看不到任何视差。
当我向矩形未完全填充的集合视图单元格添加指针交互时(想想矩形中的圆形视图(,我会看到视差。
指针交互的两个集合视图/单元格的代码也完全相同(与上面的代码非常相似(。我的假设是,只有当单元格内有(足够的?(透明度时,苹果才会应用视差。
这是我当前的代码:
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)))
}