Xcode - Swift;为启动屏幕添加声音效果

时间:2017-05-01 06:38:04

标签: ios swift xcode swift3 launch

我真的很想查询一个小问题,我试图在我的快速应用程序的启动画面中播放声音效果。关于我在哪里声明我的AVAudio播放器(在我的视图控制器或Appdelegate中),我更加困惑;但这两种方法都没有成功。这是我目前在appDelegate文件中得到的内容

import UIKit
import AVFoundation

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?
    var audioPlayer = AVAudioPlayer()

        func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
            // Override point for customization after application launch.

            self.window = UIWindow(frame: UIScreen.main.bounds)
            self.window!.backgroundColor = UIColor(red: 9/255, green: 4/255, blue: 68/255, alpha: 1)
            self.window!.makeKeyAndVisible()

            // rootViewController from StoryBoard
            let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
            let navigationController = mainStoryboard.instantiateViewController(withIdentifier: "navigationController")
            self.window!.rootViewController = navigationController

            // logo mask
            navigationController.view.layer.mask = CALayer()
            navigationController.view.layer.mask!.contents = UIImage(named: "logo.png")!.cgImage
            navigationController.view.layer.mask!.bounds = CGRect(x: 0, y: 0, width: 60, height: 60)
            navigationController.view.layer.mask!.anchorPoint = CGPoint(x: 0.5, y: 0.5)
            navigationController.view.layer.mask!.position = CGPoint(x: navigationController.view.frame.width / 2, y: navigationController.view.frame.height / 2)

            // logo mask background view
            let maskBgView = UIView(frame: navigationController.view.frame)
            maskBgView.backgroundColor = UIColor.white
            navigationController.view.addSubview(maskBgView)
            navigationController.view.bringSubview(toFront: maskBgView)

            // logo mask animation
            let transformAnimation = CAKeyframeAnimation(keyPath: "bounds")
            transformAnimation.delegate = self as? CAAnimationDelegate
            transformAnimation.duration = 1
            transformAnimation.beginTime = CACurrentMediaTime() + 1 //add delay of 1 second
            let initalBounds = NSValue(cgRect: (navigationController.view.layer.mask!.bounds))
            let secondBounds = NSValue(cgRect: CGRect(x: 0, y: 0, width: 50, height: 50))
            let finalBounds = NSValue(cgRect: CGRect(x: 0, y: 0, width: 2000, height: 2000))
            transformAnimation.values = [initalBounds, secondBounds, finalBounds]
            transformAnimation.keyTimes = [0, 0.5, 1]
            transformAnimation.timingFunctions = [CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut), CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseOut)]
            transformAnimation.isRemovedOnCompletion = false
            transformAnimation.fillMode = kCAFillModeForwards
            navigationController.view.layer.mask!.add(transformAnimation, forKey: "maskAnimation")

            // logo mask background view animation
            UIView.animate(withDuration: 0.1,
                           delay: 1.35,
                           options: UIViewAnimationOptions.curveEaseIn,
                           animations: {
                            maskBgView.alpha = 0.0
            },
                           completion: { finished in
                            maskBgView.removeFromSuperview()
            })

            // root view animation
            UIView.animate(withDuration: 0.25,
                           delay: 1.3,
                           options: UIViewAnimationOptions(),
                           animations: {
                            self.window!.rootViewController!.view.transform = CGAffineTransform(scaleX: 1.05, y: 1.05)
            },
                           completion: { finished in
                            UIView.animate(withDuration: 0.3,
                                           delay: 0.0,
                                           options: UIViewAnimationOptions(),
                                           animations: {
                                            self.window!.rootViewController!.view.transform = CGAffineTransform.identity
                            },
                                           completion: nil
                            )

                            do {
                                self.audioPlayer = try AVAudioPlayer(contentsOf: URL.init(fileURLWithPath: Bundle.main.path(forResource: "startup", ofType: "wav")!))
                                self.audioPlayer.prepareToPlay()
                            }
                            catch {
                                print(error)
                            }
            })

            return true

    }



    func applicationWillResignActive(_ application: UIApplication) {
        // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
        // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.
    }

    func applicationDidEnterBackground(_ application: UIApplication) {
        // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
        // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
    }

    func applicationWillEnterForeground(_ application: UIApplication) {
        // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
    }

    func applicationDidBecomeActive(_ application: UIApplication) {
        // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
    }

    func applicationWillTerminate(_ application: UIApplication) {
        // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
    }


}

2 个答案:

答案 0 :(得分:3)

我喜欢使用的方法是声明

var audioPlayer = AVAudioPlayer()
AppDelegate中的

(就像你在代码中所做的那样)。

有一种播放音频的方法

func playSound(file:String, ext:String) -> Void {
    do {
        let url = URL.init(fileURLWithPath: Bundle.main.path(forResource: file, ofType: ext)!)
        audioPlayer = try AVAudioPlayer(contentsOf: url)
        audioPlayer.prepareToPlay()
        audioPlayer.play()
    } catch let error {
        NSLog(error.localizedDescription)
    }
}

这样,您可以致电

playSound(file: "startup", ext: "wav")

在您的应用中随时随地播放此声音(以及其他声音),只需最少的代码重复。

答案 1 :(得分:0)

当我想在启动时进行握手调用时,我遇到了一些类似的问题。但根据Apple UX,用户应该能够尽快登陆。

启动屏幕之前准备您的视图和应用程序。我们无法控制它。 但是如果我们在着陆视图控制器中没有做太多繁重的任务,或者在单独的线程中执行此操作,则可以减少启动屏幕时间。这样可以缩短启动时间。

要做到这种声音效果,您可以创建一个初始VC并调用复制与启动画面相同的UI,以便转换不可见。在那里,您可以在viewDidLoad()viewDidAppear(animated:Bool)

中执行音频内容