gpt4 book ai didi

ios - "removeFromSuperview"永远不要在 UIApplication 上工作?

转载 作者:行者123 更新时间:2023-12-01 16:12:57 26 4
gpt4 key购买 nike

如何删除 subview ?

我正在尝试通过创建 UIView 来集成 GIF和 UIImageView以编程方式。

显示 GIF 效果很好,但是调用隐藏 if 的功能时,没有响应。

这是两个函数的代码。

class CustomLoader: UIView {

static let instance = CustomLoader()

var viewColor: UIColor = .black
var setAlpha: CGFloat = 0.5
var gifName: String = ""

lazy var transparentView: UIView = {
let transparentView = UIView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height))
transparentView.backgroundColor = viewColor.withAlphaComponent(setAlpha)
transparentView.isUserInteractionEnabled = false
return transparentView
}()

lazy var gifImage: UIImageView = {
var gifImage = UIImageView(frame: CGRect(x: 0, y: 0, width: 200, height: 60))
gifImage.contentMode = .scaleAspectFit
gifImage.center = transparentView.center
gifImage.isUserInteractionEnabled = false
gifImage.loadGif(name: gifName)
return gifImage
}()

func showLoaderView() {
self.addSubview(self.transparentView)
self.transparentView.addSubview(self.gifImage)
self.transparentView.bringSubview(toFront: self.gifImage)
UIApplication.shared.keyWindow?.addSubview(transparentView)

}

func hideLoaderView() {
self.transparentView.removeFromSuperview()
}

}

最佳答案

几个想法:

  • 我建议你在 hideLoaderView 中添加断点或日志语句并确保你到达那条线。
  • 你应该把 init此类的方法private确保您没有调用 hideLoaderView在某个单独的实例上。处理单例时,您要确保不会意外创建另一个实例。

  • 但是我测试了你的代码,它工作正常。你的问题可能在于你在哪里以及如何调用它(以及制作 init private ,你可能会发现你可能在哪里不恰本地使用它)。
    在下面的评论中,你说:

    I simply call the function "CustomLoader().hideLoaderView()" Both are being called technically. What do you mean by "where I using it inappropriately?"


    这就是问题的根源。 CustomLoader()CustomLoader().hideLoaderView()将创建 CustomLoader 的新实例拥有自己的 transparencyView等,这正是问题所在。您并没有隐藏之前呈现的旧 View ,而是试图隐藏您刚刚创建但从未显示的另一个 View 。
    如果您改为使用 static ,例如 CustomLoader.instance.showLoaderView()CustomLoader.instance.hideLoaderView() ,那么问题就会消失。然后您将隐藏您之前显示的相同 View 。

    顺便说一下,其他一些不相关的观察:
  • 如果这是一个单例或共享实例,约定是调用它 static房产 shared ,而不是 instance .
  • 顺便说一句,你没有使用这个 CustomLoader作为 UIView ,所以我不会让它成为 UIView子类。不要让它成为任何东西的子类。
    您显然会消除 self.addSubview(transparentView)也行。
  • bringSubview(toFront:)通话是不必要的。
  • 您应该避免引用 UIScreen.main.bounds .您不知道您的应用程序是否处于多任务模式(也许现在这不是问题,但这是一种不必要的假设,会在以后导致问题)。只需引用 boundsUIWindow您要向其中添加此内容。您还应该更新此 frame当您显示此 View 时,而不是在您创建它时(以防您在中间时间更改方向或其他)。
    顺便说一句,使用 keyWindow在 iOS 13 及更高版本中不鼓励使用,因此您最终可能也想删除它。
  • 添加 gifImage 时(我建议将其重命名为 gifImageView,因为它是 ImageView ,而不是图像),您不应引用 center其superview。这是透明 View 在其父 View 坐标系中的坐标,它可能与透明 View 自身的坐标系完全不同。在这种情况下,它恰好起作用,但它暗示了对 View 坐标系的根本误解。引用 boundstransparentView ,而不是它的center .
  • 如果你要曝光viewColorsetAlpha ,您应该拉动 transparentView 的设置的颜色出lazy初始化器并进入 showLoaderView ,至少。现在,如果您显示加载程序一次,然后更改颜色,并尝试再次显示,您将看不到新颜色。
  • 同样的问题也适用于 gif 图像。所以,我会把它移到 didSet观察者。

  • 因此,将所有这些放在一起:
    class CustomLoader{
    static let shared = CustomLoader()

    private init() { }

    var dimmingColor: UIColor = .black
    var dimmingAlpha: CGFloat = 0.5

    var gifName: String = "" { didSet { gifImage.loadGif(name: gifName) } }

    lazy var transparentView: UIView = {
    let transparentView = UIView()
    transparentView.isUserInteractionEnabled = false
    return transparentView
    }()

    lazy var gifImageView: UIImageView = {
    var gifImage = UIImageView(frame: CGRect(x: 0, y: 0, width: 200, height: 60))
    gifImage.contentMode = .scaleAspectFit
    gifImage.isUserInteractionEnabled = false
    return gifImage
    }()

    func showLoaderView() {
    guard let window = UIApplication.shared.keyWindow else { return }
    transparentView.frame = window.bounds
    transparentView.backgroundColor = dimmingColor.withAlphaComponent(dimmingAlpha)
    gifImageView.center = CGPoint(x: transparentView.bounds.midX, y: transparentView.bounds.midY)
    transparentView.addSubview(gifImageView)
    window.addSubview(transparentView)
    }

    func hideLoaderView() {
    transparentView.removeFromSuperview()
    }
    }

    关于ios - "removeFromSuperview"永远不要在 UIApplication 上工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60138595/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com