diff --git a/IOS/Task01:基础插件与功能/6. 动画、音频与视频.md b/IOS/Task01:基础插件与功能/6. 动画、音频与视频.md deleted file mode 100644 index d04b160..0000000 --- a/IOS/Task01:基础插件与功能/6. 动画、音频与视频.md +++ /dev/null @@ -1,166 +0,0 @@ -# 动画、音频与视频 - -## 动画 - -流畅的动画是 iOS 的灵魂所在。对于开发者而言,合理地使用动画,让用户体验得到提升是攻城狮们的必修课程。在前面的课程中我们 已经熟悉了对 Swift 的基础控件,接下来我们将把学习内容放到设计结构上。 - -对于动画的应用一般在 View 控件上,动画的种类大体上分为仿射变换、旋转变换以及平移三 种,对于动画过程中的速度时间我们都可以进行设置,这三种变换是所有动画的基础,例如:我们可以通过平移来实现 app 的加载和退场,可以使用仿射变换实现音乐播放时封面的动画,从而让用户有真实感。此外,我们还可以通过旋转来使整个程序增添一份趣味。下面的代码罗列了一些基本的动画使用方法,你需要熟练掌握并且试着学会如何应用。在 playgrounds 中: - -```swift -import UIKit -import PlaygroundSupport - -//初始化 View -let liveViewFrame = CGRect(x: 0, y: 0, width: 500, height: 500) let liveView = UIView(frame : liveViewFrame) liveView . -backgroundColor = . white - -PlaygroundPage . current . liveView = liveView -let smallFrame = CGRect(x: 0, y: 0, width: 100, height: 100) -let square = UIView(frame: smallFrame) -square.backgroundColor = .purple -liveView.addSubview(square) - -//添加动画 -UIView.animate(withDuration: 2.0) { - square . backgroundColor = . orange - let scaleTransform = CGAffineTransform(scaleX : 2.0 , y: 2.0) //添加仿射变换 - let rotateTransform = CGAffineTransform(rotationAngle: .pi)//添加旋转变换 - let translateTransform = CGAffineTransform(translationX:200, y: 200) //添加移动变换 - let comboTransform = scaleTransform.concatenating(rotateTransform ).concatenating (translateTransform ) square .transform = comboTransform //将三种变换合成 -} -``` - - - -## 短效果音播放 - -一个有趣的 app 离不开各种令人印象深刻的音效。在 Swift 中,我们通常使用 AudioToolbox 与 AVFoundation 来播放音频和视频。假设导入一个 30s 内的 wav 格式音频,并将其命名为 myVoice, 接下来,我们需要将该音频的所在路径设置为虚拟的 url 地址,并将音频播放的地址设置为该地址: - -```swift -import UIKit -import AudioToolbox - -class ViewController : UIViewController{ - override func viewDidLoad () { - super.viewDidLoad () - var _soundId : SystemSoundID = 0 - let path = Bundle.main.path(forResource: ”myVioce”,ofType: ”wav”) - let soundUrl = URL( fileURLWithPath : path ! ) - AudioServicesCreateSystemSoundID ( soundUrl as CFURL,&_soundId ) - AudioServicesAddSystemSoundCompletion(_soundId , nil , nil ,{(soundID , clientData ) −> Void in - print(”音频播放后重复之前的播放”) - AudioServicesPlaySystemSound ( soundID ) - }, nil) - AudioServicesPlaySystemSound ( _soundId ) - } -} -``` - - - -## 长音乐音乐播放 - -在一款 app 中,仅仅有 30s 的效果音可能还不够,有时候我们需要导入长音乐。Swift 中内置了一款音乐播放器,对于基础开发者来说足够应用。该播放器的设置过程和短效果音的思路相同,我们也需要设置 url 路径来导入我们的本地音乐。请注意,Swift 内置的音频播放器中并没有暂停和继续播放的功能,我们需要手动设置一个 Button 来实现该效果: - -```swift -import UIKit -import AVFoundation - -class ViewController: UIViewController,AVAudioPlayerDelegate { - var audioPlayer:AVAudioPlayer = AVAudioPlayer() - //初始化音乐播放器为 AVAudioPlayer 格式 - - override func viewDidLoad() { - super.viewDidLoad() - //令路径为项目文件下的音乐文件 - let path = Bundle.main.path(forResource: "兰亭序", ofType: "mp3") //将路径转化为 URL 路径 - let soundUrl = URL(fileURLWithPath: path!) - do{ - try audioPlayer = AVAudioPlayer(contentsOf: soundUrl) audioPlayer.volume = 1.0 - //音频音量为 1.0 - audioPlayer.numberOfLoops = -1 //-1 为无限循环播放 - audioPlayer.delegate = self audioPlayer.play() -} catch { - print(error) -} - //定义一个暂停/恢复播放按钮 - let stopMusic = UIButton(frame: CGRect(x: 20, y: 80, width: 280, height: 44)) - stopMusic.backgroundColor = UIColor.blue - stopMusic.setTitle("暂停/恢复音乐", for:UIControl.State.init(rawValue:0)) - - //为该按钮添加点击事件 - stopMusic.addTarget(self, action: #selector(ViewController.pauseOrResumeMusic), for: .touchUpInside) - self.view.addSubview(stopMusic) - } - - //填写 objc 方法 - @objc func pauseOrResumeMusic(){ - if self.audioPlayer.isPlaying{ - //isPlaying 判断音乐是否在播放,若播放则暂停,反之亦然 - self.audioPlayer.pause() - }else{ - self.audioPlayer.play() - } - } - - func audioPlayerBeginInterruption(_ player: AVAudioPlayer) { - print("被打断") - } - - func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) { - print("播放完成") - } -} -``` - -附件中携带了一份我自己制作的兰亭序伴奏demo.mp3,你可以用这个音频文件进行功能实现尝试。 - - - -## 视频播放 - -实现了音频播放,该如何实现视频播放呢?Swift 中内置了视频播放的功能,总体上来说,本地视频播放的思路和音频一样,都需要我们设置视频的 url 地址,将本地视频导入其中。在此之前我们需要导入 AVFoundation 头文件,在 `viewDidLoad()`中: - -```swift -let moviePath = Bundle.main.path(forResource: "movie", ofType: "mp4") -let movieURL = URL(fileURLWithPath: moviePath!) - -let avPlayer = AVPlayer(url: movieURL as URL) -let avPlayerLayer = AVPlayerLayer(player:avPlayer) -avPlayerLayer.frame = self.view.bounds -avPlayerLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill self.view.layer.addSublayer(avPlayerLayer) -avPlayer.play() -``` - - - -### 借助播放器 - -在上面的代码中,我们实现了视频的播放,不过你可能发现在该 项目中我们无法进行暂停与快进,更不用提画中画和声音等功能,要想实现这些内容,我们需要借助 Swift 内置的播放器: - -```swift -import UIKit -import AVFoundation -import AVKit - -class ViewController: UIViewController { - override func viewDidLoad() { - super.viewDidLoad() - //设置视频路径,令 URL 为预设地址 - let moviePath = Bundle.main.path(forResource: "movie", ofType: "mp4") - let movieURL = URL(fileURLWithPath: moviePath!) - //设置播放器 - let avPlayer = AVPlayer(url:movieURL as URL) - let playerVC = AVPlayerViewController() - playerVC.player = avPlayer - playerVC.videoGravity = AVLayerVideoGravity.resizeAspect - /*.resizeAspectFill 等比缩小,填满整个范围 - .resizeAspect 等比播放,中间播放 */ - playerVC.allowsPictureInPicturePlayback = true - playerVC.showsPlaybackControls = true playerVC.view.frame = self.view.bounds - playerVC.player!.play() - self.view.addSubview(playerVC.view) - } -} -``` -