- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何删除 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
.您不知道您的应用程序是否处于多任务模式(也许现在这不是问题,但这是一种不必要的假设,会在以后导致问题)。只需引用 bounds
的UIWindow
您要向其中添加此内容。您还应该更新此 frame
当您显示此 View 时,而不是在您创建它时(以防您在中间时间更改方向或其他)。keyWindow
在 iOS 13 及更高版本中不鼓励使用,因此您最终可能也想删除它。gifImage
时(我建议将其重命名为 gifImageView
,因为它是 ImageView ,而不是图像),您不应引用 center
其superview。这是透明 View 在其父 View 坐标系中的坐标,它可能与透明 View 自身的坐标系完全不同。在这种情况下,它恰好起作用,但它暗示了对 View 坐标系的根本误解。引用 bounds
的transparentView
,而不是它的center
.viewColor
和 setAlpha
,您应该拉动 transparentView
的设置的颜色出lazy
初始化器并进入 showLoaderView
,至少。现在,如果您显示加载程序一次,然后更改颜色,并尝试再次显示,您将看不到新颜色。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/
我在我的 info.plist 中设置了“应用程序不在后台运行”,所以当用户点击主页按钮时,应用程序退出。 当我的 [UIApplication -appWillTerminate:] 被调用时,我将
谁能帮我理解以下两行之间的区别: [UIApplication.sharedApplication.delegate.window addSubview:myView]; [UIApplication
在 iOS 14.5 或 14.6 之前,我们可以通过将 仅需要 App-Extension-Safe API 设置为 NO 并使用: if #available(iOS 10.0, *) {
我需要您的帮助来阐明我对应用程序各种状态的理解。我将陈述我的解释-但请随时纠正我。 1)应用启动并在前台运行:state = UIApplicationStateActive 2)用户按下主页按钮:s
我有这个代码: NSString *telURL = [NSString stringWithFormat:@"tel:1-%@",((UIButton*) sender).titleLabel.te
iPhone 引用库 - UIApplication 说我可以子类化 UIApplication,但如果我尝试这样做,我会得到一个异常: *** Terminating app due to unca
应用程序委托(delegate)之外有类似的东西吗?我只是希望在收到通知时能够在 View Controller 中执行某些操作。我是否只需导入它们中的每一个并根据我当前的 View Controll
我的应用程序处于横向模式,并且在应用程序中,用户每次单击浏览按钮时都必须注册照片,它会定向到相机胶卷,但是当我单击浏览操作时,会发生异常。以下是我得到的异常 'UIApplicationInvalid
我需要获取当前最前面的应用程序的 UIApplication 实例。我使用 [UIApplication sharedApplication] 但只获取 SpringBoard 的实例,有人知道我该怎
我的应用程序执行后台提取以更新一些数据。在我的初始 View Controller 中 viewDidLoad方法 我想检测我的应用程序是否为后台获取运行? 我知道使用这个检查应用程序的状态非常容易:
请帮我看看 UIApplication 将在后台状态下运行多长时间。比如当我们按下主页按钮等时 最佳答案 限制如下: iOS6 10 分钟 iOS7 3 分钟 就在您的应用委托(delegate)实现
我在我的应用程序中安排了一个通知,并创建了一个带有暂停按钮的可操作通知。在贪睡按钮处理上,我创建了另一个通知并安排了它。但是当我启动应用程序并尝试获取该预定通知时,它说 0 预定通知,并且当我在杀死它
我正在使用 Swift 语言构建适用于 iOS 系统的应用程序。所以我已经将核心数据添加到我的项目中。 我还创建了“CoreDataController” 这是它的代码: import Foundat
在我的 iOS 4 应用程序中,我需要在用户指定的时间从后台打开一个 URL。但是,出于某种原因,我无法从后台启动 URL。这是我打开 URL 的代码: if (![[UIApplication sh
我刚刚从 XCode 6.4 升级到 Xcode 7 GM 并开始更改代码以符合 Swift 2。我无法克服以下错误。 该项目是一个键盘扩展,片段来自包含的应用程序。 let s = "htt
嗨,我是 Iphone 开发领域的新手。我有一个问题: 我在 Appdeligate 类中使用 UIApplicationDeligate,在这个类中我使用两种方法 applicationDidEnt
伙计们:)我有一个 iOS 警报应用程序,它使用 UILocalNotification-s 在应用程序进入后台时安排用户定义的警报。由于这(在我的实现中)可能是一个相对较长的过程,因此我需要确保在应
我在应用程序商店中有一个使用 Touch ID 的 iPhone 应用程序。如果启用了 Touch ID,则用户将通过它进行身份验证,否则用户需要输入 PIN 码才能登录应用程序。 iOS 10.1发
我已经考虑了好几个小时了,但无济于事。我正在尝试向我的 iPad 应用程序添加一种方法,只要 120 秒没有任何事件,它就会将其发送回起始屏幕。 我对 Xamarin 和 IOS 编程都很陌生,如果我
我目前正在为 iPad 应用程序开发“设备内”(而非模拟器)监控系统。系统应该能够执行以下操作: -用户输入模拟:模拟用户输入:点击、拖动、键盘。 -信息记忆:输入后得到文本值和结果。 此信息稍后将报
我是一名优秀的程序员,十分优秀!