美文网首页IT@程序员猿媛程序员
iOS红包雨代码实现效果总结

iOS红包雨代码实现效果总结

作者: 程序员_秃头怪 | 来源:发表于2019-04-03 22:15 被阅读9次

小编欢迎大家加入小编的iOS交流群:923910776,群里会提供相关面试资料,书籍欢迎大家入驻!

1、生成一个红包layer

    //创建画布
    let redPLayer = CALayer()
    redPLayer.bounds = CGRectMake(0, 0, 35, 46);
    redPLayer.anchorPoint = CGPointMake(0, 0)
    redPLayer.position = CGPointMake(0, -46)
    redPLayer.contents = UIImage(named: hbArr[Int(arc4random()%3)])!.CGImage
    self.bgView.layer.addSublayer(redPLayer)

2、添加layer的动画

    //画布动画
    //此处keyPath为CALayer的属性
    let  moveAnimation:CAKeyframeAnimation = CAKeyframeAnimation(keyPath:"position")
    //动画路线,一个数组里有多个轨迹点
    let screenW = UInt32(CGRectGetWidth(UIScreen.mainScreen().bounds))
    let screenH = CGRectGetHeight(UIScreen.mainScreen().bounds)
    moveAnimation.values = [NSValue(CGPoint: CGPointMake(CGFloat(Float(arc4random_uniform(screenW))), 0)),NSValue(CGPoint: CGPointMake(CGFloat(Float(arc4random_uniform(screenW))), screenH))]
    //动画间隔
    moveAnimation.duration = 5
    //重复次数
    moveAnimation.repeatCount = 1
    //动画的速度
    moveAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear)
    redPLayer.addAnimation(moveAnimation, forKey: "move")

3、定时生成红包

public func start() {
    self.timer?.invalidate()
    self.timer = nil

    self.timer =  NSTimer.scheduledTimerWithTimeInterval(0.5, target: self, selector: #selector(self.showRain), userInfo: "", repeats: true)
}

4、判断红包点击事件

@objc private func clickRedPacket(tapgesture:UITapGestureRecognizer) -> Void {
    let touchPoint = tapgesture.locationInView(self.bgView)

    if let sublayers = self.bgView.layer.sublayers {
        for e in sublayers.enumerate() {
            if (e.element.presentationLayer()?.hitTest(touchPoint) != nil) {
                print("点中了第\(e.index)个元素")

                let num = randomNums[Int(arc4random()%3)]
                if e.index != 0 && e.index % num == 0 {//不等于0切能被整除
                    self.stop()
                    if delegate != nil {
                        delegate?.clickRedPacket(e.index)
                    }
                }

                break
            }
        }
    }
}

5、停止红包雨

public func stop() {
    self.timer?.invalidate()
    //删除当前红包layers
    if let sublayers = self.bgView.layer.sublayers {
        for item in sublayers {
            item.removeAllAnimations()
            item.removeFromSuperlayer()
        }
    }

    self.dismiss()
}

代码参考
https://github.com/jackyshan/swifticonrain
(文章来源于网络,如有侵权请联系小编删除)

相关文章

网友评论

    本文标题:iOS红包雨代码实现效果总结

    本文链接:https://www.haomeiwen.com/subject/ehdtiqtx.html