2017-08-10 2 views
1

J'essaie d'avoir ce mécanisme de rotation pour enclencher des angles droits, par ex. Lorsque l'utilisateur se rapproche de (85 à 95 degrés), il s'aligne automatiquement à 90 degrés jusqu'à ce qu'il s'éloigne de 85 ou 95 degrés.UIRotationGestureRecognizer à enclencher sur les angles droits

var lastRotation = CGFloat() 
func rotateAction(sender:UIRotationGestureRecognizer){ 


    let currentTransform = sender.view?.transform 
    let rotation = 0.0 - (lastRotation - sender.rotation) 
    let newTransform = currentTransform!.rotated(by: rotation) 

    let radians = atan2f(Float(sender.view!.transform.b), Float(sender.view!.transform.a)) 
    let degrees = radians * (180/.pi) 

    sender.view?.transform = newTransform 
    lastRotation = sender.rotation 
    if sender.state == .ended { 
     lastRotation = 0.0; 
    } 

    // The if statement works correctly when reaching the angles 
    if degrees > -95 && degrees < -85 { 

    } 
    else if degrees > -185 && degrees < -175 { 

    } 
    else if degrees > -275 && degrees < -265 { 

    } 
    else if degrees > -5 && degrees < 5 { 
     // So I tried this but it does not seem right, it always pushed it away from angle 0 
     lastRotation = CGFloat(0.0 - radians) 
    } 

} 
+0

J'imprimer vos calculs que vous allez - degrés sort réellement entre -180 ... 0 ... 180 ...- 180 etc – solenoid

+0

Aussi, gardez A l'esprit, sender.rotation est additif, c'est-à-dire que si vous faites plusieurs tours dans la même direction, ce sera 360, 720, 1080 (quoi que ce soit en rads). En allant dans l'autre sens, ce nombre diminuera. – solenoid

Répondre

0

Les mathématiques ne sont pas compatir avec les chèques que vous faites (la variable degrés va: -180 ... 0 ... 180 -> 0 -180 ... etc).

L'autre problème est que sender.rotation est cumulatif, ce qui signifie qu'il continuera d'ajouter ou de soustraire des rads lors de la rotation. Une fois que l'autre calcul est corrigé, je suggère quelque chose de semblable à ce qui suit pour vérifier les "accrochages".

let rad = fabs(sender.rotation.truncatingRemainder(dividingBy: 2 * CGFloat.pi)) 

    print("rotation", sender.rotation, degrees, rad) 

    switch rad { 
    case 1.48353...1.65806 : 
     print("do things") 
    case 3.05433...3.22886 : 
     print("do things") 
    case 4.62512...4.79966 : 
     print("do things") 
    case 0...0.0872665 : 
     print("this is check one of 2") 
    case 6.19592...6.28319 : 
     print("this is check two of 2") 
    default: 
     print("do other things") 
    } 

EDIT: https://developer.apple.com/documentation/uikit/uirotationgesturerecognizer/1624337-rotation

+0

Votre concept est correct – Sayed