mirror of https://github.com/oxen-io/session-ios
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
152 lines
3.9 KiB
Swift
152 lines
3.9 KiB
Swift
7 years ago
|
//
|
||
6 years ago
|
// Copyright (c) 2019 Open Whisper Systems. All rights reserved.
|
||
7 years ago
|
//
|
||
|
|
||
|
import Foundation
|
||
|
|
||
|
@objc
|
||
6 years ago
|
public class ToastController: NSObject, ToastViewDelegate {
|
||
7 years ago
|
|
||
7 years ago
|
static var currentToastController: ToastController?
|
||
|
|
||
7 years ago
|
private let toastView: ToastView
|
||
|
private var isDismissing: Bool
|
||
|
|
||
|
// MARK: Initializers
|
||
|
|
||
|
@objc
|
||
6 years ago
|
required public init(text: String) {
|
||
7 years ago
|
toastView = ToastView()
|
||
|
toastView.text = text
|
||
|
isDismissing = false
|
||
|
|
||
|
super.init()
|
||
|
|
||
|
toastView.delegate = self
|
||
|
}
|
||
|
|
||
|
// MARK: Public
|
||
|
|
||
|
@objc
|
||
6 years ago
|
public func presentToastView(fromBottomOfView view: UIView, inset: CGFloat) {
|
||
7 years ago
|
Logger.debug("")
|
||
7 years ago
|
toastView.alpha = 0
|
||
|
view.addSubview(toastView)
|
||
|
toastView.setCompressionResistanceHigh()
|
||
|
toastView.autoPinEdge(.bottom, to: .bottom, of: view, withOffset: -inset)
|
||
|
toastView.autoPinWidthToSuperview(withMargin: 24)
|
||
|
|
||
7 years ago
|
if let currentToastController = type(of: self).currentToastController {
|
||
|
currentToastController.dismissToastView()
|
||
|
type(of: self).currentToastController = nil
|
||
|
}
|
||
|
type(of: self).currentToastController = self
|
||
|
|
||
7 years ago
|
UIView.animate(withDuration: 0.1) {
|
||
|
self.toastView.alpha = 1
|
||
|
}
|
||
|
|
||
|
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1.5) {
|
||
|
// intentional strong reference to self.
|
||
|
// As with an AlertController, the caller likely expects toast to
|
||
|
// be presented and dismissed without maintaining a strong reference to ToastController
|
||
|
self.dismissToastView()
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// MARK: ToastViewDelegate
|
||
|
|
||
|
func didTapToastView(_ toastView: ToastView) {
|
||
7 years ago
|
Logger.debug("")
|
||
7 years ago
|
self.dismissToastView()
|
||
|
}
|
||
|
|
||
|
func didSwipeToastView(_ toastView: ToastView) {
|
||
7 years ago
|
Logger.debug("")
|
||
7 years ago
|
self.dismissToastView()
|
||
|
}
|
||
|
|
||
|
// MARK: Internal
|
||
|
|
||
|
func dismissToastView() {
|
||
7 years ago
|
Logger.debug("")
|
||
7 years ago
|
|
||
|
guard !isDismissing else {
|
||
|
return
|
||
|
}
|
||
|
isDismissing = true
|
||
7 years ago
|
|
||
|
if type(of: self).currentToastController == self {
|
||
|
type(of: self).currentToastController = nil
|
||
|
}
|
||
|
|
||
7 years ago
|
UIView.animate(withDuration: 0.1,
|
||
|
animations: {
|
||
|
self.toastView.alpha = 0
|
||
|
},
|
||
|
completion: { (_) in
|
||
|
self.toastView.removeFromSuperview()
|
||
|
})
|
||
|
}
|
||
|
}
|
||
6 years ago
|
|
||
|
protocol ToastViewDelegate: class {
|
||
|
func didTapToastView(_ toastView: ToastView)
|
||
|
func didSwipeToastView(_ toastView: ToastView)
|
||
|
}
|
||
|
|
||
|
class ToastView: UIView {
|
||
|
|
||
|
var text: String? {
|
||
|
get {
|
||
|
return label.text
|
||
|
}
|
||
|
set {
|
||
|
label.text = newValue
|
||
|
}
|
||
|
}
|
||
|
weak var delegate: ToastViewDelegate?
|
||
|
|
||
|
private let label: UILabel
|
||
|
|
||
|
// MARK: Initializers
|
||
|
|
||
|
override init(frame: CGRect) {
|
||
|
label = UILabel()
|
||
|
super.init(frame: frame)
|
||
|
|
||
|
self.layer.cornerRadius = 4
|
||
|
self.backgroundColor = Theme.toastBackgroundColor
|
||
|
self.layoutMargins = UIEdgeInsets(top: 8, left: 8, bottom: 8, right: 8)
|
||
|
|
||
|
label.textAlignment = .center
|
||
|
label.textColor = Theme.toastForegroundColor
|
||
|
label.font = UIFont.ows_dynamicTypeBody
|
||
|
label.numberOfLines = 0
|
||
|
self.addSubview(label)
|
||
|
label.autoPinEdgesToSuperviewMargins()
|
||
|
|
||
|
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(didTap(gesture:)))
|
||
|
self.addGestureRecognizer(tapGesture)
|
||
|
|
||
|
let swipeGesture = UISwipeGestureRecognizer(target: self, action: #selector(didSwipe(gesture:)))
|
||
|
self.addGestureRecognizer(swipeGesture)
|
||
|
}
|
||
|
|
||
|
required init?(coder aDecoder: NSCoder) {
|
||
|
notImplemented()
|
||
|
}
|
||
|
|
||
|
// MARK: Gestures
|
||
|
|
||
|
@objc
|
||
|
func didTap(gesture: UITapGestureRecognizer) {
|
||
|
self.delegate?.didTapToastView(self)
|
||
|
}
|
||
|
|
||
|
@objc
|
||
|
func didSwipe(gesture: UISwipeGestureRecognizer) {
|
||
|
self.delegate?.didSwipeToastView(self)
|
||
|
}
|
||
|
}
|