2016-08-14 2 views
0

Ich möchte einen elastischen Gummi-Effekt machen, wenn ich über meinen Kreis wische. Ich eröffne mein Kreis auf diese Weise:Elastischer Gummiband-Effekt auf Kreis

import UIKit 

class ViewController: UIViewController { 

    let screenSize: CGRect = UIScreen.mainScreen().bounds 
    let g = ShapeView(origin: CGPoint(x: UIScreen.mainScreen().bounds.width/2, y: UIScreen.mainScreen().bounds.height/2)) 

    override func viewDidLoad() { 
     self.view.addSubview(g) 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 


    override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) { 
     for touch: AnyObject in touches { 
      let location = touch.locationInView(self.view) //Location of your finger 
      print((location.x/screenSize.width)) 

      self.view.test((location.x/screenSize.width), v: g); 

     } 
    } 
} 

import UIKit 

extension UIView { 

    func test(t : CGFloat, v : UIView){ 
     v.superview!.bringSubviewToFront(v) 
     v.transform = CGAffineTransformMakeScale(CGFloat(t) + 1,1); 
    } 
} 

class ShapeView: UIView { 

    let size: CGFloat = 150.0 

    init(origin: CGPoint) { 
     super.init(frame: CGRectMake(0.0, 0.0, size, size)) 
     self.center = origin 
     self.backgroundColor = UIColor.clearColor() 
    } 

    // We need to implement init(coder) to avoid compilation errors 
    required init(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

    override func drawRect(rect: CGRect) { 

     var path = UIBezierPath(ovalInRect: rect) 
      path.closePath() 
     UIColor.blackColor().setStroke() 


     path.fill() 
    } 
} 

Dies funktioniert wie erwartet. Ich bekomme diese Ansicht:

enter image description here Aber was ich will ist, dass, wenn ich über das Bild wische, dass es einen "klebrigen" Effekt bekommt. Etwas wie folgt aus:

enter image description here

Die blaue Linie ist die Mitte te tatsächlichen Kreis. Und es wird nach rechts gezogen. Es wird zu einer Finsternis aus der rechten Hälfte des Kreises. Dies geht auf Berührung. Wenn ich mich zurück bewege, wird es zu dem Kreis, der es war. Wie kann ich das machen?

Antwort

1

Verwenden Sie eine Maßstabsumwandlung. Wenn der Benutzer nach rechts zieht, wäre dies eine Skalentransformation, deren x-Komponente im Verhältnis zum Zuggrad größer als 1 ist und deren Komponente 1 ist.

Beachten Sie, dass Transformationen um die Mitte herum angewendet werden Standard, so dass das Bild auch nach links verschoben wird. Ich nehme an, dass das nicht das ist, was Sie wollen, also müssen Sie auch gleichzeitig mit einer Übersetzungstransformation kompensieren, die nach rechts zurückdrängt.

+0

Meinst du diese Funktion: CGAffineTransformMakeScale? – da1lbi3

+0

Sicher, das ist eine Möglichkeit, eine Maßstabsumwandlung zu machen. – matt

+0

Ihre Lösung hat für mich funktioniert. Aber wie kann ich die Transformation nur auf die rechte Seite meines Kreises anwenden? Ich habe meinen Code BTW aktualisiert. – da1lbi3