You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

176 lines
5.2 KiB

//
import UIKit
class ExchangeRateCustomView: UIView {
var passTextFieldText: ((String) -> Void)?
var didTappedDoneButton: (() -> Void)?
var didSelectCountry: (() -> ())?
var isReciver: Bool = false
var text: String?
var countryListTapGuesture: UITapGestureRecognizer?
var updatedText: String? {
didSet {
updateText()
}
}
var currency: String? {
didSet {
updateCurrency()
}
}
var flag: UIImage? {
didSet {
updateFlag()
}
}
var title: String? {
didSet {
titleLabel.text = title
}
}
private var textfield: CurrencyTextField = {
let textfield = CurrencyTextField()
textfield.tintColor = .theme2E89FF
textfield.textColor = .init(hex: "#2E89FF").withAlphaComponent(0.87)
textfield.font = .sanfrancisco(.semibold, size: 16)
textfield.translatesAutoresizingMaskIntoConstraints = false
return textfield
}()
private var titleLabel: UILabel = {
let label = UILabel()
label.font = .sanfrancisco(.semibold, size: 12)
label.textColor = .themeGray1
label.translatesAutoresizingMaskIntoConstraints = false
return label
}()
var currencyText: UILabel = {
let text = UILabel()
text.translatesAutoresizingMaskIntoConstraints = false
return text
}()
var flagImageView: UIImageView = {
let imageView = UIImageView()
imageView.translatesAutoresizingMaskIntoConstraints = false
imageView.heightAnchor.constraint(equalToConstant: 40).isActive = true
imageView.widthAnchor.constraint(equalToConstant: 40).isActive = true
return imageView
}()
private var leftStackView: UIStackView!
private var rightStackView: UIStackView!
init(isReciver: Bool) {
super.init(frame: .zero)
self.isReciver = isReciver
setup()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
private func setup() {
uiSetup()
propertiesSetup()
}
private func uiSetup() {
leftStackView = UIStackView(arrangedSubviews: [titleLabel, textfield])
leftStackView.translatesAutoresizingMaskIntoConstraints = false
leftStackView.axis = .vertical
leftStackView.distribution = .fill
leftStackView.spacing = 4
rightStackView = UIStackView(arrangedSubviews: [currencyText, flagImageView])
rightStackView.translatesAutoresizingMaskIntoConstraints = false
rightStackView.axis = .horizontal
rightStackView.distribution = .fillEqually
rightStackView.spacing = 8
self.addSubviews(leftStackView,
rightStackView
)
leftStackView.anchor(top: self.topAnchor,
paddingTop: isReciver ? 16 : 10,
bottom: self.bottomAnchor,
paddingBottom: -13,
left: self.leadingAnchor,
paddingLeft: 16
)
textfield.passTextFieldText = { [weak self] text in
self?.text = text
self?.passTextFieldText?(text)
}
textfield.didTextFieldEndEditing = { [weak self] _ in
self?.didTappedDoneButton?()
}
rightStackView.anchor(right: self.trailingAnchor,
paddingRight: -8
)
rightStackView.center(centerX: nil,
paddingX: 0,
centerY: self.centerYAnchor,
paddingY: 0)
rightStackView.leadingAnchor.constraint(greaterThanOrEqualTo: leftStackView.trailingAnchor, constant: 8).isActive = true
let tap = UITapGestureRecognizer(target: self, action: #selector(self.handleTap(_:)))
leftStackView.addGestureRecognizer(tap)
}
private func propertiesSetup() {
flagImageView.image = UIImage(named: "flag_japan")
currencyText.text = "JPY"
currencyText.textColor = .themeBlack
currencyText.font = .sanfrancisco(.semibold, size: 16)
titleLabel.textColor = .themeBlack.withAlphaComponent(0.6)
titleLabel.font = .sanfrancisco(.semibold, size: 14)
if(isReciver) {
countryListTapGuesture = UITapGestureRecognizer(target: self, action: #selector(showCurrencyCountryPickerview))
rightStackView.addGestureRecognizer(countryListTapGuesture ?? UITapGestureRecognizer())
} else {
countryListTapGuesture = nil
}
}
@objc func handleTap(_ sender: UITapGestureRecognizer? = nil) {
textfield.becomeFirstResponder()
}
@objc private func showCurrencyCountryPickerview() {
didSelectCountry?()
}
private func updateText() {
textfield.text = updatedText
}
private func updateCurrency() {
currencyText.text = currency
}
private func updateFlag() {
flagImageView.image = flag
}
}