2017-05-25 1 views
0

Mes maths sont nulles donc j'ai besoin d'aide sur celui-ci car il m'a fallu 2 heures jusqu'à maintenant et je n'ai nulle part où.Calcul du pourcentage de la moitié

J'ai un panneau coulissant tactile (similaire à la fonction «glisser vers la droite» que vous obtenez sur les cellules de la table). Voici un diagramme ascii moche

----------------------------- 
| Slide   | Reveal | 
----------------------------- 

Vous faites glisser le bit "slide" vers la gauche, pour afficher le bit de révélation. Ce que je veux maintenant faire est de travailler, combien de la révélation est affichée lorsque le toucher se termine, et soit enclencher pour ouvrir ou fermé.

Je sais que le révèle la largeur de la boîte est 110, je peux aussi travailler que si la lame est déplacée vers la gauche par -75, le « pourcentage ouvert » est de 75%

Open Percentage = left/width 

Je veux l'animation temps d'être 0,5 secondes du centre. Donc, si vous êtes à 50%, il faut 0,5 secondes pour s'ouvrir, et 49% prend 0,5 secondes pour fermer à proximité (ou environ, je sais que 49% serait un contact sous 0,5 secondes)

De même, si le curseur est seulement 20% d'ouverture, il devrait prendre 0,1 secondes pour se fermer, et 80% d'ouverture est de 0,1 secondes pour ouvrir. Je crois que je dois calculer le décalage de gauche, par rapport à la moitié de la largeur, calculer le pourcentage, puis appliquer ce pourcentage au temps d'animation de 0,5 maximum ... Mais c'est là où je suis coincé. Mise à jour: C'est ce que j'ai réussi à obtenir après un certain chemin et d'erreur, mais il se sent verbeux et désordonné. Définitivement un moyen plus facile!

  // Config 
      let maxAnimationTime = 0.5 

      // Get left offset 
      let absLeftOffset = abs(cell.leftContstraint.layoutConstraints[0].constant) 

      // Get width of action box 
      let actionBoxWidth = cell.revealView.frame.width 
      let halfActionBoxWidth = actionBoxWidth/2 

      // Are we opening or closing? 
      let snapOpen = absLeftOffset > halfActionBoxWidth 

      // Calculate the left position relative the half width 
      let xPos = snapOpen ? absLeftOffset - halfActionBoxWidth : absLeftOffset 

      // Calculate the percentage of the left percentage relative to the half width 
      let perc = snapOpen ? abs(xPos - halfActionBoxWidth)/halfActionBoxWidth : xPos/halfActionBoxWidth 

      // Use the percentage to calculate the animation time to apply 
      let animationTime = (Double(perc) * maxAnimationTime).round(to: 2) 
+0

Si vous connaissez le pourcentage que vous pouvez non seulement utiliser cette valeur pour le temps d'animation? Si elle est inférieure ou égale à 50%, il suffit d'utiliser la valeur en pourcentage pour le temps d'animation et si elle est supérieure à 50, alors utilisez '100 - percentageValue' comme temps d'animation. – Hodson

Répondre

1

S'il faut 0,5 seconde pour effectuer un accrochage à mi-course, il suffit de 1 seconde pour prendre toute la longueur. Votre temps d'accrochage est simplement le pourcentage de la largeur totale qu'il faut multiplier par le temps nécessaire pour parcourir toute la largeur.

Donc, si le curseur est claquer ouvert, il devrait prendre 1.0 x %from_left et si elle est serpentine fermée, il devrait prendre 1.0 x %from_right

Note, dans le bas, bien que je parle pour cent, je veux dire une fraction entre 0 et 1.

% Première calculate de droite:

let rightPercent = Double(displacementFromRight)/Double(width) 

si elle est supérieure ou égale à 0,5, vous devez calculer le leftPercent. Le leftPercent est 1 - rightPercent.

Si rightPercent est inférieur à 0,5, vous avez déjà le bon pourcentage, donc mettre tous ensemble:

let maxDuration: Double = 1 // Maximum snap time in seconds 
let duration: Double 
if rightPercent >= 0.5 
{ 
    // we will snap open 
    duration = (1 - rightPercent) * maxDuration 
} 
else 
{ 
    // we will snap closed 
    duration = rightPercent * maxDuration 
} 
+0

Incroyable, je viens de poster une mise à jour ma question pour montrer ce que j'ai réussi à réaliser. Votre solution est tellement plus condensée, je ne sais pas pourquoi je n'y ai pas pensé, semble si simple maintenant que ça a été expliqué! Merci pour votre aide, je vais supprimer le code moche que j'ai fait et utiliser le vôtre: D – TRG