103 lines
3.6 KiB
Swift
103 lines
3.6 KiB
Swift
//
|
|
// MVMCoreUITopAlertView+Extension.swift
|
|
// MVMCoreUI
|
|
//
|
|
// Created by Scott Pfeil on 9/11/20.
|
|
// Copyright © 2020 Verizon Wireless. All rights reserved.
|
|
//
|
|
|
|
import Foundation
|
|
import MVMCore
|
|
|
|
/// A simple container view that shows and hides a notification.
|
|
public class NotificationContainerView: UIView {
|
|
|
|
public var currentNotificationView: UIView?
|
|
|
|
lazy private var height = heightAnchor.constraint(equalToConstant: 0)
|
|
|
|
public init() {
|
|
super.init(frame: .zero)
|
|
setupView()
|
|
}
|
|
|
|
required init?(coder: NSCoder) {
|
|
super.init(coder: coder)
|
|
setupView()
|
|
}
|
|
|
|
/// Posts a layout change with taking the arguments from the view following the AccessibilityProtocol.
|
|
private func updateAccessibilityForTopAlert(_ view: UIView) {
|
|
// Update accessibility with top alert
|
|
var accessibilityArgument: Any? = view
|
|
if let view = view as? AccessibilityProtocol {
|
|
accessibilityArgument = view.getAccessibilityLayoutChangedArgument()
|
|
}
|
|
UIAccessibility.post(notification: .layoutChanged, argument: accessibilityArgument)
|
|
}
|
|
}
|
|
|
|
extension NotificationContainerView: NotificationTransitionDelegateProtocol {
|
|
@MainActor
|
|
public func show(notification: UIView) async {
|
|
currentNotificationView?.removeFromSuperview()
|
|
addSubview(notification)
|
|
NSLayoutConstraint.constraintPinSubview(toSuperview: notification)
|
|
currentNotificationView = notification
|
|
|
|
if let conformer = notification as? MVMCoreViewProtocol {
|
|
conformer.updateView(bounds.width)
|
|
}
|
|
|
|
superview?.layoutIfNeeded()
|
|
await withCheckedContinuation { continuation in
|
|
UIView.animate(withDuration: 0.5) {
|
|
self.height.isActive = false
|
|
self.superview?.layoutIfNeeded()
|
|
} completion: { finished in
|
|
self.superview?.layoutIfNeeded()
|
|
self.updateAccessibilityForTopAlert(notification)
|
|
continuation.resume()
|
|
}
|
|
}
|
|
}
|
|
|
|
@MainActor
|
|
public func hide(notification: UIView) async {
|
|
// accessibility - below line added to notify VI user through voiceover user when the top alert is closed
|
|
UIAccessibility.post(notification: .screenChanged, argument: MVMCoreUIUtility.hardcodedString(withKey: "AccTopAlertClosed"))
|
|
await withCheckedContinuation { continuation in
|
|
UIView.animate(withDuration: 0.5) {
|
|
self.height.isActive = true
|
|
self.superview?.layoutIfNeeded()
|
|
} completion: { finished in
|
|
UIAccessibility.post(notification: .layoutChanged, argument: nil)
|
|
self.currentNotificationView?.removeFromSuperview()
|
|
self.currentNotificationView = nil
|
|
continuation.resume()
|
|
}
|
|
}
|
|
}
|
|
|
|
@MainActor
|
|
public func update(with model: NotificationModel, delegateObject: MVMCoreUIDelegateObject?) {
|
|
guard let molecule = currentNotificationView as? MoleculeViewProtocol else { return }
|
|
// Update molecule
|
|
molecule.reset()
|
|
molecule.set(with: model.molecule, delegateObject, nil)
|
|
(molecule as? MVMCoreViewProtocol)?.updateView(self.bounds.width)
|
|
}
|
|
}
|
|
|
|
extension NotificationContainerView: MVMCoreViewProtocol {
|
|
public func updateView(_ size: CGFloat) {
|
|
(currentNotificationView as? MVMCoreViewProtocol)?.updateView(size)
|
|
}
|
|
|
|
public func setupView() {
|
|
translatesAutoresizingMaskIntoConstraints = false
|
|
clipsToBounds = true
|
|
height.isActive = true
|
|
}
|
|
}
|