| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297 |
- //
- // TRTCLoginRootView.swift
- // TXLiteAVDemo
- //
- // Created by gg on 2021/4/7.
- // Copyright © 2021 Tencent. All rights reserved.
- //
- import UIKit
- class TRTCLoginRootView: UIView {
-
- lazy var contentView: UIView = {
- let view = UIView(frame: .zero)
- view.backgroundColor = .white
- return view
- }()
-
- lazy var countryCodeTipsImageView: UIImageView = {
- let imageView = UIImageView(image: UIImage(named: "detail"))
- imageView.isUserInteractionEnabled = false
- return imageView
- }()
-
- lazy var textLable: UILabel = {
- let label = UILabel()
- label.text = .useNameText
- label.font = UIFont(name: "PingFangSC-Regular", size: 16)
- label.adjustsFontSizeToFitWidth = true
- return label
- }()
-
- lazy var phoneNumTextField: UITextField = {
- let textField = createTextField(.phoneNumPlaceholderText)
- return textField
- }()
-
- lazy var phoneNumBottomLine: UIView = {
- let view = createSpacingLine()
- return view
- }()
-
- lazy var verifyCodeBottomLine: UIView = {
- let view = createSpacingLine()
- return view
- }()
-
- lazy var loginBtn: UIButton = {
- let btn = UIButton(type: .custom)
- btn.setTitleColor(.white, for: .normal)
- btn.setTitle(.loginText, for: .normal)
- btn.adjustsImageWhenHighlighted = false
- btn.setBackgroundImage(UIColor.tui_color(withHex: "006EFF").trans2Image(), for: .normal)
- btn.titleLabel?.font = UIFont(name: "PingFangSC-Medium", size: 18)
- btn.layer.shadowColor = UIColor.tui_color(withHex: "006EFF").cgColor
- btn.layer.shadowOffset = CGSize(width: 0, height: 6)
- btn.layer.shadowRadius = 16
- btn.layer.shadowOpacity = 0.4
- btn.layer.masksToBounds = true
- btn.isEnabled = false
- return btn
- }()
-
- private func createSpacingLine() -> UIView {
- let view = UIView(frame: .zero)
- view.backgroundColor = UIColor.tui_color(withHex: "EEEEEE")
- return view
- }
-
- private func createTextField(_ placeholder: String) -> UITextField {
- let textField = UITextField(frame: .zero)
- textField.backgroundColor = .white
- textField.font = UIFont(name: "PingFangSC-Regular", size: 16)
- textField.textColor = UIColor.tui_color(withHex: "333333")
- textField.attributedPlaceholder = NSAttributedString(string: placeholder,
- attributes:
- [NSAttributedString.Key.font :
- UIFont(name: "PingFangSC-Regular", size: 16) ?? UIFont.systemFont(ofSize: 16),
- NSAttributedString.Key.foregroundColor :
- UIColor.tui_color(withHex: "BBBBBB"),])
- textField.delegate = self
- return textField
- }
-
- override func draw(_ rect: CGRect) {
- super.draw(rect)
- contentView.roundedRect(rect: contentView.bounds, byRoundingCorners: .topRight, cornerRadii: CGSize(width: 40, height: 40))
- loginBtn.layer.cornerRadius = loginBtn.frame.height * 0.5
- }
-
- override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
- super.touchesBegan(touches, with: event)
-
- if let current = currentTextField {
- current.resignFirstResponder()
- currentTextField = nil
- }
- UIView.animate(withDuration: 0.3) {
- self.transform = .identity
- }
- }
-
- weak var currentTextField: UITextField?
-
- weak var rootVC: TRTCLoginViewController?
-
- override init(frame: CGRect) {
- super.init(frame: frame)
-
- NotificationCenter.default.addObserver(self, selector: #selector(keyboardFrameChange(noti:)), name:
- UIResponder.keyboardWillChangeFrameNotification, object: nil)
- }
-
- deinit {
- NotificationCenter.default.removeObserver(self)
- }
-
- @objc func keyboardFrameChange(noti : Notification) {
- guard let info = noti.userInfo else {
- return
- }
- guard let value = info[UIResponder.keyboardFrameEndUserInfoKey], value is CGRect else {
- return
- }
- guard let superview = loginBtn.superview else {
- return
- }
- let rect = value as! CGRect
- let converted = superview.convert(loginBtn.frame, to: self)
- if rect.intersects(converted) {
- transform = CGAffineTransform(translationX: 0, y: -converted.maxY+rect.minY)
- }
- }
-
- required init?(coder: NSCoder) {
- fatalError("init(coder:) has not been implemented")
- }
-
- var isViewReady = false
- override func didMoveToWindow() {
- super.didMoveToWindow()
- loginBtn.isEnabled = true
- guard !isViewReady else {
- return
- }
- isViewReady = true
- constructViewHierarchy()
- activateConstraints()
- bindInteraction()
- }
-
- func constructViewHierarchy() {
- addSubview(contentView)
- contentView.addSubview(textLable)
- contentView.addSubview(phoneNumTextField)
- contentView.addSubview(phoneNumBottomLine)
- contentView.addSubview(loginBtn)
- }
-
- func activateConstraints() {
- contentView.snp.makeConstraints { (make) in
- make.top.equalToSuperview()
- make.leading.trailing.bottom.equalToSuperview()
- }
- textLable.snp.makeConstraints { (make) in
- make.top.equalToSuperview().offset(convertPixel(h: 300))
- make.leading.equalToSuperview().offset(convertPixel(w: 40))
- make.height.equalTo(convertPixel(h: 57))
- make.width.equalTo(convertPixel(w: 70))
- }
- phoneNumTextField.snp.makeConstraints { (make) in
- make.top.equalTo(textLable)
- make.leading.equalTo(textLable.snp.trailing).offset(convertPixel(w: 5))
- make.trailing.equalToSuperview().offset(-convertPixel(w: 40))
- make.height.equalTo(convertPixel(h: 57))
- }
- phoneNumBottomLine.snp.makeConstraints { (make) in
- make.bottom.trailing.equalTo(phoneNumTextField)
- make.leading.equalTo(textLable)
- make.height.equalTo(convertPixel(h: 1))
- }
- loginBtn.snp.makeConstraints { (make) in
- make.top.equalTo(phoneNumBottomLine.snp.bottom).offset(convertPixel(h: 50))
- make.leading.equalToSuperview().offset(convertPixel(w: 20))
- make.trailing.equalToSuperview().offset(-convertPixel(w: 20))
- make.height.equalTo(convertPixel(h: 52))
- }
-
- }
- func bindInteraction() {
- loginBtn.addTarget(self, action: #selector(loginBtnClick), for: .touchUpInside)
- }
-
- @objc func loginBtnClick() {
- if let current = currentTextField {
- current.resignFirstResponder()
- }
- guard let phone = phoneNumTextField.text else {
- return
- }
- loginBtn.isEnabled = false
- rootVC?.login(phone: phone, nickName: "")
- DispatchQueue.main.asyncAfter(deadline: .now() + 4.0) {
- self.loginBtn.isEnabled = true
- }
- }
-
- @objc func getVerifyCodeBtnClick() {
-
- }
- }
- extension TRTCLoginRootView: UITextFieldDelegate {
- func textFieldDidBeginEditing(_ textField: UITextField) {
- if let last = currentTextField {
- last.resignFirstResponder()
- }
- currentTextField = textField
- textField.becomeFirstResponder()
- }
- func textFieldDidEndEditing(_ textField: UITextField) {
- textField.resignFirstResponder()
- currentTextField = nil
- UIView.animate(withDuration: 0.3) {
- self.transform = .identity
- }
- checkLoginBtnState()
- }
- func textFieldShouldReturn(_ textField: UITextField) -> Bool {
- textField.resignFirstResponder()
- return true
- }
- func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
- var maxCount = 11
- if textField == phoneNumTextField {
- maxCount = 11
- }
- else {
- maxCount = 6
- }
- guard let textFieldText = textField.text,
- let rangeOfTextToReplace = Range(range, in: textFieldText) else {
- return false
- }
- let substringToReplace = textFieldText[rangeOfTextToReplace]
- let count = textFieldText.count - substringToReplace.count + string.count
- let res = count <= maxCount
- if res {
- var phoneCtt = 0
- var verifyCtt = 0
- if textField == phoneNumTextField {
- phoneCtt = count
- verifyCtt = 6
- }
- else {
- phoneCtt = phoneNumTextField.text?.count ?? 0
- verifyCtt = count
- }
- checkLoginBtnState(phoneCtt: phoneCtt, verifyCtt: verifyCtt)
- }
- return res
- }
-
- func checkLoginBtnState(phoneCtt: Int = -1, verifyCtt: Int = -1) {
- var phone = 0
- var code = 0
- if phoneCtt > -1 || verifyCtt > -1 {
- if phoneCtt > -1 {
- phone = phoneCtt
- }
- else {
- phone = phoneNumTextField.text?.count ?? 0
- }
- if verifyCtt > -1 {
- code = verifyCtt
- }
- else {
- code = 6
- }
- }
- else {
- phone = phoneNumTextField.text?.count ?? 0
- code = 6
- }
- loginBtn.isEnabled = phone > 0 && code == 6
- }
- }
- /// MARK: - internationalization string
- fileprivate extension String {
- static let titleText = LoginLocalize(key: "Welcome to Tencent Real-Time Communication")
- static let phoneNumPlaceholderText = LoginLocalize(key:"Enter a User Id")
- static let verifyCodePlaceholderText = LoginLocalize(key:"Enter a verification code")
- static let getVerifyCodeText = LoginLocalize(key:"Get")
- static let loginText = LoginLocalize(key:"Log In")
- static let useNameText = LoginLocalize(key: "User Name")
- }
|