2017-05-01 75 views
1

只是很快就想詢問我的一個小問題,試圖在我的快速應用程序的啓動屏幕中播放音效。我更加感到困惑 - 我在哪裏宣佈我的AVAudio播放器(在我的視圖控制器或Appdelegate中);但兩種方法都沒有成功。這裏就是我目前我的appDelegate文件Xcode - Swift;添加聲音效果發射屏幕

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

我更喜歡使用在AppDelegate中被宣佈

var audioPlayer = AVAudioPlayer() 

的方法中得到了(如你在代碼中所做的那樣)。

,並具有用於播放音頻

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") 

在您的應用程序玩這個聲音(和其他聲音太)隨時隨地,用最小的代碼重複。

0

當我想在飛濺時進行握手呼叫時,我遇到了一些類似的問題。但根據Apple UX的說法,用戶應該能夠儘快登陸。

啓動屏幕準備您的視圖和應用程序之前。我們無法控制它。 但是如果我們不在登陸視圖控制器中執行很多繁重的任務,或者在單獨的線程中執行此操作,則啓動屏幕時間可以縮短。這種方式啓動屏幕時間減少。

要做到這一點的聲音效果,你可以做一個初始的VC和調用複製相同的用戶界面作爲啓動畫面,所以過渡不會是可見的。並在那裏你可以執行你的音頻的東西viewDidLoad()viewDidAppear(animated:Bool)