UIKit开发中如何实现图片叠加,上层图片随剩余错误猜测次数更新
实现方案
你可以根据自己的使用场景二选一,推荐优先使用子视图叠加方案,动态更新的成本更低。
方案1:子视图叠加(适合动态更新场景)
你的第一版实现思路本身没有问题,核心问题有两个:
- 没有将创建的
bgimgview添加到当前控制器/父视图上,所以无法渲染显示 - 没有将
frontimgview存为类属性,后续剩余错误次数变更时无法找到引用更新图片
实现代码
首先在类的属性定义部分声明两个全局imageView:
// 类属性部分 private let backgroundImageView = UIImageView() private let frontTreeImageView = UIImageView()
在页面初始化阶段(如viewDidLoad)完成基础配置:
override func viewDidLoad() { super.viewDidLoad() // 配置背景图 if let bgImage = UIImage(named: "background") { backgroundImageView.image = bgImage } backgroundImageView.frame = CGRect(x: 0, y: 0, width: 500, height: 500) // 务必添加到父视图 view.addSubview(backgroundImageView) // 配置上层树图 frontTreeImageView.frame = CGRect(x: 150, y: 300, width: 50, height: 50) backgroundImageView.addSubview(frontTreeImageView) // 首次赋值上层图片 updateTreeImage() }
每次剩余错误次数变更时调用以下方法即可完成上层图更新:
func updateTreeImage() { let treeImage = UIImage(named: "Tree \(currentGame.incorrectMovesRemaining)") frontTreeImageView.image = treeImage }
方案2:合并为单张图片(适合需要用合并图做按钮背景/导出的场景)
你注释的代码问题在于newImage是局部变量无法被外部访问,同时按钮设置背景图的语法错误,修复后实现如下:
// 生成合并后的图片 func generateMergedImage() -> UIImage? { guard let bottomImage = UIImage(named: "background"), let topImage = UIImage(named: "Tree \(currentGame.incorrectMovesRemaining)") else { return nil } let mergeSize = bottomImage.size UIGraphicsBeginImageContextWithOptions(mergeSize, false, UIScreen.main.scale) // 绘制背景图 bottomImage.draw(in: CGRect(origin: .zero, size: mergeSize)) // 绘制上层树图,位置可自行调整 let topImageRect = CGRect(x: 150, y: 300, width: 50, height: 50) topImage.draw(in: topImageRect) let mergedImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return mergedImage } // 给按钮设置合并后的背景图 func updateButtonBg() { let mergedImage = generateMergedImage() backgroundImageButton.setBackgroundImage(mergedImage, for: .normal) }
内容的提问来源于stack exchange,提问作者T0xen
相关产品推荐
相关产品推荐

