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)
})
}
}
}