8
votes

Limiter la zone défilable dans UiscrollView

J'ai un Uiscrollview qui fait défiler un UIView assez volumineux.

À certains moments, je veux limiter la zone que l'utilisateur peut faire défiler l'intérieur. Par exemple, je ne voudrais peut-être que pour leur permettre de visualiser le quart inférieur de la vue.

Je suis capable de limiter la zone en remplaçant ScrollViewDidscroll, puis appelant SetContentOffsetSet si la vue a été défilée trop loin. Mais de cette façon, je ne peux pas le faire rebondir le rebond aussi bien que l'UISCrollView peut naturellement faire naturellement lors du défilement au-delà des limites de l'UIView.

Y a-t-il un meilleur moyen de limiter la zone défilable dans un Uiscrollview?


0 commentaires

4 Réponses :


18
votes

Je changerais la propriété contenus de la vue de défilement à la taille de la zone que vous souhaitez que l'utilisateur puisse faire défiler l'intérieur et ajuster le cadre.origin de la sous-évaluation de la limite supérieure gauche que vous souhaitez apparaître (0 , 0) par rapport à la vue de défilement. Par exemple, si votre vue est de 800 points de haut et que vous souhaitez afficher le trimestre inférieur, définissez la hauteur du contenu de 200 et définissez le composant Y de la vue.Frame.origin à -600.


2 commentaires

Votre réponse était juste le bon conseil dont je devais résoudre un problème similaire que j'avais. Fondamentalement, la différence entre Uiscrollview.frame.Size et Uiscrollview.ContSeSize devient votre portion défilée autorisée. Vous pouvez jouer avec l'UIView qui est placé dans l'Uiscrollview n'importe quelle manière que vous souhaitez obtenir l'effet désiré que vous souhaitez utiliser l'UIView.frame et UIView.Size. Une fois que vous comprenez cela, la vie est bonne. Joyeux défilement! :)


Voici un exemple de solution qui encapsulée logique similaire: Github.com/ealeksandrov/eReRedictScrollView



7
votes

J'ai trouvé quelque chose qui fonctionne pour moi. Il vous permet de faire défiler jusqu'à point 0,0 mais pas plus loin: xxx

Vous pouvez faire la même chose pour le haut, le bas ou la droite (x ou y)


2 commentaires

Le problème avec cette méthode est que vous perdez le «rebond '» - où vous faites défiler au-delà de la région et que le rouleau s'enroule doucement lorsque vous lâchez.


Crap que vous avez raison, n'a pas lu correctement. Pourtant, peut-être que cela peut aider quelqu'un d'autre.



0
votes

Une autre approche consiste à remplacer la méthode UiscrollView S:

- (bool) Pointinide: (CGPoint) Point de point: (uievente *) Evénement . < / p>

retour oui permettra à l'utilisateur de faire défiler. Retourner NO ne sera pas.

Remarque: Cela désactivera toutes les touches à toutes les vues imbriquées dans le UISCrollView que Pointinide Retours NO à. Utile si la zone que vous ne voulez pas faire défiler de ne pas avoir d'interaction.


Cet exemple permet uniquement au Uiscrollview pour faire défiler lorsque l'utilisateur fait défiler l'utilisateur. un utableview . (A utableview et deux uIViews est immobéde à l'intérieur du uiscrollview ) xxx


0 commentaires

1
votes

Une petite amélioration de la réponse de Yoko dans SWIFT 4 sera

override func scrollViewWillBeginDecelerating(_ scrollView: UIScrollView) {
    if scrollView.contentOffset.y > 600 {
        let anim = UIViewPropertyAnimator(duration: 1, dampingRatio: 0.5) {
            scrollView.isScrollEnabled = false
            scrollView.setContentOffset(CGPoint(x: 0, y: 600), animated: false)
            scrollView.isScrollEnabled = true
        }
        anim.startAnimation()
    }
}


0 commentaires