当我连接IBOutlet

时间:2018-04-04 12:07:41

标签: swift xcode

我有一个IBAction连接到我的故事板中的按钮,播放声音。这很好用。但是,当我将IBOutlet连接到同一个按钮时,插座的代码接管并且IBAction停止工作。在这种情况下,IBOutlet用于使按钮脉冲具有动画。这是我的代码:

import UIKit
import Firebase
import AVFoundation

class Page1: UIViewController, AVAudioPlayerDelegate, UIAlertViewDelegate {
    @IBOutlet weak var scrollView: UIScrollView!
    @IBOutlet weak var pageControl: UIPageControl!
    @IBOutlet weak var testpulse: UIButton!

    override func viewDidLoad() {
        super.viewDidLoad()

        let url = Bundle.main.url(forResource: "ahh", withExtension: "mp3")

        do {
            ahh = try AVAudioPlayer(contentsOf: url!)
            ahh.prepareToPlay()

        }
        catch let error as NSError {
            print(error.debugDescription)
        }

        testpulse.isUserInteractionEnabled = true

        let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(Page1.addPulse))
        tapGestureRecognizer.numberOfTapsRequired = 1
        testpulse.addGestureRecognizer(tapGestureRecognizer)


    }

    @objc func addPulse(){
        let pulse = Pulsing(numberOfPulses: 1, radius: 110, position: testpulse.center)
        pulse.animationDuration = 0.8
        pulse.backgroundColor = UIColor.purple.cgColor

        self.view.layer.insertSublayer(pulse, below: testpulse.layer)
    }

    @IBAction func ahh(_ sender: Any) {
        ahh.play()
    }  
}

对于我的Swift动画文件,我有这个:

import UIKit

class Pulsing: CALayer {

    var animationGroup = CAAnimationGroup()

    var initialPulseScale:Float = 0
    var nextPulseAfter:TimeInterval = 0
    var animationDuration:TimeInterval = 1.5
    var radius:CGFloat = 200
    var numberOfPulses:Float = Float.infinity

    override init(layer: Any) {
        super.init(layer: layer)
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    init (numberOfPulses:Float = Float.infinity, radius:CGFloat, position:CGPoint) {
        super.init()

        self.backgroundColor = UIColor.black.cgColor
        self.contentsScale = UIScreen.main.scale
        self.opacity = 0
        self.radius = radius
        self.numberOfPulses = numberOfPulses
        self.position = position

        self.bounds = CGRect(x: 0, y: 0, width: radius * 2, height: radius * 2)
        //self.cornerRadius = radius

        DispatchQueue.global(qos: DispatchQoS.QoSClass.default).async {
            self.setupAnimationGroup()

            DispatchQueue.main.async {
                self.add(self.animationGroup, forKey: "pulse")
            }
        }

        setupAnimationGroup()

        self.add(animationGroup, forKey: "pulse")
    }

    func createScaleAnimation () -> CABasicAnimation {
        let scaleAnimation = CABasicAnimation(keyPath: "transform.scale.xy")
        scaleAnimation.fromValue = NSNumber(value: initialPulseScale)
        scaleAnimation.toValue = NSNumber(value: 1)
        scaleAnimation.duration = animationDuration

        return scaleAnimation
    }

    func createOpacityAnimation() -> CAKeyframeAnimation? {

        let opacityAnimation = CAKeyframeAnimation(keyPath: "opacity")
        opacityAnimation.duration = animationDuration
        opacityAnimation.values = [0.4, 0.8, 0]
        opacityAnimation.keyTimes = [0, 0.2, 1]

        return opacityAnimation
    }

    func setupAnimationGroup() {
        self.animationGroup = CAAnimationGroup()
        self.animationGroup.duration = animationDuration + nextPulseAfter
        self.animationGroup.repeatCount = numberOfPulses

        let defaultCurve = CAMediaTimingFunction(name: kCAMediaTimingFunctionDefault)
        self.animationGroup.timingFunction = defaultCurve

        self.animationGroup.animations = [createScaleAnimation(), createOpacityAnimation()!]
    }
}

当我将IBAction连接到我的按钮时,声音起作用。然而,当我连接IBOutlet时,动画有效,但IBAction没有。可能是什么导致了这个?它仍然连接在故事板中。

1 个答案:

答案 0 :(得分:0)

import UIKit
import Firebase
import AVFoundation

class Page1: UIViewController, AVAudioPlayerDelegate, UIAlertViewDelegate {
    @IBOutlet weak var scrollView: UIScrollView!
    @IBOutlet weak var pageControl: UIPageControl!
    @IBOutlet weak var testpulse: UIButton!

    override func viewDidLoad() {
        super.viewDidLoad()

        let url = Bundle.main.url(forResource: "ahh", withExtension: "mp3")

        do {
            ahh = try AVAudioPlayer(contentsOf: url!)
            ahh.prepareToPlay()

        }
        catch let error as NSError {
            print(error.debugDescription)
        }

        testpulse.isUserInteractionEnabled = true
    }

    @objc func addPulse(){
        let pulse = Pulsing(numberOfPulses: 1, radius: 110, position: testpulse.center)
        pulse.animationDuration = 0.8
        pulse.backgroundColor = UIColor.purple.cgColor

        self.view.layer.insertSublayer(pulse, below: testpulse.layer)
    }

    @IBAction func ahh(_ sender: Any) {
        ahh.play()
        addPulse()
    }  

}