Swift中如何在UI内添加无交互的Logo-Animation4.mp4视频
我懂你想要的效果——就是让视频安安静静地在UI里播放,完全像一张动态的图片,不带那些多余的控制按钮、全屏选项对吧?我给你两种靠谱的方案,你可以根据需求选:
方案一:用AVPlayerLayer自定义无交互播放视图
这个方法是直接用AVPlayer的底层layer来渲染视频,完全自定义显示样式,去掉所有默认控制元素:
首先创建一个自定义的UIView子类,把AVPlayerLayer作为它的底层layer:
import UIKit import AVFoundation class SilentVideoPlayerView: UIView { private var player: AVPlayer? override class var layerClass: AnyClass { return AVPlayerLayer.self } func setupVideo(with videoName: String) { guard let videoURL = Bundle.main.url(forResource: videoName, withExtension: "mp4") else { print("找不到视频文件:\(videoName).mp4") return } let playerItem = AVPlayerItem(url: videoURL) player = AVPlayer(playerItem: playerItem) // 设置循环播放 player?.actionAtItemEnd = .none NotificationCenter.default.addObserver(self, selector: #selector(restartVideo), name: .AVPlayerItemDidPlayToEndTime, object: playerItem) // 禁止外部播放,避免弹出系统播放界面 player?.allowsExternalPlayback = false // 关联player到视图layer,设置视频缩放模式(类似UIImageView的contentMode) if let playerLayer = layer as? AVPlayerLayer { playerLayer.player = player playerLayer.videoGravity = .resizeAspect } // 禁止视图交互,避免误触 isUserInteractionEnabled = false // 开始播放 player?.play() } @objc private func restartVideo() { player?.seek(to: .zero) player?.play() } deinit { NotificationCenter.default.removeObserver(self) player?.pause() player = nil } }
然后在你的ViewController里使用这个视图,就像用UIImageView一样简单:
let videoView = SilentVideoPlayerView(frame: CGRect(x: 50, y: 100, width: 200, height: 200)) view.addSubview(videoView) videoView.setupVideo(with: "Logo-Animation4")
这样出来的视图就只会播放视频,没有任何控制按钮,也不能交互,完全符合你的需求。
方案二:用UIImageView实现逐帧动画(适合短动画)
如果你的Logo动画很短(比如2-3秒),可以把视频转换成一系列连续的PNG/JPG图片,然后用UIImageView的逐帧动画功能来实现,这种方式更轻量,也完全没有交互问题:
首先把视频拆成序列图片(可以用QuickTime或者批量转码工具处理),命名比如logo_01.png、logo_02.png...然后加载到UIImageView里:
let imageView = UIImageView(frame: CGRect(x: 50, y: 100, width: 200, height: 200)) view.addSubview(imageView) // 加载所有动画图片 var animationImages: [UIImage] = [] for i in 1...30 { // 假设你有30帧图片 if let image = UIImage(named: "logo_\(String(format: "%02d", i))") { animationImages.append(image) } } // 设置动画参数 imageView.animationImages = animationImages imageView.animationDuration = 2.0 // 动画总时长,和原视频一致 imageView.animationRepeatCount = 0 // 0表示无限循环 imageView.contentMode = .scaleAspectFit // 保持比例 // 开始动画 imageView.startAnimating()
这种方法的好处是不需要依赖AVFoundation框架,性能更优,适合小动画;缺点是需要提前处理图片文件,文件体积可能比视频大一点。
两种方案各有优劣:第一种适合长视频或者不想转格式的情况,第二种适合短动画,性能更优。你可以根据你的Logo动画长度来选~
内容的提问来源于stack exchange,提问作者Adalex3
相关产品推荐
相关产品推荐

