分段控件(Segmented Control)仅首次触发生效,APP背景图片切换异常求助
问题分析
你遇到的问题根源在于每次切换背景时都会创建一个新的UIImageView并插入到视图层级的最底层,但旧的背景视图并没有被移除。第一次切换到Raindrops时,新图片视图会覆盖原来的白色背景,能看到效果;但后续切换时,新的图片视图会被插在更底层,之前的旧视图还留在上面,视觉上就看不到变化了。另外你的Background变量初始值也写错了,是字符串形式的代码,不是正确的图片名称。
修复方案
我们可以把背景视图改成类的属性,这样就能在切换时先移除旧视图,再添加新的(或者直接更新现有视图的图片);同时修正初始值,并且把纯色背景和图片背景的切换逻辑分开处理(根据你描述的“切换颜色正常”,假设Gradient选项是回到纯色背景)。
修复后的完整代码
import UIKit class ContainerController: UIViewController { var isRaindrops = false // 修正初始值,若Gradient是纯色则初始为空 var currentBackgroundImageName: String? = nil // 将背景视图设为类属性,方便后续操作 private var backgroundImageView: UIImageView? override func viewDidLoad() { super.viewDidLoad() // 初始设置白色背景 self.view.backgroundColor = .white BackgroundSwitch() } func BackgroundSwitch() { let items = ["Gradient", "Raindrops"] let segmentedControl = UISegmentedControl(items: items) segmentedControl.translatesAutoresizingMaskIntoConstraints = false segmentedControl.frame = CGRect(x: 20, y: self.view.frame.height * 0.2 + 50, width: self.view.frame.width - 40, height: 40) segmentedControl.selectedSegmentIndex = 0 segmentedControl.tintColor = .black segmentedControl.addTarget(self, action: #selector(segmentedControlInAction(sender:)), for: .valueChanged) self.view.addSubview(segmentedControl) } @objc func segmentedControlInAction(sender: UISegmentedControl) { switch sender.selectedSegmentIndex { case 0: print("Gradient") // 切换到纯色背景,移除图片视图 setupSolidBackground(color: .white) // 可替换为你的渐变颜色或渐变层 case 1: print("Raindrops") // 切换到Raindrops图片背景 setupImageBackground(imageName: "Raindrops") default: print("default") break } } // 单独处理纯色背景的方法 private func setupSolidBackground(color: UIColor) { // 移除旧的图片背景视图 backgroundImageView?.removeFromSuperview() backgroundImageView = nil // 设置纯色背景 self.view.backgroundColor = color } // 单独处理图片背景的方法 private func setupImageBackground(imageName: String) { // 如果已有图片视图,直接更新图片 if let existingImageView = backgroundImageView { existingImageView.image = UIImage(named: imageName) } else { // 没有则创建新视图 let backgroundImage = UIImageView(frame: UIScreen.main.bounds) backgroundImage.image = UIImage(named: imageName) // 确保图片铺满屏幕,可根据需求调整contentMode backgroundImage.contentMode = .scaleAspectFill backgroundImage.clipsToBounds = true self.view.insertSubview(backgroundImage, at: 0) backgroundImageView = backgroundImage } // 将背景色设为透明,避免遮挡图片 self.view.backgroundColor = .clear } }
关键修改点说明
- 新增类属性
backgroundImageView:保存当前的背景图片视图,方便复用或在切换纯色背景时移除它。 - 拆分背景设置方法:分成
setupSolidBackground和setupImageBackground,分别处理两种背景逻辑,代码更清晰。 - 移除旧视图/复用现有视图:切换纯色背景时移除图片视图;切换图片背景时,若已有视图则直接更新图片,避免重复创建导致层级混乱。
- 修正初始值与背景色处理:初始设为白色背景,切换图片时将背景色设为透明,确保图片正常显示。
这样修改后,无论你怎么切换SegmentedControl,背景都会正确更新啦!
内容的提问来源于stack exchange,提问作者BB23
相关产品推荐
相关产品推荐

