Ios swift spritkit场景中的淡入淡出视频
我正在将一个展厅应用程序从as3/starling移植到一个本地的swift iPad应用程序 我有两个问题:Ios swift spritkit场景中的淡入淡出视频,ios,swift,sprite-kit,Ios,Swift,Sprite Kit,我正在将一个展厅应用程序从as3/starling移植到一个本地的swift iPad应用程序 我有两个问题: 如何在spritekit内容上淡入视频(从alpha 0到1) 如何在不显示iOS屏幕音量通知图形的情况下,通过单个UI元素控制iPad音量 我的第一个答案回答了您最初的问题,这个答案是针对评论中发布的后续问题定制的。我觉得这两个答案对社区都是有用的,而不是仅仅合并成一个我认为会令人困惑的答案 在这里,我实现了一个音量滑块和一个拖动滑块,用于控制VideoNode的AVPlayer对象
我的第一个答案回答了您最初的问题,这个答案是针对评论中发布的后续问题定制的。我觉得这两个答案对社区都是有用的,而不是仅仅合并成一个我认为会令人困惑的答案 在这里,我实现了一个音量滑块和一个拖动滑块,用于控制VideoNode的AVPlayer对象。。您可以使用AVPlayer的全部功能,但也可以使用SKVideoNode的便利性。此外,无需调整系统音量和随后的灰色音箱弹出窗口,即可控制播放视频的音量:
import SpriteKit
import MediaPlayer
class GameScene: SKScene {
let seekSlider = UISlider(frame: CGRect(x: 0, y: 0, width: 200, height: 15))
let volSlider = UISlider(frame: CGRect(x: 0, y: 0, width: 200, height: 15))
// Because it takes time for us to load the video, we don't know it's duration,
// hence we don't know what the `.maximumValue` should be for the seekSlider
let defaultMax = Float(0.123456789)
var player: AVPlayer!
var videoNode: SKVideoNode!
func seekSliderChangedValue(sender: UISlider) {
// Wait for file to finish loading so we can get accurate end duration:
if sender.maximumValue == defaultMax {
if CMTimeGetSeconds(player.currentItem!.duration).isNaN { return }
else { sender.maximumValue = Float(CMTimeGetSeconds(player.currentItem!.duration)) }
}
let value = CMTimeMake(Int64(seekSlider.value), 1)
player.seek(to: value)
player.play()
}
func volSliderChangedValue(sender: UISlider) {
player.volume = sender.value
}
override func didMove(to view: SKView) {
removeAllChildren() // Delete this in your actual project.
// Add some labels:
let seekLabel = SKLabelNode(text: "Seek")
seekLabel.setScale(3)
seekLabel.verticalAlignmentMode = .center
seekLabel.position = CGPoint(x: frame.minX + seekLabel.frame.width/2,
y: frame.maxY - seekLabel.frame.height)
let volLabel = SKLabelNode(text: "Volume")
volLabel.setScale(3)
volLabel.verticalAlignmentMode = .center
volLabel.position = CGPoint(x: frame.minX + volLabel.frame.width/2,
y: frame.minY + volLabel.frame.height + volSlider.frame.height)
// Make player and node:
let url = Bundle.main.url(forResource: "sample", withExtension: "mp4")!
player = AVPlayer(url: url)
videoNode = SKVideoNode(avPlayer: player!)
//Configure seek slider:
seekSlider.addTarget(self, action: #selector(seekSliderChangedValue), for: UIControlEvents.valueChanged)
seekSlider.maximumValue = defaultMax
let seekOrigin = convertPoint(toView: CGPoint(x: seekLabel.frame.minX, y: seekLabel.frame.minY))
seekSlider.frame = CGRect(origin: seekOrigin, size: CGSize(width: 200, height: 15))
//Configure vol slider:
volSlider.addTarget(self, action: #selector(volSliderChangedValue), for: UIControlEvents.valueChanged)
volSlider.value = 1
let volOrigin = convertPoint(toView: CGPoint(x: volLabel.frame.minX, y: volLabel.frame.minY))
volSlider.frame = CGRect(origin: volOrigin, size: CGSize(width: 200, height: 15))
//Scene stuff:
view.addSubview(seekSlider)
view.addSubview(volSlider)
addChild(seekLabel)
addChild(volLabel)
addChild(videoNode)
// Start video and animation:
videoNode.alpha = 0
videoNode.play()
videoNode.run(.fadeIn(withDuration: 5))
}
}
我正在为您开发一个新的答案,它使用avPlayer和SKVideoNode,但允许您调整音量并进行搜索。视频播放但没有用于搜索流的接口!?!嗯,我用seek和volume alider找到了它。我可以在不同的设备@bluelemonadeok上再看一看,我可以在模拟器和iphone上的纵向模式下的设备(ios 10)上看到它查看更新的github:好的,在iphone模拟器上,我可以看到UI,在iPad上的横向模式下,什么都没有。顺便说一句:当我使用高清视频时,图像会被裁剪。@bluelemonade我无法为你编写整个应用程序:)这已经是我对一个问题给出的第三个答案了。请接受回答,并提出一个关于景观模式和种植的新问题