viewWillDisappear

本文深入探讨了iOS应用中视图的生命周期管理,包括viewWillAppear、viewDidAppear、viewWillDisappear等方法的作用,以及在屏幕黑屏锁屏后如何避免触发viewWillDisappear事件。

viewWillAppear: 
Called when the view is about to made visible. Default doesnothing
视图即将可见时调用。默认情况下不执行任何操作
viewDidAppear: 
Called when the view has been fully transitioned onto the screen.Default does nothing
视图已完全过渡到屏幕上时调用
viewWillDisappear:
Called when the view is dismissed, covered or otherwise hidden.Default does nothing
视图被驳回时调用,覆盖或以其他方式隐藏。默认情况下不执行任何操作



viewWillDisappear

在屏幕变黑锁屏后,并不会触发这个事件


import UIKit class FlowingImageViewController: UIViewController { private let containerView: UIView = { let view = UIView() view.backgroundColor = UIColor.clear view.layer.borderWidth = 2.0 view.layer.borderColor = UIColor.white.withAlphaComponent(0.5).cgColor view.layer.cornerRadius = 10 view.clipsToBounds = true view.translatesAutoresizingMaskIntoConstraints = false return view }() private let imageView: UIImageView = { let imageView = UIImageView() imageView.contentMode = .scaleAspectFill imageView.translatesAutoresizingMaskIntoConstraints = false return imageView }() private var animator: UIViewPropertyAnimator? private var imageSize: CGSize = .zero private var containerSize: CGSize = .zero override func viewDidLoad() { super.viewDidLoad() setupViews() setupImage() } override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) startAnimation() } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) stopAnimation() } private func setupViews() { view.backgroundColor = .black view.addSubview(containerView) containerView.addSubview(imageView) NSLayoutConstraint.activate([ containerView.centerXAnchor.constraint(equalTo: view.centerXAnchor), containerView.centerYAnchor.constraint(equalTo: view.centerYAnchor), containerView.widthAnchor.constraint(equalToConstant: 300), containerView.heightAnchor.constraint(equalToConstant: 200) ]) } private func setupImage() { // 使用示例图片,你可以替换为你自己的图片 if let image = UIImage(named: "sampleImage") ?? UIImage(systemName: "photo") { imageView.image = image imageSize = image.size containerSize = CGSize(width: 300, height: 200) // 初始位置 - 居中 let initialX = (containerSize.width - imageSize.width) / 2 let initialY = (containerSize.height - imageSize.height) / 2 imageView.frame = CGRect(x: initialX, y: initialY, width: imageSize.width, height: imageSize.height) } } private func startAnimation() { stopAnimation() // 确保没有正在运行的动画 // 计算动画路径 let horizontalRange = imageSize.width - containerSize.width let verticalRange = imageSize.height - containerSize.height // 创建动画 animator = UIViewPropertyAnimator(duration: 10.0, curve: .easeInOut) { // 水平移动 if horizontalRange > 0 { let randomX = CGFloat.random(in: -horizontalRange...0) self.imageView.frame.origin.x = randomX } // 垂直移动 if verticalRange > 0 { let randomY = CGFloat.random(in: -verticalRange...0) self.imageView.frame.origin.y = randomY } } animator?.addCompletion { _ in // 动画完成后重新开始 self.startAnimation() } animator?.startAnimation() } private func stopAnimation() { animator?.stopAnimation(true) animator = nil } // 添加手势可以暂停/继续动画 @objc private func toggleAnimation() { if let animator = animator { if animator.isRunning { animator.pauseAnimation() } else { animator.startAnimation() } } else { startAnimation() } } }
09-18
// // TPGuardDeviceShareMessageController.swift // OmadaSurveillance // // Created by 18908757-BG on 2025/6/3. // import Cocoa class TPGuardDeviceShareMessageController: TPBaseViewController { private var titleLabel = TPBLabel() private var foldButton = TPBButton.iconButton(with: .messageFoldButton) private var closeButton = TPBButton.iconButton(with: .messageCloseButton) private var messageListView = TPGuardMessageListView() private var scrollView = NSScrollView() private var isExpanded = true { didSet { isExpanded.toggle() messageListView.toggleCollapseState() } } override func viewDidLoad() { super.viewDidLoad() // Do view setup here. } override func viewWillAppear() { super.viewWillAppear() messageListView.deviceShareMessages = TPGuardMessageManager.shard.deviceShareMessages NotificationCenter.default.addObserver(self, selector: #selector(messageListDidChange), name: TPGuardNewDeviceShareMessageDidReceiveNotification, object: nil) } override func viewWillDisappear() { super.viewWillDisappear() NotificationCenter.default.removeObserver(self, name: TPGuardNewDeviceShareMessageDidReceiveNotification, object: nil) } @objc func messageListDidChange() { messageListView.deviceShareMessages = TPGuardMessageManager.shard.deviceShareMessages } override func viewDidAppear() { super.viewDidAppear() messageListView.reloadMessages() } override func setupSubviews() { super.setupSubviews() view.wantsLayer = true view.layer?.backgroundColor = NSColor.clear.cgColor titleLabel.font = NSFont.tpm16Medium() titleLabel.textColor = NSColor.tpTextWhite titleLabel.textAlignment = .natural scrollView.backgroundColor = NSColor.clear scrollView.drawsBackground = false scrollView.wantsLayer = true scrollView.layer?.backgroundColor = NSColor.clear.cgColor scrollView.contentView.backgroundColor = NSColor.clear scrollView.documentView = messageListView messageListView.autoresizingMask = [] messageListView.wantsLayer = true messageListView.layer?.masksToBounds = true messageListView.messageListViewStatusDidChangeCallback = { [weak self] height, collapsed in if collapsed { self?.titleLabel.isHidden = true self?.foldButton.isHidden = true self?.closeButton.isHidden = true self?.scrollView.snp.remakeConstraints { make in make.top.equalToSuperview().offset(10) make.leading.equalToSuperview().offset(24) make.trailing.equalToSuperview().offset(-24) make.width.equalTo(420) make.height.equalTo(height) } } else { self?.titleLabel.isHidden = false self?.foldButton.isHidden = false self?.closeButton.isHidden = false let newHeight = min(height, (self?.view.window?.contentView?.bounds.height ?? 0) - 42 - 70 - 56) self?.scrollView.snp.remakeConstraints { make in make.top.equalToSuperview().offset(42) make.leading.equalToSuperview().offset(24) make.trailing.equalToSuperview().offset(-24) make.width.equalTo(420) make.height.equalTo(newHeight) } } } view.addSubview(titleLabel) view.addSubview(foldButton) view.addSubview(closeButton) view.addSubview(scrollView) } override func setupInitialData() { super.setupInitialData() messageListView.deviceShareMessages = TPGuardMessageManager.shard.deviceShareMessages } override func makeConstraints() { super.makeConstraints() updateSubviewStatus() } override func bindActions() { super.bindActions() foldButton.onClickCallback = { [weak self] in print("fold Button") self?.messageListView.toggleCollapseState() } closeButton.onClickCallback = { if self.view.superview != nil { self.view.removeFromSuperview() } print("Close Button") } } override func setupText() { super.setupText() titleLabel.text = LocalizedString(key: omadaSharePush) } private func updateSubviewStatus() { if isExpanded { titleLabel.isHidden = false foldButton.isHidden = false closeButton.isHidden = false titleLabel.snp.remakeConstraints { make in make.top.equalToSuperview().offset(12) make.leading.equalToSuperview().offset(24) } foldButton.snp.remakeConstraints { make in make.top.equalToSuperview().offset(11) make.size.equalTo(24) } closeButton.snp.remakeConstraints { make in make.centerY.equalTo(foldButton) make.leading.equalTo(foldButton.snp.trailing).offset(16) make.size.equalTo(24) make.trailing.equalToSuperview().offset(-24) } scrollView.snp.remakeConstraints { make in make.top.equalToSuperview().offset(42) make.leading.equalToSuperview().offset(24) make.trailing.equalToSuperview().offset(-24) make.bottom.equalToSuperview().offset(-24) make.width.equalTo(420) } } else { titleLabel.isHidden = true foldButton.isHidden = true closeButton.isHidden = true scrollView.snp.remakeConstraints { make in make.top.equalToSuperview().offset(10) make.leading.equalToSuperview().offset(24) make.trailing.equalToSuperview().offset(-24) make.bottom.equalToSuperview().offset(-24) make.width.equalTo(420) make.height.equalTo(10) } } } } 这个controller现在有一个列表,可以折叠展开,扩展一下,实现两个同样的列表,都包含相同的折叠关闭按钮,使用同一个数据源即可
最新发布
10-10
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值