let v: String! = str // 疑问,后面加!,什么意思?表示这个常量一定有值
Swift控制流: 如何理解 if let 与guard?
https://www.zhihu.com/question/36448325
语法糖
func doSomething(str: String?)
{
if let v = str
{
// use v to do something
}
}
func doSomething(str: String?)
{
guard let v = str else { return }
// use v to do something
}
// set up mask
mask = CALayer.init()
mask?.contents = UIImage.init(named: "twitterBird")?.cgImage
mask?.position = window.center
mask?.bounds = CGRect.init(x: 0, y: 0, 100, height: 80)
imageView?.layer.mask = mask
func animateMask() -> Void {
// init key frame animation
let keyFrameAnimation = CAKeyframeAnimation.init(keyPath: "bounds")// 注意此key不是自定义的,KVO
keyFrameAnimation.delegate = self
keyFrameAnimation.duration = 10
keyFrameAnimation.beginTime = CACurrentMediaTime() + 1
// animate zoom in and then zoom out
let initialBounds = NSValue.init(cgRect: (mask!.bounds))
let secondBounds = NSValue.init(cgRect: CGRect.init(x: 0, y: 0, 80, height: 64))
let finalBounds = NSValue.init(cgRect: CGRect.init(x: 0, y: 0, 2000, height: 2000))
keyFrameAnimation.values = [initialBounds, secondBounds, finalBounds]
// set up time interals
keyFrameAnimation.keyTimes = [0, 0.3, 1]// 这是个线性时间比例,例如:0.3*10(总时间)=3,是从initialBounds到secondBounds的动画时间;
// add animation to current view
keyFrameAnimation.timingFunctions = [CAMediaTimingFunction.init(name: kCAMediaTimingFunctionEaseInEaseOut),CAMediaTimingFunction.init(name: kCAMediaTimingFunctionEaseOut)]
mask!.add(keyFrameAnimation, forKey: "bounds")// 注意此key是自定义的,KVO
}
func animationDidStop(_ anim: CAAnimation, finished flag: Bool) {
imageView?.layer.mask = nil
}