From 09a372bc45fde16fd42257ab6f78b8deeecf720b Mon Sep 17 00:00:00 2001 From: 杨锴 <841720330@qq.com> Date: 星期三, 16 四月 2025 16:38:05 +0800 Subject: [PATCH] fix bug --- Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager.swift | 281 ++++++++------------------------------------------------ 1 files changed, 41 insertions(+), 240 deletions(-) diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager.swift index a22cd91..b6f232f 100644 --- a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager.swift +++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager.swift @@ -3,69 +3,61 @@ // https://github.com/hackiftekhar/IQKeyboardManager // Copyright (c) 2013-24 Iftekhar Qurashi. // -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: // -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. // -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. import UIKit -import CoreGraphics -import QuartzCore - -// MARK: IQToolbar tags - -// swiftlint:disable line_length -// A generic version of KeyboardManagement. (OLD DOCUMENTATION) LINK -// https://developer.apple.com/library/ios/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/KeyboardManagement/KeyboardManagement.html -// https://developer.apple.com/documentation/uikit/keyboards_and_input/adjusting_your_layout_with_keyboard_layout_guide -// swiftlint:enable line_length /** -Code-less drop-in universal library allows to prevent issues of keyboard sliding up and cover UITextField/UITextView. +Code-less drop-in universal library allows to prevent issues of keyboard sliding up and cover TextInputView. Neither need to write any code nor any setup required and much more. */ @available(iOSApplicationExtension, unavailable) @MainActor -@objc public final class IQKeyboardManager: NSObject { +@objcMembers public final class IQKeyboardManager: NSObject { /** Returns the default singleton instance. */ @MainActor - @objc public static let shared: IQKeyboardManager = .init() + public static let shared: IQKeyboardManager = .init() + + internal var activeConfiguration: IQActiveConfiguration = .init() // MARK: UIKeyboard handling /** - Enable/disable managing distance between keyboard and textField. + Enable/disable managing distance between keyboard and textInputView. Default is YES(Enabled when class loads in `+(void)load` method). */ - @objc public var enable: Bool = false { - + public var isEnabled: Bool = false { didSet { + guard isEnabled != oldValue else { return } // If not enable, enable it. - if enable, !oldValue { + if isEnabled { // If keyboard is currently showing. - if activeConfiguration.keyboardInfo.keyboardShowing { + if activeConfiguration.keyboardInfo.isVisible { adjustPosition() } else { restorePosition() } showLog("Enabled") - } else if !enable, oldValue { // If not disable, disable it. + } else { // If not disable, disable it. restorePosition() showLog("Disabled") } @@ -73,97 +65,18 @@ } /** - To set keyboard distance from textField. can't be less than zero. Default is 10.0. + To set keyboard distance from textInputView. can't be less than zero. Default is 10.0. */ - @objc public var keyboardDistanceFromTextField: CGFloat = 10.0 - - // MARK: IQToolbar handling - - /** - Automatic add the IQToolbar functionality. Default is YES. - */ - @objc public var enableAutoToolbar: Bool = true { - didSet { - reloadInputViews() - showLog("enableAutoToolbar: \(enableAutoToolbar ? "Yes" : "NO")") - } - } - - internal var activeConfiguration: IQActiveConfiguration = .init() - - /** - Configurations related to the toolbar display over the keyboard. - */ - @objc public let toolbarConfiguration: IQToolbarConfiguration = .init() - - /** - Configuration related to keyboard appearance - */ - @objc public let keyboardConfiguration: IQKeyboardConfiguration = .init() - - // MARK: UITextField/UITextView Next/Previous/Resign handling - - /** - Resigns Keyboard on touching outside of UITextField/View. Default is NO. - */ - @objc public var resignOnTouchOutside: Bool = false { - - didSet { - resignFirstResponderGesture.isEnabled = privateResignOnTouchOutside() - - showLog("resignOnTouchOutside: \(resignOnTouchOutside ? "Yes" : "NO")") - } - } - - /** TapGesture to resign keyboard on view's touch. - It's a readonly property and exposed only for adding/removing dependencies - if your added gesture does have collision with this one - */ - @objc public lazy var resignFirstResponderGesture: UITapGestureRecognizer = { - - let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.tapRecognized(_:))) - tapGesture.cancelsTouchesInView = false - tapGesture.delegate = self - - return tapGesture - }() + public var keyboardDistance: CGFloat = 10.0 /*******************************************/ - - /** - Resigns currently first responder field. - */ - @discardableResult - @objc public func resignFirstResponder() -> Bool { - - guard let textFieldRetain: UIView = activeConfiguration.textFieldViewInfo?.textFieldView else { - return false - } - - // Resigning first responder - guard textFieldRetain.resignFirstResponder() else { - showLog("Refuses to resign first responder: \(textFieldRetain)") - // If it refuses then becoming it as first responder again. (Bug ID: #96) - // If it refuses to resign then becoming it first responder again for getting notifications callback. - textFieldRetain.becomeFirstResponder() - return false - } - return true - } - - // MARK: UISound handling - - /** - If YES, then it plays inputClick sound on next/previous/done click. - */ - @objc public var playInputClicks: Bool = true // MARK: UIAnimation handling /** If YES, then calls 'setNeedsLayout' and 'layoutIfNeeded' on any frame update of to viewController's view. */ - @objc public var layoutIfNeededOnUpdate: Bool = false + public var layoutIfNeededOnUpdate: Bool = false // MARK: Class Level disabling methods @@ -171,7 +84,11 @@ Disable distance handling within the scope of disabled distance handling viewControllers classes. Within this scope, 'enabled' property is ignored. Class should be kind of UIViewController. */ - @objc public var disabledDistanceHandlingClasses: [UIViewController.Type] = [] + public var disabledDistanceHandlingClasses: [UIViewController.Type] = [ + UITableViewController.self, + UIInputViewController.self, + UIAlertController.self + ] /** Enable distance handling within the scope of enabled distance handling viewControllers classes. @@ -179,154 +96,38 @@ If same Class is added in disabledDistanceHandlingClasses list, then enabledDistanceHandlingClasses will be ignored. */ - @objc public var enabledDistanceHandlingClasses: [UIViewController.Type] = [] + public var enabledDistanceHandlingClasses: [UIViewController.Type] = [] - /** - Disable automatic toolbar creation within the scope of disabled toolbar viewControllers classes. - Within this scope, 'enableAutoToolbar' property is ignored. Class should be kind of UIViewController. - */ - @objc public var disabledToolbarClasses: [UIViewController.Type] = [] - - /** - Enable automatic toolbar creation within the scope of enabled toolbar viewControllers classes. - Within this scope, 'enableAutoToolbar' property is ignored. Class should be kind of UIViewController. - If same Class is added in disabledToolbarClasses list, then enabledToolbarClasses will be ignore. - */ - @objc public var enabledToolbarClasses: [UIViewController.Type] = [] - - /** - Allowed subclasses of UIView to add all inner textField, - this will allow to navigate between textField contains in different superview. - Class should be kind of UIView. - */ - @objc public var toolbarPreviousNextAllowedClasses: [UIView.Type] = [] - - /** - Disabled classes to ignore resignOnTouchOutside' property, Class should be kind of UIViewController. - */ - @objc public var disabledTouchResignedClasses: [UIViewController.Type] = [] - - /** - Enabled classes to forcefully enable 'resignOnTouchOutside' property. - Class should be kind of UIViewController - . If same Class is added in disabledTouchResignedClasses list, then enabledTouchResignedClasses will be ignored. - */ - @objc public var enabledTouchResignedClasses: [UIViewController.Type] = [] - - /** - if resignOnTouchOutside is enabled then you can customize the behavior - to not recognize gesture touches on some specific view subclasses. - Class should be kind of UIView. Default is [UIControl, UINavigationBar] - */ - @objc public var touchResignedGestureIgnoreClasses: [UIView.Type] = [] - - // MARK: Third Party Library support - /// Add TextField/TextView Notifications customized Notifications. - /// For example while using YYTextView https://github.com/ibireme/YYText - - /**************************************************************************************/ + /**************************************************************************************/ // MARK: Initialization/De-initialization /* Singleton Object Initialization. */ - override init() { + private override init() { super.init() self.addActiveConfigurationObserver() - // Creating gesture for resignOnTouchOutside. (Enhancement ID: #14) - resignFirstResponderGesture.isEnabled = resignOnTouchOutside - - disabledDistanceHandlingClasses.append(UITableViewController.self) - disabledDistanceHandlingClasses.append(UIInputViewController.self) - disabledDistanceHandlingClasses.append(UIAlertController.self) - - disabledToolbarClasses.append(UIAlertController.self) - disabledToolbarClasses.append(UIInputViewController.self) - - disabledTouchResignedClasses.append(UIAlertController.self) - disabledTouchResignedClasses.append(UIInputViewController.self) - - toolbarPreviousNextAllowedClasses.append(UITableView.self) - toolbarPreviousNextAllowedClasses.append(UICollectionView.self) - toolbarPreviousNextAllowedClasses.append(IQPreviousNextView.self) - - touchResignedGestureIgnoreClasses.append(UIControl.self) - touchResignedGestureIgnoreClasses.append(UINavigationBar.self) - NotificationCenter.default.addObserver(self, selector: #selector(applicationDidBecomeActive(_:)), name: UIApplication.didBecomeActiveNotification, object: nil) - - // (Bug ID: #550) - // Loading IQToolbar, IQTitleBarButtonItem, IQBarButtonItem to fix first time keyboard appearance delay - // If you experience exception breakpoint issue at below line then try these solutions - // https://stackoverflow.com/questions/27375640/all-exception-break-point-is-stopping-for-no-reason-on-simulator - DispatchQueue.main.async { - let textField: UIView = UITextField() - textField.iq.addDone(target: nil, action: #selector(self.doneAction(_:))) - textField.iq.addPreviousNextDone(target: nil, previousAction: #selector(self.previousAction(_:)), - nextAction: #selector(self.nextAction(_:)), - doneAction: #selector(self.doneAction(_:))) - } } deinit { // Disable the keyboard manager. - enable = false + isEnabled = false } // MARK: Public Methods - /* Refreshes textField/textView position if any external changes is explicitly made by user. */ - @objc public func reloadLayoutIfNeeded() { + /* Refreshes textInputView position if any external changes is explicitly made by user. */ + public func reloadLayoutIfNeeded() { guard privateIsEnabled(), - activeConfiguration.keyboardInfo.keyboardShowing, + activeConfiguration.keyboardInfo.isVisible, activeConfiguration.isReady else { return } adjustPosition() } -} - -@available(iOSApplicationExtension, unavailable) -extension IQKeyboardManager: UIGestureRecognizerDelegate { - - /** Resigning on tap gesture. (Enhancement ID: #14)*/ - @objc private func tapRecognized(_ gesture: UITapGestureRecognizer) { - - if gesture.state == .ended { - - // Resigning currently responder textField. - resignFirstResponder() - } - } - - /** Note: returning YES is guaranteed to allow simultaneous recognition. - returning NO is not guaranteed to prevent simultaneous recognition, - as the other gesture's delegate may return YES. - */ - @objc public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, - shouldRecognizeSimultaneouslyWith - otherGestureRecognizer: UIGestureRecognizer) -> Bool { - return false - } - - /** - To not detect touch events in a subclass of UIControl, - these may have added their own selector for specific work - */ - @objc public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, - shouldReceive touch: UITouch) -> Bool { - // (Bug ID: #145) - // Should not recognize gesture if the clicked view is either UIControl or UINavigationBar(<Back button etc...) - - for ignoreClass in touchResignedGestureIgnoreClasses where touch.view?.isKind(of: ignoreClass) ?? false { - return false - } - - return true - } - } -- Gitblit v1.7.1