【发布时间】:2016-10-19 23:11:48
【问题描述】:
【问题讨论】:
标签: xcode swift animation swift2 infinite-loop
【问题讨论】:
标签: xcode swift animation swift2 infinite-loop
适用于 iOS
UIViewAnimationOptions 集提供了不同的方便选项来实现漂亮和复杂动画的组合。对于您的特定场景,您将需要两个选项。
UIViewAnimationOptions.Repeat
UIViewAnimationOptions.AutoReverse
查看下面的代码实现。
代码:
class MyViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let view = UIView(frame: CGRect(x: 0, y: 0, width: 200, height: 200))
view.backgroundColor = UIColor.blueColor()
self.view.addSubview(view)
UIView.animateWithDuration(1,
delay: 0,
options: [UIViewAnimationOptions.Autoreverse, UIViewAnimationOptions.Repeat],
animations: {
view.backgroundColor = UIColor.clearColor()
},
completion: nil)
}
}
解释: 我已经为演示目的创建了一个带有特定框架的视图。
您感兴趣的部分是UIView.animateWithDuration 方法。请注意,我在options 参数中提供了一个数组[UIViewAnimationOptions.AutoReverse, UIViewAnimationOptions.Repeat]。
这两个选项足以实现如下所示的平滑且永久循环的动画。 https://s3.amazonaws.com/uploads.hipchat.com/37040/1764070/6Iow7n7WiWf6Naz/autoReverse.gif
如果您不想反转动画,只需从options 参数中的数组中删除UIViewAnimationOptions.AutoReverse。你会得到这样的动画。
https://s3.amazonaws.com/uploads.hipchat.com/37040/1764070/8fyRUlzqNHSQI47/noreverse.gif
【讨论】:
适用于 iOS
让viewSquare 成为您问题中蓝色方块的名称。
UIView.animate(withDuration: 0.5, delay: 0, options: [.repeat,.autoreverse], animations: {
viewSquare.alpha = 0.0
}, completion: nil)
【讨论】:
斯威夫特 5.1
let duration = 0.5
func fadeIn(finished: Bool) {
UIView.animate(withDuration: self.duration, delay: 0,
options: [.curveEaseInOut],
animations: { self.tftMap.alpha = 1 }, completion: self.fadeOut)
}
func fadeOut(finished: Bool) {
UIView.animate(withDuration: self.duration, delay: 0,
options: [.curveEaseInOut],
animations: { self.tftMap.alpha = 0 }, completion: self.fadeIn)
}
【讨论】:
我假设你正在为 iOS 编程。
试试duration 看看最适合你的:
class ViewController: UIViewController {
@IBOutlet weak var myView: UIView!
let duration = 0.5
override func viewDidLoad() {
super.viewDidLoad()
self.fadeOut(true)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
func fadeIn(finished: Bool) {
UIView.animateWithDuration(self.duration, delay: 0, options: [.CurveEaseInOut], animations: { self.myView.alpha = 1 } , completion: self.fadeOut)
}
func fadeOut(finished: Bool) {
UIView.animateWithDuration(self.duration, delay: 0, options: [.CurveEaseInOut], animations: { self.myView.alpha = 0 } , completion: self.fadeIn)
}
}
【讨论】:
.Repeat 和.Autoreverse 动画选项。
斯威夫特 5
这对我来说效果很好。我想为标签的连续淡入淡出制作动画,我将其放置在“cardHeaderView”UIView 中。
@IBOutlet weak var cardHeaderView: UIView!
把它放在“viewDidAppear”里面。我的延迟为零,因此动画会立即开始。
fadeViewInThenOut(view: cardHeaderView, delay: 0)
这里是函数。
func fadeViewInThenOut(view : UIView, delay: TimeInterval) {
let animationDuration = 1.5
UIView.animate(withDuration: animationDuration, delay: delay, options: [UIView.AnimationOptions.autoreverse, UIView.AnimationOptions.repeat], animations: {
view.alpha = 0
}, completion: nil)
}
【讨论】:
如果您想要可重复的淡入淡出动画,您可以使用CABasicAnimation 来实现,如下所示:
###首先创建方便的 UIView 扩展:
extension UIView {
enum AnimationKeyPath: String {
case opacity = "opacity"
}
func flash(animation: AnimationKeyPath ,withDuration duration: TimeInterval = 0.5, repeatCount: Float = 5){
let flash = CABasicAnimation(keyPath: AnimationKeyPath.opacity.rawValue)
flash.duration = duration
flash.fromValue = 1 // alpha
flash.toValue = 0 // alpha
flash.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeInEaseOut)
flash.autoreverses = true
flash.repeatCount = repeatCount
layer.add(flash, forKey: nil)
}
}
###如何使用:
// You can use it with all kind of UIViews e.g. UIButton, UILabel, UIImage, UIImageView, ...
imageView.flash(animation: .opacity, withDuration: 1, repeatCount: 5)
titleLabel.flash(animation: .opacity, withDuration: 1, repeatCount: 5)
【讨论】: