-1

Es scheint, dass sich die anchor point meines buttonView basierend auf der Position view ändert. Ich möchte die buttonView in die Mitte von sich selbst schrumpfen, anstatt die Mitte von view. Ich habe mich gefragt, was ich falsch mache? Oder wenn ich Ankerpunkte komplett falsch verstehe? Ich habe versucht, einige Artikel zu lesen, aber sie schienen darauf hinzuweisen, dass der Ankerpunkt eines Objekts auf seine eigenen Koordinaten und nicht auf seine Super-Views verweist.Falsche Position des Ankerpunkts in CGPointApplyAffineTransform (iOS/Swift)

import UIKit 

class ViewController: UIViewController { 
    var buttonView:UIView! 
    var toggleButton:UIButton! 
    var isVisible = false 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 

     let buttonTitles = ["1", "2", "3"] 
     let size:CGFloat = 100.0 

     let viewSize = CGFloat(buttonTitles.count) * size 
     buttonView = UIView(frame: CGRectMake(40, 40, viewSize, viewSize)) 

     setAnchorPoint(CGPointMake(0.5, 0), forView: buttonView) 
     buttonView.layer.anchorPoint = CGPointMake(0.5, 0.0) 
     view.addSubview(buttonView) 

     for (index, title) in buttonTitles.enumerate() { 
      let button = UIButton(type: .Custom) as UIButton 
      button.frame = CGRectMake(0, size * CGFloat(index), size, size) 
      button.setTitle(title, forState: .Normal) 
      button.backgroundColor = UIColor.redColor() 
      buttonView.addSubview(button) 
     } 

     toggleButton = UIButton(type: .Custom) as UIButton 
     toggleButton.frame = CGRectMake(200, 100, 80, 50) 
     toggleButton.setTitle("Toggle", forState: .Normal) 
     toggleButton.backgroundColor = UIColor.purpleColor() 
     toggleButton.addTarget(self, action: #selector(ViewController.animate), forControlEvents: .TouchUpInside) 
     view.addSubview(toggleButton) 
    } 

    func setAnchorPoint(anchorPoint: CGPoint, forView view: UIView) { 
     var newPoint = CGPointMake(view.bounds.size.width * anchorPoint.x, view.bounds.size.height * anchorPoint.y) 
     var oldPoint = CGPointMake(view.bounds.size.width * view.layer.anchorPoint.x, view.bounds.size.height * view.layer.anchorPoint.y) 

     newPoint = CGPointApplyAffineTransform(newPoint, view.transform) 
     oldPoint = CGPointApplyAffineTransform(oldPoint, view.transform) 

     var position = view.layer.position 
     position.x -= oldPoint.x 
     position.x += newPoint.x 

     position.y -= oldPoint.y 
     position.y += newPoint.y 

     view.layer.position = position 
     view.layer.anchorPoint = anchorPoint 
    } 

    func animate() { 

     if (isVisible) { // collapse it 
      isVisible = false 

      UIView.animateWithDuration(0.5, animations: { 
       self.buttonView.transform = CGAffineTransformMakeScale(0.2, 0.2) 
      }) 
     } 

     else { // expand it 
      isVisible = true 

      UIView.animateWithDuration(0.5, animations: { 
       self.buttonView.transform = CGAffineTransformMakeScale(1.0, 1.0) 
      }) 
     } 
    } 
} 

Vor Toggle klicken: enter image description here

Nach Toggle klicken: enter image description here

Antwort

-1

Nevermind, stellt sich heraus, ich meine nur buttonView's Breite zu groß eingestellt.

Verwandte Themen