Swift 平滑展开 UIView 动画
Smooth expanding UIView animation in Swift
目标:
如何为我想要展开以填满整个屏幕的 UIView
制作动画。 UIView
需要在动画时以平滑、均匀和平衡的方式扩展。
我在屏幕上放置了一个红色方块,一开始很小,然后扩展到适合屏幕。 (图 1。)
let subview = UIView()
subview.backgroundColor = .red
subview.frame = CGRect(x: 60, y: 200, width: 50, height: 50)
self.view.addSubview(subview)
Question:
In Swift 2 and Swift 3, using an animateWithDuration
, how do I
animate the the red square UIView
expanding in a balanced and even
manner in all directions to fill the whole screen?
UIView.animateWithDuration(1.0, delay: 0, options: nil, animations: {
?????
}, completion: nil)
图片1:
你可以试试这个,我把持续时间设置为 5 秒,但你明白了。
let viewWidth = view.frame.width
let viewHeight = view.frame.height
UIView.animate(withDuration: 5) {
subview.frame = CGRect(x: 0, y: 0, width: viewWidth, height: viewHeight)
}
看来你需要玩玩音阶了
class ViewController: UIViewController {
var subview:UIView!
@IBOutlet weak var animateButton:UIButton!
override func viewDidLoad() {
super.viewDidLoad()
subview = UIView()
subview.backgroundColor = .red
subview.frame = CGRect(x: 60, y: 200, width: 50, height: 50)
self.view.addSubview(subview)
self.view.bringSubview(toFront: animateButton)
}
@IBAction func animateButtonPressed(sender:UIButton) {
if(sender.tag == 0) {
let screenCenter = CGPoint(x:UIScreen.main.bounds.midX, y: UIScreen.main.bounds.midY)
let subviewCenter = self.view.convert(self.subview.center, to: self.view)
let offset = UIOffset(horizontal: screenCenter.x-subviewCenter.x, vertical: screenCenter.y-subviewCenter.y)
let widthScale = UIScreen.main.bounds.size.width/subview.frame.size.width
let heightScale = UIScreen.main.bounds.size.height/subview.frame.size.height
UIView.animate(withDuration: 1.0, animations: {
let scaleTransform = CGAffineTransform(scaleX: widthScale, y: heightScale)
let translateTransform = CGAffineTransform(translationX: offset.horizontal, y: offset.vertical)
self.subview.transform = scaleTransform.concatenating(translateTransform)
}, completion: { (finished) in
sender.tag = 1;
})
} else {
UIView.animate(withDuration: 1.0, animations: {
self.subview.transform = CGAffineTransform.identity
}, completion: { (finished) in
sender.tag = 0;
})
}
}
}
目标:
如何为我想要展开以填满整个屏幕的 UIView
制作动画。 UIView
需要在动画时以平滑、均匀和平衡的方式扩展。
我在屏幕上放置了一个红色方块,一开始很小,然后扩展到适合屏幕。 (图 1。)
let subview = UIView()
subview.backgroundColor = .red
subview.frame = CGRect(x: 60, y: 200, width: 50, height: 50)
self.view.addSubview(subview)
Question:
In Swift 2 and Swift 3, using an
animateWithDuration
, how do I animate the the red squareUIView
expanding in a balanced and even manner in all directions to fill the whole screen?UIView.animateWithDuration(1.0, delay: 0, options: nil, animations: { ????? }, completion: nil)
图片1:
你可以试试这个,我把持续时间设置为 5 秒,但你明白了。
let viewWidth = view.frame.width
let viewHeight = view.frame.height
UIView.animate(withDuration: 5) {
subview.frame = CGRect(x: 0, y: 0, width: viewWidth, height: viewHeight)
}
看来你需要玩玩音阶了
class ViewController: UIViewController {
var subview:UIView!
@IBOutlet weak var animateButton:UIButton!
override func viewDidLoad() {
super.viewDidLoad()
subview = UIView()
subview.backgroundColor = .red
subview.frame = CGRect(x: 60, y: 200, width: 50, height: 50)
self.view.addSubview(subview)
self.view.bringSubview(toFront: animateButton)
}
@IBAction func animateButtonPressed(sender:UIButton) {
if(sender.tag == 0) {
let screenCenter = CGPoint(x:UIScreen.main.bounds.midX, y: UIScreen.main.bounds.midY)
let subviewCenter = self.view.convert(self.subview.center, to: self.view)
let offset = UIOffset(horizontal: screenCenter.x-subviewCenter.x, vertical: screenCenter.y-subviewCenter.y)
let widthScale = UIScreen.main.bounds.size.width/subview.frame.size.width
let heightScale = UIScreen.main.bounds.size.height/subview.frame.size.height
UIView.animate(withDuration: 1.0, animations: {
let scaleTransform = CGAffineTransform(scaleX: widthScale, y: heightScale)
let translateTransform = CGAffineTransform(translationX: offset.horizontal, y: offset.vertical)
self.subview.transform = scaleTransform.concatenating(translateTransform)
}, completion: { (finished) in
sender.tag = 1;
})
} else {
UIView.animate(withDuration: 1.0, animations: {
self.subview.transform = CGAffineTransform.identity
}, completion: { (finished) in
sender.tag = 0;
})
}
}
}