mvm_core_ui/MVMCoreUI/BaseClasses/TextField.swift
Kyle Matthew Hedden 044a103665 Relax model handling to allow handlers to decide what to do when server doesn't specify masking.
Leverage introduced legacy behavior handling over customized direct recording manager calls.
Bring in RemoteView molecular masking handling.
Fix ImageViewModel decoding requirement.
2022-06-29 16:16:33 -04:00

111 lines
3.0 KiB
Swift

//
// TextField.swift
// MVMCoreUI
//
// Created by Kevin Christiano on 11/18/19.
// Copyright © 2019 Verizon Wireless. All rights reserved.
//
import UIKit
public protocol TextInputDidDeleteProtocol: AnyObject {
func textInputDidDelete()
}
@objcMembers open class TextField: UITextField, ViewMaskingProtocol {
//--------------------------------------------------
// MARK: - Properties
//--------------------------------------------------
private var initialSetupPerformed = false
/// Set to true to hide the blinking textField cursor.
public var hideBlinkingCaret = false
public var shouldMaskWhileRecording: Bool = true
//--------------------------------------------------
// MARK: - Delegate
//--------------------------------------------------
/// Holds a reference to the delegating class so this class can internally influence the TextField behavior as well.
public weak var didDeleteDelegate: TextInputDidDeleteProtocol?
//--------------------------------------------------
// MARK: - Initialization
//--------------------------------------------------
public override init(frame: CGRect) {
super.init(frame: .zero)
initialSetup()
}
public convenience init() {
self.init(frame: .zero)
}
public required init?(coder: NSCoder) {
super.init(coder: coder)
initialSetup()
}
public func initialSetup() {
if !initialSetupPerformed {
tintColor = .mvmBlack
initialSetupPerformed = true
setupView()
}
}
open override func caretRect(for position: UITextPosition) -> CGRect {
if hideBlinkingCaret {
return .zero
}
let caretRect = super.caretRect(for: position)
return CGRect(origin: caretRect.origin, size: CGSize(width: 1, height: caretRect.height))
}
open override func deleteBackward() {
super.deleteBackward()
didDeleteDelegate?.textInputDidDelete()
}
}
/// MARK:- MVMCoreViewProtocol
extension TextField: MVMCoreViewProtocol {
open func updateView(_ size: CGFloat) {}
/// Will be called only once.
open func setupView() {
translatesAutoresizingMaskIntoConstraints = false
insetsLayoutMarginsFromSafeArea = false
}
}
/// MARK:- MoleculeViewProtocol
extension TextField: MoleculeViewProtocol {
open func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) {
if let color = model.backgroundColor?.uiColor {
backgroundColor = color
}
if let accessibilityIdentifier = model.accessibilityIdentifier {
self.accessibilityIdentifier = accessibilityIdentifier
}
shouldMaskWhileRecording = model.shouldMaskRecordedView ?? true
}
open func reset() {
backgroundColor = .clear
}
}