0

Je définis une nouvelle valeur à targetContentOffset dans scrollViewWillEndDragging(_:withVelocity:targetContentOffset:) pour créer une solution de pagination personnalisée dans un UITableView. Cela fonctionne comme prévu lorsque vous définissez une coordonnée pour targetContentOffset dans la même direction de défilement que la vitesse pointe. Cependant, lorsque vous enclenchez "vers l'arrière" dans la direction opposée de la vélocité, il se "repositionne" immédiatement sans animation. Cela a l'air assez mauvais. Toutes les pensées sur la façon de résoudre cela.La mise à jour de targetContentOffset dans scrollViewWillEndDragging vers une valeur dans la mauvaise direction n'anime pas

func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) { 
    // a lot of caluculations to detemine where to "snap scroll" to 
    if shouldSnapScrollUpFromSpeed || shouldSnapScrollUpFromDistance { 
     targetContentOffset.pointee.y = -scrollView.frame.height 
    } else if shouldSnapScrollDownFromSpeed || shouldSnapScrollDownFromDistance { 
     targetContentOffset.pointee.y = -detailViewHeaderHeight 
    } 
} 

je pourrais potentionally calculer quand ce « bug » apparaît et peut-être utiliser une autre façon de « instantané de défilement ». Des suggestions sur la façon de le faire ou le résoudre en utilisant targetContentOffset.pointee.y comme d'habitude?

Répondre

0

J'ai trouvé une solution okey (ou solution de contournement). Faites-moi savoir si quelqu'un a une meilleure solution. Je viens de détecter quand le "snap scroll" non-animé non désiré apparaîtrait et ensuite au lieu de définir une nouvelle valeur à targetContentOffset.pointee.y je l'ai mis à la valeur de décalage actuelle (l'ai arrêtée) et ai fixé la valeur cible offset désirée avec scrollViews setContentOffset(_:animated:) à la place

if willSnapScrollBackWithoutAnimation { 
    targetContentOffset.pointee.y = -scrollView.frame.height+yOffset //Stop the scrolling 
    shouldSetTargetYOffsetDirectly = false 
} 

if let newTargetYOffset = newTargetYOffset { 
    if shouldSetTargetYOffsetDirectly { 
     targetContentOffset.pointee.y = newTargetYOffset 
    } else { 
     var newContentOffset = scrollView.contentOffset 
     newContentOffset.y = newTargetYOffset 
     scrollView.setContentOffset(newContentOffset, animated: true) 
    } 
} 
+0

Comment avez-vous détecté 'willSnapScrollBackWithoutAnimation'? –

+0

willSnapBackWithoutAnimation est défini sur true lorsque le défilement est dans un intervalle pouvant être espacé (yOffset de défilement) et que la vélocité est inférieure à la valeur souhaitée (1.0) et que la vélocité n'est pas 0. – Sunkas