SwiftUI技术问题:如何创建包含UIImage与AVPlayer的数组?
实现可容纳UIImage和AVPlayer的数组并遍历显示的思路
当然可以使用对象数组,以下是几种具体实现思路:
思路一:Any类型数组(快速原型方案)
直接声明数组类型为[Any],可直接存入UIImage和AVPlayer实例,但编译期无类型校验,适合快速验证需求:
let mixedMedia: [Any] = [UIImage(named: "demo")!, AVPlayer(url: URL(string: "demo.mp4")!)] for item in mixedMedia { if let image = item as? UIImage { // 显示图片:实例化UIImageView并添加到视图 let imageView = UIImageView(image: image) imageView.frame = CGRect(x: 0, y: 0, width: 300, height: 200) // 自行添加到父视图逻辑 } else if let player = item as? AVPlayer { // 显示视频:实例化AVPlayerLayer并添加到视图层 let playerLayer = AVPlayerLayer(player: player) playerLayer.frame = CGRect(x: 0, y: 0, width: 300, height: 200) // 自行添加到父视图层逻辑 player.play() } }
思路二:自定义枚举数组(类型安全推荐方案)
定义枚举关联对应媒体类型,数组类型明确,编译期可校验类型,代码可读性更高:
enum MediaItem { case image(UIImage) case video(AVPlayer) } let mediaList: [MediaItem] = [ .image(UIImage(named: "demo")!), .video(AVPlayer(url: URL(string: "demo.mp4")!)) ] for media in mediaList { switch media { case .image(let image): // 处理图片显示逻辑 let imageView = UIImageView(image: image) imageView.frame = CGRect(x: 0, y: 0, width: 300, height: 200) case .video(let player): // 处理视频显示逻辑 let playerLayer = AVPlayerLayer(player: player) playerLayer.frame = CGRect(x: 0, y: 0, width: 300, height: 200) player.play() } }
思路三:协议扩展数组(高扩展性方案)
定义统一协议,让UIImage和AVPlayer遵循并实现显示逻辑,后续新增媒体类型只需扩展协议即可:
protocol MediaDisplayable { func show(in container: UIView) } // 扩展UIImage遵循协议 extension UIImage: MediaDisplayable { func show(in container: UIView) { let imageView = UIImageView(image: self) imageView.frame = container.bounds container.addSubview(imageView) } } // 扩展AVPlayer遵循协议 extension AVPlayer: MediaDisplayable { func show(in container: UIView) { let playerLayer = AVPlayerLayer(player: self) playerLayer.frame = container.bounds container.layer.addSublayer(playerLayer) self.play() } } // 使用协议类型数组 let mediaArray: [MediaDisplayable] = [UIImage(named: "demo")!, AVPlayer(url: URL(string: "demo.mp4")!)] let container = UIView(frame: CGRect(x: 0, y: 0, width: 300, height: 200)) for media in mediaArray { media.show(in: container) }
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

