diff --git a/Podfile b/Podfile index 80af0ba..fa8924d 100644 --- a/Podfile +++ b/Podfile @@ -8,6 +8,7 @@ target 'suixinkan' do pod 'UMCommon' pod 'UMDevice' pod 'UMAPM' + pod 'IQKeyboardManagerSwift' # 微信 Open SDK:仅接入分享能力,不调用支付 API。 pod 'WechatOpenSDK-XCFramework', '~> 2.0.4' diff --git a/Podfile.lock b/Podfile.lock index 48e9e52..03ed760 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -6,6 +6,46 @@ PODS: - AMapFoundation-NO-IDFA (>= 1.9.0) - AMapSearch-NO-IDFA (9.8.0): - AMapFoundation-NO-IDFA (>= 1.9.0) + - IQKeyboardCore (1.0.9) + - IQKeyboardManagerSwift (8.0.3): + - IQKeyboardManagerSwift/Appearance (= 8.0.3) + - IQKeyboardManagerSwift/Core (= 8.0.3) + - IQKeyboardManagerSwift/IQKeyboardReturnManager (= 8.0.3) + - IQKeyboardManagerSwift/IQKeyboardToolbarManager (= 8.0.3) + - IQKeyboardManagerSwift/IQTextView (= 8.0.3) + - IQKeyboardManagerSwift/Resign (= 8.0.3) + - IQKeyboardManagerSwift/Appearance (8.0.3): + - IQKeyboardManagerSwift/Core + - IQTextInputViewNotification + - IQKeyboardManagerSwift/Core (8.0.3): + - IQKeyboardNotification + - IQTextInputViewNotification + - IQKeyboardManagerSwift/IQKeyboardReturnManager (8.0.3): + - IQKeyboardReturnManager + - IQKeyboardManagerSwift/IQKeyboardToolbarManager (8.0.3): + - IQKeyboardManagerSwift/Core + - IQKeyboardToolbarManager + - IQKeyboardManagerSwift/IQTextView (8.0.3): + - IQTextView + - IQKeyboardManagerSwift/Resign (8.0.3): + - IQKeyboardManagerSwift/Core + - IQTextInputViewNotification + - IQKeyboardNotification (1.0.7) + - IQKeyboardReturnManager (1.0.6): + - IQKeyboardCore + - IQKeyboardToolbar (1.1.5): + - IQKeyboardToolbar/Core (= 1.1.5) + - IQKeyboardToolbar/Core (1.1.5): + - IQKeyboardCore + - IQKeyboardToolbar/Placeholderable + - IQKeyboardToolbar/Placeholderable (1.1.5) + - IQKeyboardToolbarManager (1.1.6): + - IQKeyboardToolbar + - IQTextInputViewNotification + - IQTextInputViewNotification (1.0.9): + - IQKeyboardCore + - IQTextView (1.0.5): + - IQKeyboardToolbar/Placeholderable - UMAPM (2.0.7): - UMCommon - UMCommon (7.5.11): @@ -17,6 +57,7 @@ DEPENDENCIES: - AMap3DMap-NO-IDFA - AMapLocation-NO-IDFA - AMapSearch-NO-IDFA + - IQKeyboardManagerSwift - UMAPM - UMCommon - UMDevice @@ -28,6 +69,14 @@ SPEC REPOS: - AMapFoundation-NO-IDFA - AMapLocation-NO-IDFA - AMapSearch-NO-IDFA + - IQKeyboardCore + - IQKeyboardManagerSwift + - IQKeyboardNotification + - IQKeyboardReturnManager + - IQKeyboardToolbar + - IQKeyboardToolbarManager + - IQTextInputViewNotification + - IQTextView - UMAPM - UMCommon - UMDevice @@ -38,11 +87,19 @@ SPEC CHECKSUMS: AMapFoundation-NO-IDFA: a2e3c895398d7ee757278e1a0a8f9359da4b146e AMapLocation-NO-IDFA: 7cd8fc837ea41edfbf4d937cd20572e277b77d18 AMapSearch-NO-IDFA: c0afd2a69a076d4228becda4401dbe4a279a03ef + IQKeyboardCore: 250a88dfc713b2ecbe1dce250811d054fc016959 + IQKeyboardManagerSwift: 7f6a9a1e2285732d3ff5f485ff921215253ea77e + IQKeyboardNotification: 3b9bc812a5af2cf97df08a363d9daa9fc0dc1848 + IQKeyboardReturnManager: fcbf51fc68d7536fc1fbcca5231c4e82576b12ac + IQKeyboardToolbar: b0f26e43b9e806e961fde2344fe379ae193236b9 + IQKeyboardToolbarManager: 242e858cc74e06e00aa989bea1355b24d4397854 + IQTextInputViewNotification: 3b9fb27a16e7ee8958cc9092cfb07a1a9e1fd559 + IQTextView: ae13b4922f22e6f027f62c557d9f4f236b19d5c7 UMAPM: ba9fbebe8dd2048b251c332ab0afc86e1ba5ea63 UMCommon: d652b3b372a801b36db203f5b546ab3e15676898 UMDevice: 20b7b3c37a36b2c5c7ca8b5a54386ff9ed2b3b19 WechatOpenSDK-XCFramework: ff342ae616bb86df3d236aca38059dfd4bc4a949 -PODFILE CHECKSUM: f48a71990c19e75f00e16701179b4f160e74986f +PODFILE CHECKSUM: 0fd38f741cbaae39c8e7a70fa233f651d3b34d0f COCOAPODS: 1.16.2 diff --git a/Pods/IQKeyboardCore/IQKeyboardCore/Assets/PrivacyInfo.xcprivacy b/Pods/IQKeyboardCore/IQKeyboardCore/Assets/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..9021190 --- /dev/null +++ b/Pods/IQKeyboardCore/IQKeyboardCore/Assets/PrivacyInfo.xcprivacy @@ -0,0 +1,14 @@ + + + + + NSPrivacyAccessedAPITypes + + NSPrivacyTrackingDomains + + NSPrivacyCollectedDataTypes + + NSPrivacyTracking + + + diff --git a/Pods/IQKeyboardCore/IQKeyboardCore/Classes/Constants/IQKeyboardConstants.swift b/Pods/IQKeyboardCore/IQKeyboardCore/Classes/Constants/IQKeyboardConstants.swift new file mode 100644 index 0000000..a4e8fe6 --- /dev/null +++ b/Pods/IQKeyboardCore/IQKeyboardCore/Classes/Constants/IQKeyboardConstants.swift @@ -0,0 +1,41 @@ +// +// IQKeyboardConstants.swift +// https://github.com/hackiftekhar/IQKeyboardCore +// 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: +// +// 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. + +import Foundation + +/** + `IQEnableModeDefault` + Pick default settings. + + `IQEnableModeEnabled` + setting is enabled. + + `IQEnableModeDisabled` + setting is disabled. + */ +@available(iOSApplicationExtension, unavailable) +@objc public enum IQEnableMode: Int { + case `default` + case enabled + case disabled +} diff --git a/Pods/IQKeyboardCore/IQKeyboardCore/Classes/IQKeyboardExtended.swift b/Pods/IQKeyboardCore/IQKeyboardCore/Classes/IQKeyboardExtended.swift new file mode 100644 index 0000000..24b15d7 --- /dev/null +++ b/Pods/IQKeyboardCore/IQKeyboardCore/Classes/IQKeyboardExtended.swift @@ -0,0 +1,65 @@ +// +// IQKeyboardExtended.swift +// https://github.com/hackiftekhar/IQKeyboardCore +// 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: +// +// 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. + +import UIKit + +/// Wrapper for IQKeyboardManager compatible types. This type provides an extension point for +/// convenience methods in IQKeyboardManager. +@available(iOSApplicationExtension, unavailable) +public struct IQKeyboardExtension { + public private(set) weak var base: Base? + fileprivate init(_ base: Base) { + self.base = base + } +} + +// swiftlint:disable identifier_name +/// Represents an object type that is compatible with IQKeyboardManager. You can use `iq` property to get a +/// value in the namespace of IQKeyboardManager. +@available(iOSApplicationExtension, unavailable) +public protocol IQKeyboardExtended { + /// Type being extended. + associatedtype Base: AnyObject + + /// Instance IQKeyboardManager extension point. + @MainActor + var iq: IQKeyboardExtension { get set } +} + +// swiftlint:disable unused_setter_value +@available(iOSApplicationExtension, unavailable) +public extension IQKeyboardExtended where Self: UIView { + + /// Instance IQKeyboardManager extension point. + @MainActor + var iq: IQKeyboardExtension { + get { IQKeyboardExtension(self) } + set {} + } +} +// swiftlint:enable unused_setter_value +// swiftlint:enable identifier_name + +@available(iOSApplicationExtension, unavailable) +@MainActor +extension UIView: IQKeyboardExtended {} diff --git a/Pods/IQKeyboardCore/IQKeyboardCore/Classes/IQTextInputView.swift b/Pods/IQKeyboardCore/IQKeyboardCore/Classes/IQTextInputView.swift new file mode 100644 index 0000000..8b88f08 --- /dev/null +++ b/Pods/IQKeyboardCore/IQKeyboardCore/Classes/IQTextInputView.swift @@ -0,0 +1,99 @@ +// +// IQTextInputView.swift +// https://github.com/hackiftekhar/IQKeyboardCore +// 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: +// +// 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. + +import UIKit + +@available(iOSApplicationExtension, unavailable) +@MainActor +@objc public protocol IQTextInputView where Self: UIView, Self: UITextInputTraits { + +#if compiler(>=5.7) // Xcode 14 + @available(iOS 16.0, *) + @objc var iqIsFindInteractionEnabled: Bool { get } + + @available(iOS 16.0, *) + @objc var iqFindInteraction: UIFindInteraction? { get } +#endif + + @objc var returnKeyType: UIReturnKeyType { get set } + @objc var keyboardAppearance: UIKeyboardAppearance { get set } + + @objc var iqIsEnabled: Bool { get } + + @objc var inputAccessoryView: UIView? { get set } +} + +@available(iOSApplicationExtension, unavailable) +@MainActor +@objc extension UITextField: IQTextInputView { + +#if compiler(>=5.7) // Xcode 14 + @available(iOS 16.0, *) + public var iqIsFindInteractionEnabled: Bool { false } + + @available(iOS 16.0, *) + public var iqFindInteraction: UIFindInteraction? { nil } +#endif + + public var iqIsEnabled: Bool { isEnabled } +} + +@available(iOSApplicationExtension, unavailable) +@MainActor +@objc extension UITextView: IQTextInputView { + +#if compiler(>=5.7) // Xcode 14 + @available(iOS 16.0, *) + public var iqIsFindInteractionEnabled: Bool { isFindInteractionEnabled } + + @available(iOS 16.0, *) + public var iqFindInteraction: UIFindInteraction? { findInteraction } +#endif + + public var iqIsEnabled: Bool { isEditable } +} + +@available(iOSApplicationExtension, unavailable) +@MainActor +@objc extension UISearchBar: IQTextInputView { + +#if compiler(>=5.7) // Xcode 14 + @available(iOS 16.0, *) + public var iqIsFindInteractionEnabled: Bool { false } + + @available(iOS 16.0, *) + public var iqFindInteraction: UIFindInteraction? { nil } +#endif + + public var iqIsEnabled: Bool { +#if compiler(>=5.8) // Xcode 14.4 + if #available(iOS 16.4, *) { + return isEnabled + } else { + return searchTextField.isEnabled + } +#else + return searchTextField.isEnabled +#endif + } +} diff --git a/Pods/IQKeyboardCore/IQKeyboardCore/Classes/UIKitExtensions/UIView+Hierarchy.swift b/Pods/IQKeyboardCore/IQKeyboardCore/Classes/UIKitExtensions/UIView+Hierarchy.swift new file mode 100644 index 0000000..0eafafe --- /dev/null +++ b/Pods/IQKeyboardCore/IQKeyboardCore/Classes/UIKitExtensions/UIView+Hierarchy.swift @@ -0,0 +1,180 @@ +// +// UIView+Hierarchy.swift +// https://github.com/hackiftekhar/IQKeyboardCore +// 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: +// +// 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. + +import UIKit + +/** + UIView hierarchy category. + */ + +@available(iOSApplicationExtension, unavailable) +@MainActor +public extension IQKeyboardExtension where Base: UIView { + + // MARK: viewControllers + + /** + Returns the UIViewController object that manages the receiver. + */ + func viewContainingController() -> UIViewController? { + + var nextResponder: UIResponder? = base + + repeat { + nextResponder = nextResponder?.next + + if let viewController: UIViewController = nextResponder as? UIViewController { + return viewController + } + + } while nextResponder != nil + + return nil + } + + @available(*, unavailable, message: "This has been removed because it no longer needed") + func topMostController() -> UIViewController? { nil } +} + +@available(iOSApplicationExtension, unavailable) +@MainActor +public extension IQKeyboardExtension where Base: UIView { + + // MARK: Superviews + /** + Returns the superView of provided class type. + + @param classType class type of the object which is to be search in above hierarchy and return + + @param belowView view object in upper hierarchy where method should stop searching and return nil + */ + func superviewOf(type classType: T.Type, belowView: UIView? = nil) -> T? { + + var superView: UIView? = base?.superview + + while let aSuperview: UIView = superView { + + if aSuperview.isKind(of: classType) { + + // If it's UIScrollView, then validating for special cases + if aSuperview is UIScrollView { + + let classNameString: String = "\(type(of: aSuperview.self))" + + // If it's not UITableViewWrapperView class, + // this is internal class which is actually manage in UITableview. + // The speciality of this class is that it's superview is UITableView. + // If it's not UITableViewCellScrollView class, + // this is internal class which is actually manage in UITableviewCell. + // The speciality of this class is that it's superview is UITableViewCell. + // If it's not _UIQueuingScrollView class, + // actually we validate for _ prefix which usually used by Apple internal classes + if !(aSuperview.superview is UITableView), + !(aSuperview.superview is UITableViewCell), + !classNameString.hasPrefix("_") { + return superView as? T + } + } else { + return superView as? T + } + } else if aSuperview == belowView { + return nil + } + + superView = aSuperview.superview + } + + return nil + } + + // MARK: Special TextFields + + /** + Returns searchBar if receiver object is UISearchBarTextField, otherwise return nil. + */ + func textFieldSearchBar() -> UISearchBar? { + + if base is UISearchTextField, + var textInputViewController = base?.iq.viewContainingController() { + if let navController: UINavigationController = textInputViewController as? UINavigationController, + let topController: UIViewController = navController.topViewController { + textInputViewController = topController + } + + // Not adjusting for searchTextField inside searchController. + if textInputViewController.navigationItem.searchController?.searchBar.searchTextField == base { + return textInputViewController.navigationItem.searchController?.searchBar + } + } else { + var responder: UIResponder? = base?.next + + while let bar: UIResponder = responder { + + if let searchBar: UISearchBar = bar as? UISearchBar { + return searchBar + } else if bar is UIViewController { + break + } + + responder = bar.next + } + } + return nil + } + + /** + Returns YES if the receiver object is UIAlertSheetTextField, otherwise return NO. + */ + func isAlertViewTextField() -> Bool { + + var alertViewController: UIResponder? = viewContainingController() + + var isAlertViewTextField: Bool = false + + while let controller: UIResponder = alertViewController, !isAlertViewTextField { + + if controller is UIAlertController { + isAlertViewTextField = true + break + } + + alertViewController = controller.next + } + + return isAlertViewTextField + } +} + +@available(iOSApplicationExtension, unavailable) +@MainActor +@objc public extension UIView { + + @available(*, unavailable, renamed: "iq.viewContainingController()") + func viewContainingController() -> UIViewController? { nil } + + @available(*, unavailable, message: "This has been removed because it no longer needed") + func topMostController() -> UIViewController? { nil } + + @available(*, unavailable, renamed: "iq.superviewOf(type:belowView:)") + func superviewOfClassType(_ classType: UIView.Type, belowView: UIView? = nil) -> UIView? { nil } +} diff --git a/Pods/IQKeyboardCore/LICENSE b/Pods/IQKeyboardCore/LICENSE new file mode 100644 index 0000000..5d8eb96 --- /dev/null +++ b/Pods/IQKeyboardCore/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 Mohd 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: + +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. diff --git a/Pods/IQKeyboardCore/README.md b/Pods/IQKeyboardCore/README.md new file mode 100644 index 0000000..f098c96 --- /dev/null +++ b/Pods/IQKeyboardCore/README.md @@ -0,0 +1,75 @@ +# IQKeyboardCore + +[![CI Status](https://img.shields.io/travis/hackiftekhar/IQKeyboardCore.svg?style=flat)](https://travis-ci.org/hackiftekhar/IQKeyboardCore) +[![Version](https://img.shields.io/cocoapods/v/IQKeyboardCore.svg?style=flat)](https://cocoapods.org/pods/IQKeyboardCore) +[![License](https://img.shields.io/cocoapods/l/IQKeyboardCore.svg?style=flat)](https://cocoapods.org/pods/IQKeyboardCore) +[![Platform](https://img.shields.io/cocoapods/p/IQKeyboardCore.svg?style=flat)](https://cocoapods.org/pods/IQKeyboardCore) + +## Example + +To run the example project, clone the repo, and run `pod install` from the Example directory first. + +## Requirements + +## Installation + +IQKeyboardCore is available through [CocoaPods](https://cocoapods.org). To install +it, simply add the following line to your Podfile: + +```ruby +pod 'IQKeyboardCore' +``` + +## Usage + +IQKeyboardCore is not intended to use independently. It's just a helper and extension for most of the IQKeyboard related libraries + +This contains IQTextInputView protocol +```swift +@objc public protocol IQTextInputView where Self: UIView, Self: UITextInputTraits { +} +``` +UITextField, UITextView and UISearchBar are the known classes who adopted this protocol within the library + +```swift +@objc extension UITextField: IQTextInputView {...} + +@objc extension UITextView: IQTextInputView {...} + +@objc extension UISearchBar: IQTextInputView {...} +``` + +This library also contains IQEnableMode which is used by other libraries +```swift +@objc public enum IQEnableMode: Int { + case `default` + case enabled + case disabled +} +``` + +There are other extension functions which are available on UIView +```swift +public extension IQKeyboardExtension where Base: UIView { + func viewContainingController() -> UIViewController? + func superviewOf(type classType: T.Type, belowView: UIView? = nil) -> T? + func textFieldSearchBar() -> UISearchBar? + func isAlertViewTextField() -> Bool +} +``` + +Above extension functions can be used like below +```swift + view.iq.viewContainingController() + view.iq.superviewOf(type: UIScrollView.self) + view.iq.textFieldSearchBar() + view.iq.isAlertViewTextField() +``` + +## Author + +hackiftekhar, ideviftekhar@gmail.com + +## License + +IQKeyboardCore is available under the MIT license. See the LICENSE file for more info. diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Appearance/IQKeyboardAppearanceConfiguration.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Appearance/IQKeyboardAppearanceConfiguration.swift new file mode 100644 index 0000000..49de03b --- /dev/null +++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Appearance/IQKeyboardAppearanceConfiguration.swift @@ -0,0 +1,43 @@ +// +// IQKeyboardAppearanceConfiguration.swift +// 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: +// +// 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. + +import UIKit + +@available(iOSApplicationExtension, unavailable) +@MainActor +@objcMembers public final class IQKeyboardAppearanceConfiguration: NSObject { + + /** + Override the keyboardAppearance for all textInputView. Default is NO. + */ + public var overrideAppearance: Bool = false + + /** + If overrideKeyboardAppearance is YES, then all the textInputView keyboardAppearance is set using this property. + */ + public var appearance: UIKeyboardAppearance = .default +} + +@available(*, unavailable, renamed: "IQKeyboardAppearanceConfiguration") +@MainActor +@objcMembers public final class IQKeyboardConfiguration: NSObject {} diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Appearance/IQKeyboardAppearanceManager+Internal.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Appearance/IQKeyboardAppearanceManager+Internal.swift new file mode 100644 index 0000000..fd475c0 --- /dev/null +++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Appearance/IQKeyboardAppearanceManager+Internal.swift @@ -0,0 +1,50 @@ +// +// IQKeyboardAppearanceManager+Internal.swift +// 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: +// +// 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. + +import UIKit + +@available(iOSApplicationExtension, unavailable) +@MainActor +internal extension IQKeyboardAppearanceManager { + + func removeTextInputViewObserver() { + textInputViewObserver.unsubscribe(identifier: "IQKeyboardAppearanceManager") + } + + func addTextInputViewObserver() { + textInputViewObserver.subscribe(identifier: "IQKeyboardAppearanceManager", + changeHandler: { [weak self] event, textInputView in + guard let self = self else { return } + switch event { + case .beginEditing: + guard self.keyboardConfiguration.overrideAppearance, + textInputView.keyboardAppearance != self.keyboardConfiguration.appearance else { return } + + textInputView.keyboardAppearance = self.keyboardConfiguration.appearance + textInputView.reloadInputViews() + case .endEditing: + break + } + }) + } +} diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Appearance/IQKeyboardAppearanceManager.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Appearance/IQKeyboardAppearanceManager.swift new file mode 100644 index 0000000..4a6fdaa --- /dev/null +++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Appearance/IQKeyboardAppearanceManager.swift @@ -0,0 +1,44 @@ +// +// IQKeyboardAppearanceManager.swift +// 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: +// +// 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. + +import UIKit +import IQTextInputViewNotification + +@available(iOSApplicationExtension, unavailable) +@MainActor +@objcMembers internal final class IQKeyboardAppearanceManager: NSObject { + + let textInputViewObserver: IQTextInputViewNotification = .init() + + /** + Configuration related to keyboard appearance + */ + var keyboardConfiguration: IQKeyboardAppearanceConfiguration = .init() + + public override init() { + super.init() + + // Registering one time only + addTextInputViewObserver() + } +} diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Appearance/IQKeyboardManager+Appearance.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Appearance/IQKeyboardManager+Appearance.swift new file mode 100644 index 0000000..cea51c2 --- /dev/null +++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Appearance/IQKeyboardManager+Appearance.swift @@ -0,0 +1,55 @@ +// +// IQKeyboardManager+Appearance.swift +// 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: +// +// 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. + +import UIKit + +@available(iOSApplicationExtension, unavailable) +@MainActor +@objc public extension IQKeyboardManager { + + @MainActor + private struct AssociatedKeys { + static var appearanceManager: Int = 0 + } + + internal var appearanceManager: IQKeyboardAppearanceManager { + if let object = objc_getAssociatedObject(self, &AssociatedKeys.appearanceManager) + as? IQKeyboardAppearanceManager { + return object + } + + let object: IQKeyboardAppearanceManager = .init() + objc_setAssociatedObject(self, &AssociatedKeys.appearanceManager, + object, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + + return object + } + + /** + Configuration related to keyboard appearance + */ + var keyboardConfiguration: IQKeyboardAppearanceConfiguration { + get { appearanceManager.keyboardConfiguration } + set { appearanceManager.keyboardConfiguration = newValue } + } +} diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Appearance/IQKeyboardManager+Appearance_Deprecated.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Appearance/IQKeyboardManager+Appearance_Deprecated.swift new file mode 100644 index 0000000..8e9cfb5 --- /dev/null +++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Appearance/IQKeyboardManager+Appearance_Deprecated.swift @@ -0,0 +1,43 @@ +// +// IQKeyboardManager+Appearance_Deprecated.swift +// 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: +// +// 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. + +import UIKit + +// swiftlint:disable unused_setter_value +@available(iOSApplicationExtension, unavailable) +@MainActor +@objc public extension IQKeyboardManager { + + @available(*, unavailable, renamed: "keyboardConfiguration.overrideAppearance") + var overrideKeyboardAppearance: Bool { + get { false } + set { } + } + + @available(*, unavailable, renamed: "keyboardConfiguration.appearance") + var keyboardAppearance: UIKeyboardAppearance { + get { .default } + set { } + } +} +// swiftlint:enable unused_setter_value diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/Configuration/IQActiveConfiguration.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/Configuration/IQActiveConfiguration.swift new file mode 100644 index 0000000..8018027 --- /dev/null +++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/Configuration/IQActiveConfiguration.swift @@ -0,0 +1,273 @@ +// +// IQActiveConfiguration.swift +// 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: +// +// 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. + +import UIKit +import IQKeyboardCore +import IQKeyboardNotification +import IQTextInputViewNotification +import Combine + +@available(iOSApplicationExtension, unavailable) +@MainActor +internal final class IQActiveConfiguration: NSObject { + + private let keyboardObserver: IQKeyboardNotification = .init() + private let textInputViewObserver: IQTextInputViewNotification = .init() + + private var changeObservers: [AnyHashable: ConfigurationCompletion] = [:] + var cancellable: Set = [] + + enum Event: Int { + case hide + case show + case change + + var name: String { + switch self { + case .hide: + return "hide" + case .show: + return "show" + case .change: + return "change" + } + } + } + + private var lastEvent: Event = .hide + + var rootConfiguration: IQRootControllerConfiguration? + + var isReady: Bool { + if textInputViewInfo != nil, + let rootConfiguration = rootConfiguration { + return rootConfiguration.isReady + } + return false + } + + override init() { + super.init() + addKeyboardObserver() + addTextInputViewObserver() + } + + private func sendEvent() { + + guard let rootConfiguration = rootConfiguration, + rootConfiguration.isReady else { return } + + if keyboardInfo.isVisible { + if lastEvent == .hide { + self.notify(event: .show, keyboardInfo: keyboardInfo, textInputViewInfo: textInputViewInfo) + } else { + self.notify(event: .change, keyboardInfo: keyboardInfo, textInputViewInfo: textInputViewInfo) + } + + } else if lastEvent != .hide { + if rootConfiguration.beginOrientation == rootConfiguration.currentOrientation { + + // If interactive pop gesture is active then it manipulate viewController.view's frame + // To overcome with this, we have to do this workaround. + if rootConfiguration.isInteractiveGestureActive, + let rootController: UIViewController = rootConfiguration.rootController { + + self.cancellable.forEach { $0.cancel() } + self.cancellable.removeAll() + + // Saving current keyboard info and textInputView + let keyboardInfo = keyboardObserver.keyboardInfo + let textInputViewInfo = textInputViewObserver.textInputViewInfo + + // Start observing frame changes. + // If pop successful, then we'll not get callbacks here again + // If user cancels the pop, then we'll get frame as .zero at some time + // Also the interactiveGesture becomes inactive (genuinely it's state is .possible) + // At this moment. + rootController.view.publisher(for: \.frame) + .removeDuplicates() + .sink(receiveValue: { [weak self] frame in + guard let self = self else { return } + guard frame.origin == .zero, + !rootConfiguration.isInteractiveGestureActive else { return } + + self.cancellable.forEach { $0.cancel() } + self.cancellable.removeAll() + + // Restore keyboard info and textInputViewInfo + self.notify(event: .change, keyboardInfo: keyboardInfo, textInputViewInfo: textInputViewInfo) + }).store(in: &cancellable) + + } else { + self.notify(event: .hide, keyboardInfo: keyboardInfo, textInputViewInfo: textInputViewInfo) + self.rootConfiguration = nil + } + + } else if rootConfiguration.hasChanged { + animate(alongsideTransition: { + rootConfiguration.restore() + }, completion: nil) + } + } + } + + private func updateRootController(textInputView: IQTextInputView?) { + + guard let textInputView: UIView = textInputView, + let controller: UIViewController = textInputView.iq.parentContainerViewController() else { + if let rootConfiguration = rootConfiguration, + rootConfiguration.hasChanged { + animate(alongsideTransition: { + rootConfiguration.restore() + }, completion: nil) + } + rootConfiguration = nil + return + } + + let newConfiguration = IQRootControllerConfiguration(rootController: controller) + + guard newConfiguration.rootController?.view.window != rootConfiguration?.rootController?.view.window || + newConfiguration.beginOrientation != rootConfiguration?.beginOrientation else { return } + + if rootConfiguration?.rootController != newConfiguration.rootController { + + // If there was an old configuration but things are changed + if let rootConfiguration = rootConfiguration, + rootConfiguration.hasChanged { + animate(alongsideTransition: { + rootConfiguration.restore() + }, completion: nil) + } + } + + rootConfiguration = newConfiguration + } +} + +@available(iOSApplicationExtension, unavailable) +@MainActor +extension IQActiveConfiguration { + + var keyboardInfo: IQKeyboardInfo { + return keyboardObserver.keyboardInfo + } + + private func addKeyboardObserver() { + keyboardObserver.subscribe(identifier: "IQActiveConfiguration", changeHandler: { [weak self] _, endFrame in + + guard let self = self else { return } + + guard self.keyboardObserver.oldKeyboardInfo.endFrame.height != endFrame.height else { return } + + if let info = self.textInputViewInfo, self.keyboardInfo.isVisible { + if let rootConfiguration = self.rootConfiguration { + let beginIsPortrait: Bool = rootConfiguration.beginOrientation.isPortrait + let currentIsPortrait: Bool = rootConfiguration.currentOrientation.isPortrait + if beginIsPortrait != currentIsPortrait { + self.updateRootController(textInputView: info.textInputView) + } + } else { + self.updateRootController(textInputView: info.textInputView) + } + } + + self.sendEvent() + + // If interactive pop gesture is active then we don't want to remove this textField + if endFrame.height == 0, + !(self.rootConfiguration?.isInteractiveGestureActive ?? false) { + self.updateRootController(textInputView: nil) + } + }) + } + + public func animate(alongsideTransition transition: @escaping () -> Void, completion: (() -> Void)? = nil) { + keyboardObserver.animate(alongsideTransition: transition, completion: completion) + } +} + +@available(iOSApplicationExtension, unavailable) +@MainActor +extension IQActiveConfiguration { + + var textInputView: (any IQTextInputView)? { + guard let textInputView: UIView = textInputViewObserver.textInputView, + textInputView.iq.isAlertViewTextField() == false else { + return nil + } + + return textInputViewObserver.textInputView + } + + var textInputViewInfo: IQTextInputViewInfo? { + guard let textInputView: UIView = textInputView, + textInputView.iq.isAlertViewTextField() == false else { + return nil + } + + return textInputViewObserver.textInputViewInfo + } + + private func addTextInputViewObserver() { + textInputViewObserver.subscribe(identifier: "IQActiveConfiguration", + changeHandler: { [weak self] event, textInputView in + + guard let self = self else { return } + + guard (textInputView as UIView).iq.isAlertViewTextField() == false else { + return + } + + if event == .beginEditing { + self.updateRootController(textInputView: textInputView) + self.sendEvent() + } + }) + } +} + +@available(iOSApplicationExtension, unavailable) +@MainActor +extension IQActiveConfiguration { + + typealias ConfigurationCompletion = (_ event: Event, + _ keyboardInfo: IQKeyboardInfo, + _ textInputViewInfo: IQTextInputViewInfo?) -> Void + + func subscribe(identifier: AnyHashable, changeHandler: @escaping ConfigurationCompletion) { + changeObservers[identifier] = changeHandler + } + + func unsubscribe(identifier: AnyHashable) { + changeObservers[identifier] = nil + } + + private func notify(event: Event, keyboardInfo: IQKeyboardInfo, textInputViewInfo: IQTextInputViewInfo?) { + lastEvent = event + + for block in changeObservers.values { + block(event, keyboardInfo, textInputViewInfo) + } + } +} diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/Configuration/IQRootControllerConfiguration.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/Configuration/IQRootControllerConfiguration.swift new file mode 100644 index 0000000..4980b73 --- /dev/null +++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/Configuration/IQRootControllerConfiguration.swift @@ -0,0 +1,95 @@ +// +// IQRootControllerConfiguration.swift +// 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: +// +// 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. + +import UIKit + +@available(iOSApplicationExtension, unavailable) +@MainActor +internal struct IQRootControllerConfiguration { + + weak var rootController: UIViewController? + let beginOrigin: CGPoint + let beginSafeAreaInsets: UIEdgeInsets + let beginOrientation: UIInterfaceOrientation + + init(rootController: UIViewController) { + self.rootController = rootController + beginOrigin = rootController.view.frame.origin + beginSafeAreaInsets = rootController.view.safeAreaInsets + + let interfaceOrientation: UIInterfaceOrientation + if let scene = rootController.view.window?.windowScene { + interfaceOrientation = scene.interfaceOrientation + } else { + interfaceOrientation = .unknown + } + + beginOrientation = interfaceOrientation + } + + var currentOrientation: UIInterfaceOrientation { + let interfaceOrientation: UIInterfaceOrientation + if let scene = rootController?.view.window?.windowScene { + interfaceOrientation = scene.interfaceOrientation + } else { + interfaceOrientation = .unknown + } + return interfaceOrientation + } + + var isReady: Bool { + return rootController?.view.window != nil + } + + var hasChanged: Bool { + let origin: CGPoint = rootController?.view.frame.origin ?? .zero + return !origin.equalTo(beginOrigin) + } + + var isInteractiveGestureActive: Bool { + guard let rootController: UIViewController = rootController, + let navigationController: UINavigationController = rootController.navigationController, + let interactiveGestureRecognizer = navigationController.interactivePopGestureRecognizer else { + return false + } + switch interactiveGestureRecognizer.state { + case .began, .changed: + return true + case .possible, .ended, .cancelled, .failed, .recognized: + // swiftlint:disable:next no_fallthrough_only + fallthrough + default: + return false + } + } + @discardableResult + func restore() -> Bool { + guard let rootController: UIViewController = rootController, + !rootController.view.frame.origin.equalTo(beginOrigin) else { return false } + // Setting it's new frame + var rect: CGRect = rootController.view.frame + rect.origin = beginOrigin + rootController.view.frame = rect + return true + } +} diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/Configuration/IQScrollViewConfiguration.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/Configuration/IQScrollViewConfiguration.swift new file mode 100644 index 0000000..8ced7b5 --- /dev/null +++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/Configuration/IQScrollViewConfiguration.swift @@ -0,0 +1,100 @@ +// +// IQScrollViewConfiguration.swift +// 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: +// +// 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. + +import UIKit +import IQKeyboardCore + +@available(iOSApplicationExtension, unavailable) +@MainActor +internal struct IQScrollViewConfiguration { + let scrollView: UIScrollView + let startingContentOffset: CGPoint + let startingScrollIndicatorInsets: UIEdgeInsets + let startingContentInset: UIEdgeInsets + + private let canRestoreContentOffset: Bool + + init(scrollView: UIScrollView, canRestoreContentOffset: Bool) { + self.scrollView = scrollView + self.canRestoreContentOffset = canRestoreContentOffset + + startingContentOffset = scrollView.contentOffset + startingContentInset = scrollView.contentInset + startingScrollIndicatorInsets = scrollView.verticalScrollIndicatorInsets + } + + var hasChanged: Bool { + if scrollView.contentInset != self.startingContentInset { + return true + } + + if canRestoreContentOffset, + scrollView.iq.restoreContentOffset, + !scrollView.contentOffset.equalTo(startingContentOffset) { + return true + } + return false + } + + @discardableResult + func restore(for textInputView: (some IQTextInputView)?) -> Bool { + var success: Bool = false + + if scrollView.contentInset != self.startingContentInset { + scrollView.contentInset = self.startingContentInset + scrollView.layoutIfNeeded() // (Bug ID: #1996) + success = true + } + + if scrollView.verticalScrollIndicatorInsets != self.startingScrollIndicatorInsets { + scrollView.verticalScrollIndicatorInsets = self.startingScrollIndicatorInsets + } + + if canRestoreContentOffset, + scrollView.iq.restoreContentOffset, + !scrollView.contentOffset.equalTo(startingContentOffset) { + + // (Bug ID: #1365, #1508, #1541) + let stackView: UIStackView? + if let textInputView: UIView = textInputView { + stackView = textInputView.iq.superviewOf(type: UIStackView.self, + belowView: scrollView) + } else { + stackView = nil + } + // (Bug ID: #1901, #1996) + let animatedContentOffset: Bool = stackView != nil || + scrollView is UICollectionView || + scrollView is UITableView + + if animatedContentOffset { + scrollView.setContentOffset(startingContentOffset, animated: UIView.areAnimationsEnabled) + } else { + scrollView.contentOffset = startingContentOffset + } + success = true + } + + return success + } +} diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/Debug/IQKeyboardManager+Debug.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/Debug/IQKeyboardManager+Debug.swift new file mode 100644 index 0000000..ccea38b --- /dev/null +++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/Debug/IQKeyboardManager+Debug.swift @@ -0,0 +1,78 @@ +// +// IQKeyboardManager+Debug.swift +// 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: +// +// 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. + +import UIKit + +// MARK: Debugging & Developer options +@available(iOSApplicationExtension, unavailable) +@MainActor +@objc public extension IQKeyboardManager { + + @MainActor + private struct AssociatedKeys { + static var isDebuggingEnabled: Int = 0 + static var logIndentation: Int = 0 + } + + var isDebuggingEnabled: Bool { + get { + return objc_getAssociatedObject(self, &AssociatedKeys.isDebuggingEnabled) as? Bool ?? false + } + set(newValue) { + objc_setAssociatedObject(self, &AssociatedKeys.isDebuggingEnabled, + newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + } + } + + private var logIndentation: Int { + get { + return objc_getAssociatedObject(self, &AssociatedKeys.logIndentation) as? Int ?? 0 + } + set(newValue) { + objc_setAssociatedObject(self, &AssociatedKeys.logIndentation, + newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + } + } + + internal func showLog(_ logString: String, indentation: Int = 0) { + + guard isDebuggingEnabled else { + return + } + + if indentation < 0 { + logIndentation = max(0, logIndentation + indentation) + } + + var preLog: String = "IQKeyboardManager" + for _ in 0 ... logIndentation { + preLog += "|\t" + } + + print(preLog + logString) + + if indentation > 0 { + logIndentation += indentation + } + } +} diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/Deprecated/IQKeyboardManager+Deprecated.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/Deprecated/IQKeyboardManager+Deprecated.swift new file mode 100644 index 0000000..87bb3f9 --- /dev/null +++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/Deprecated/IQKeyboardManager+Deprecated.swift @@ -0,0 +1,169 @@ +// +// IQKeyboardManager+Deprecated.swift +// 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: +// +// 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. + +import UIKit + +// swiftlint:disable unused_setter_value +// swiftlint:disable line_length +// swiftlint:disable type_name +@available(iOSApplicationExtension, unavailable) +@MainActor +@objc public extension IQKeyboardManager { + + @available(*, unavailable, renamed: "keyboardDistance") + var keyboardDistanceFromTextField: CGFloat { + get { fatalError() } + set { } + } +} + +@available(iOSApplicationExtension, unavailable) +@MainActor +@objc public extension IQKeyboardManager { + + @available(*, unavailable, message: "This feature has been removed due to few compatibility problems") + func registerTextFieldViewClass(_ aClass: UIView.Type, + didBeginEditingNotificationName: String, + didEndEditingNotificationName: String) { + } + + @available(*, unavailable, message: "This feature has been removed due to few compatibility problems") + func unregisterTextFieldViewClass(_ aClass: UIView.Type, + didBeginEditingNotificationName: String, + didEndEditingNotificationName: String) { + } +} + +@available(iOSApplicationExtension, unavailable) +@MainActor +@objc public extension IQKeyboardManager { + + typealias SizeBlock = (_ size: CGSize) -> Void + + @available(*, unavailable, message: "Please use `IQKeyboardNotification` independently from https://github.com/hackiftekhar/IQKeyboardNotification") + func registerKeyboardSizeChange(identifier: AnyHashable, sizeHandler: @escaping SizeBlock) {} + + @available(*, unavailable, message: "Please use `IQKeyboardNotification` independently from https://github.com/hackiftekhar/IQKeyboardNotification") + func unregisterKeyboardSizeChange(identifier: AnyHashable) {} + + @available(*, unavailable, message: "Please use `IQKeyboardNotification` independently from https://github.com/hackiftekhar/IQKeyboardNotification") + var keyboardShowing: Bool { false } + + @available(*, unavailable, message: "Please use `IQKeyboardNotification` independently from https://github.com/hackiftekhar/IQKeyboardNotification") + var keyboardFrame: CGRect { .zero } +} + +@available(*, unavailable, renamed: "IQKeyboardReturnManager", message: "Please use `IQKeyboardReturnManager` independently from https://github.com/hackiftekhar/IQKeyboardReturnManager") +@MainActor +@objcMembers public final class IQKeyboardReturnKeyHandler: NSObject {} + +@available(*, unavailable, renamed: "IQKeyboardNotification", message: "Please use `IQKeyboardNotification` independently from https://github.com/hackiftekhar/IQKeyboardNotification") +@MainActor +@objcMembers public final class IQKeyboardListener: NSObject {} + +@available(*, unavailable, renamed: "IQTextInputViewNotification", message: "Please use `IQTextInputViewNotification` independently from https://github.com/hackiftekhar/IQTextInputViewNotification") +@MainActor +@objcMembers public final class IQTextFieldViewListener: NSObject {} + +@available(*, unavailable, renamed: "IQDeepResponderContainerView", message: "Please use `IQDeepResponderContainerView` class which is now part of `IQKeyboardToolbarManager` from https://github.com/hackiftekhar/IQKeyboardToolbarManager.") +@MainActor +@objcMembers open class IQPreviousNextView: UIView {} + +@available(*, unavailable, message: "Please use `IQKeyboardToolbar` independently https://github.com/hackiftekhar/IQKeyboardToolbar or through `IQKeyboardToolbarManager` from https://github.com/hackiftekhar/IQKeyboardToolbarManager") +@MainActor +@objcMembers public final class IQToolbarPlaceholderConfigurationDeprecated: NSObject { + public var showPlaceholder: Bool = true + public var font: UIFont? + public var color: UIColor? + public var buttonColor: UIColor? + public override var accessibilityLabel: String? { didSet { } } +} + +@available(iOSApplicationExtension, unavailable) +@available(*, unavailable, message: "Please use `IQKeyboardToolbar` independently https://github.com/hackiftekhar/IQKeyboardToolbar or through `IQKeyboardToolbarManager` from https://github.com/hackiftekhar/IQKeyboardToolbarManager") +@MainActor +@objcMembers public final class IQBarButtonItemConfigurationDeprecated: NSObject { + + public init(systemItem: UIBarButtonItem.SystemItem, action: Selector? = nil) { + self.systemItem = systemItem + self.image = nil + self.title = nil + self.action = action + super.init() + } + + public init(image: UIImage, action: Selector? = nil) { + self.systemItem = nil + self.image = image + self.title = nil + self.action = action + super.init() + } + + public init(title: String, action: Selector? = nil) { + self.systemItem = nil + self.image = nil + self.title = title + self.action = action + super.init() + } + + public let systemItem: UIBarButtonItem.SystemItem? + public let image: UIImage? + public let title: String? + public var action: Selector? + public override var accessibilityLabel: String? { didSet { } } +} + +@available(*, unavailable, message: "Please use `IQKeyboardToolbarManager` independently from https://github.com/hackiftekhar/IQKeyboardToolbarManager") +@objc public enum IQAutoToolbarManageBehaviorDeprecated: Int { + case bySubviews + case byTag + case byPosition +} + +@available(*, unavailable, message: "Please use `IQKeyboardToolbarManager` independently from https://github.com/hackiftekhar/IQKeyboardToolbarManager") +@objc public enum IQPreviousNextDisplayModeDeprecated: Int { + case `default` + case alwaysHide + case alwaysShow +} + +@available(*, unavailable, message: "Please use `IQKeyboardToolbarManager` independently from https://github.com/hackiftekhar/IQKeyboardToolbarManager") +@MainActor +@objcMembers public final class IQToolbarConfiguration: NSObject { + + public var useTextInputViewTintColor: Bool = false + public var tintColor: UIColor? + public var barTintColor: UIColor? + public var previousNextDisplayMode: IQPreviousNextDisplayModeDeprecated = .default + public var manageBehavior: IQAutoToolbarManageBehaviorDeprecated = .bySubviews + public var previousBarButtonConfiguration: IQBarButtonItemConfigurationDeprecated? + public var nextBarButtonConfiguration: IQBarButtonItemConfigurationDeprecated? + public var doneBarButtonConfiguration: IQBarButtonItemConfigurationDeprecated? + public let placeholderConfiguration: IQToolbarPlaceholderConfigurationDeprecated = .init() +} + +// swiftlint:enable line_length +// swiftlint:enable unused_setter_value +// swiftlint:enable type_name diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+ActiveConfiguration.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+ActiveConfiguration.swift new file mode 100644 index 0000000..a09bae8 --- /dev/null +++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+ActiveConfiguration.swift @@ -0,0 +1,126 @@ +// +// IQKeyboardManager+ActiveConfiguration.swift +// 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: +// +// 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. + +import UIKit +import IQKeyboardCore +import Combine + +// MARK: UIKeyboard Notifications +@available(iOSApplicationExtension, unavailable) +@MainActor +internal extension IQKeyboardManager { + + func addActiveConfigurationObserver() { + activeConfiguration.subscribe(identifier: "IQKeyboardManager", changeHandler: { [weak self] event, _, _ in + guard let self = self else { return } + + switch event { + case .show: + self.handleKeyboardTextInputViewVisible() + case .change: + self.handleKeyboardTextInputViewChanged() + case .hide: + self.handleKeyboardTextInputViewHide() + } + }) + } + + private func handleKeyboardTextInputViewVisible() { + + setupTextInputView() + + if privateIsEnabled() { + adjustPosition() + } else { + restorePosition() + } + } + + private func handleKeyboardTextInputViewChanged() { + + setupTextInputView() + + if privateIsEnabled() { + adjustPosition() + } else { + restorePosition() + } + } + + private func handleKeyboardTextInputViewHide() { + + self.restorePosition() + self.banishTextInputViewSetup() + + self.lastScrollViewConfiguration = nil + } +} + +@available(iOSApplicationExtension, unavailable) +@MainActor +internal extension IQKeyboardManager { + + func setupTextInputView() { + + guard let textInputView = activeConfiguration.textInputView else { + return + } + + if let startingConfiguration = startingTextViewConfiguration, + startingConfiguration.hasChanged { + + if startingConfiguration.scrollView.contentInset != startingConfiguration.startingContentInset { + showLog(""" + Restoring textView.contentInset to: \(startingConfiguration.startingContentInset) + """) + } + + activeConfiguration.animate(alongsideTransition: { + startingConfiguration.restore(for: textInputView) + }) + } + startingTextViewConfiguration = nil + } + + func banishTextInputViewSetup() { + + guard let textInputView = activeConfiguration.textInputView else { + return + } + + if let startingConfiguration = startingTextViewConfiguration, + startingConfiguration.hasChanged { + + if startingConfiguration.scrollView.contentInset != startingConfiguration.startingContentInset { + showLog(""" + Restoring textView.contentInset to: \(startingConfiguration.startingContentInset) + """) + } + + activeConfiguration.animate(alongsideTransition: { + startingConfiguration.restore(for: textInputView) + }) + } + startingTextViewConfiguration = nil + } +} diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+Internal.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+Internal.swift new file mode 100644 index 0000000..cebe33a --- /dev/null +++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+Internal.swift @@ -0,0 +1,93 @@ +// +// IQKeyboardManager+Internal.swift +// 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: +// +// 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. + +import UIKit +import IQKeyboardCore + +@available(iOSApplicationExtension, unavailable) +@MainActor +internal extension IQKeyboardManager { + + func privateIsEnabled() -> Bool { + + guard let textInputView: any IQTextInputView = activeConfiguration.textInputView else { + return isEnabled + } + + switch textInputView.internalEnableMode { + case .default: + guard var controller = (textInputView as UIView).iq.viewContainingController() else { + return isEnabled + } + + if textInputView is UISearchTextField { + if let navController: UINavigationController = controller as? UINavigationController, + let topController: UIViewController = navController.topViewController { + controller = topController + } + + // Not adjusting for searchTextField inside searchController. + if controller.navigationItem.searchController?.searchBar.searchTextField == textInputView { + return false + } + } + + // If viewController is in enabledDistanceHandlingClasses, then assuming it's enabled. + let isWithEnabledClass: Bool = enabledDistanceHandlingClasses.contains(where: { controller.isKind(of: $0) }) + var isEnabled: Bool = isEnabled || isWithEnabledClass + + if isEnabled { + // If viewController is in disabledDistanceHandlingClasses, + // then assuming it's disabled. + if disabledDistanceHandlingClasses.contains(where: { controller.isKind(of: $0) }) { + isEnabled = false + } else { + // Special Controllers + let classNameString: String = "\(type(of: controller.self))" + + // _UIAlertControllerTextFieldViewController + if classNameString.contains("UIAlertController"), + classNameString.hasSuffix("TextFieldViewController") { + isEnabled = false + } + } + } + + return isEnabled + case .enabled: + return true + case .disabled: + return false + @unknown default: + return false + } + } +} + +@available(iOSApplicationExtension, unavailable) +@MainActor +fileprivate extension IQTextInputView { + var internalEnableMode: IQEnableMode { + return iq.enableMode + } +} diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+Position.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+Position.swift new file mode 100644 index 0000000..beb9bf6 --- /dev/null +++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+Position.swift @@ -0,0 +1,798 @@ +// +// IQKeyboardManager+Position.swift +// 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: +// +// 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. + +import UIKit +import IQKeyboardCore + +// swiftlint:disable file_length +@available(iOSApplicationExtension, unavailable) +@MainActor +@objc public extension IQKeyboardManager { + + private typealias IQLayoutGuide = (top: CGFloat, bottom: CGFloat) + + @MainActor + private struct AssociatedKeys { + static var movedDistance: Int = 0 + static var movedDistanceChanged: Int = 0 + static var lastScrollViewConfiguration: Int = 0 + static var startingTextViewConfiguration: Int = 0 + static var activeConfiguration: Int = 0 + } + + /** + moved distance to the top used to maintain distance between keyboard and textInputView. + Most of the time this will be a positive value. + */ + private(set) var movedDistance: CGFloat { + get { + return objc_getAssociatedObject(self, &AssociatedKeys.movedDistance) as? CGFloat ?? 0.0 + } + set(newValue) { + objc_setAssociatedObject(self, &AssociatedKeys.movedDistance, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + movedDistanceChanged?(movedDistance) + } + } + + /** + Will be called then movedDistance will be changed + */ + var movedDistanceChanged: ((CGFloat) -> Void)? { + get { + return objc_getAssociatedObject(self, &AssociatedKeys.movedDistanceChanged) as? ((CGFloat) -> Void) + } + set(newValue) { + objc_setAssociatedObject(self, &AssociatedKeys.movedDistanceChanged, + newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + movedDistanceChanged?(movedDistance) + } + } + + /** Variable to save lastScrollView that was scrolled. */ + @nonobjc + internal var lastScrollViewConfiguration: IQScrollViewConfiguration? { + get { + return objc_getAssociatedObject(self, + &AssociatedKeys.lastScrollViewConfiguration) as? IQScrollViewConfiguration + } + set(newValue) { + objc_setAssociatedObject(self, &AssociatedKeys.lastScrollViewConfiguration, + newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + } + } + + /** used to adjust contentInset of UITextView. */ + @nonobjc + internal var startingTextViewConfiguration: IQScrollViewConfiguration? { + get { + return objc_getAssociatedObject(self, + &AssociatedKeys.startingTextViewConfiguration) as? IQScrollViewConfiguration + } + set(newValue) { + objc_setAssociatedObject(self, &AssociatedKeys.startingTextViewConfiguration, + newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + } + } + + internal func applicationDidBecomeActive(_ notification: Notification) { + + guard privateIsEnabled(), + activeConfiguration.keyboardInfo.isVisible, + activeConfiguration.isReady else { + return + } + adjustPosition() + } + + /* Adjusting RootViewController's frame according to interface orientation. */ + // swiftlint:disable function_body_length + internal func adjustPosition() { + + guard UIApplication.shared.applicationState == .active, + let textInputView: any IQTextInputView = activeConfiguration.textInputView, + let superview: UIView = textInputView.superview, + let rootConfiguration = activeConfiguration.rootConfiguration, + let rootController: UIViewController = rootConfiguration.rootController, + let window: UIWindow = rootController.view.window else { + return + } + + showLog(">>>>> \(#function) started >>>>>", indentation: 1) + + defer { + showLog("<<<<< \(#function) ended <<<<<", indentation: -1) + } + + let textInputViewRectInWindow: CGRect = superview.convert(textInputView.frame, to: window) + let textInputViewRectInRootSuperview: CGRect = superview.convert(textInputView.frame, + to: rootController.view.superview) + + // Getting RootViewOrigin. + let rootViewOrigin: CGPoint = rootController.view.frame.origin + + let keyboardDistance: CGFloat = getSpecialTextInputViewDistance(textInputView: textInputView) + + let kbSize: CGSize = Self.getKeyboardSize(keyboardDistance: keyboardDistance, + keyboardFrame: activeConfiguration.keyboardInfo.endFrame, + safeAreaInsets: rootConfiguration.beginSafeAreaInsets, + windowFrame: window.frame) + let originalKbSize: CGSize = activeConfiguration.keyboardInfo.endFrame.size + + let isScrollableTextInputView: Bool + + if let textInputView: UIScrollView = textInputView as? UITextView { + isScrollableTextInputView = textInputView.isScrollEnabled + } else { + isScrollableTextInputView = false + } + + let layoutGuide: IQLayoutGuide = Self.getLayoutGuides(rootController: rootController, window: window, + isScrollableTextInputView: isScrollableTextInputView) + + var superScrollView: UIScrollView? + var superView: UIScrollView? = (textInputView as UIView).iq.superviewOf(type: UIScrollView.self) + + // Getting UIScrollView whose scrolling is enabled. // (Bug ID: #285) + while let view: UIScrollView = superView { + + if view.isScrollEnabled, !view.iq.ignoreScrollingAdjustment { + superScrollView = view + break + } else { + // Getting it's superScrollView. // (Enhancement ID: #21, #24) + superView = view.iq.superviewOf(type: UIScrollView.self) + } + } + + // Move positive = textInputView is hidden. + // Move negative = textInputView is showing. + // Calculating move position. + var moveUp: CGFloat = Self.getMoveUpDistance(keyboardSize: kbSize, + layoutGuide: layoutGuide, + textInputViewRectInRootSuperview: textInputViewRectInRootSuperview, + textInputViewRectInWindow: textInputViewRectInWindow, + windowFrame: window.frame) + + showLog("Need to move: \(moveUp), will be moving \(moveUp < 0 ? "down" : "up")") + + + setupActiveScrollViewConfiguration(superScrollView: superScrollView, textInputView: textInputView) + + // Special case for ScrollView. + // If we found lastScrollView then setting it's contentOffset to show textInputView. + if let lastScrollViewConfiguration: IQScrollViewConfiguration = lastScrollViewConfiguration { + adjustScrollViewContentOffsets(moveUp: &moveUp, textInputView: textInputView, + lastScrollViewConfiguration: lastScrollViewConfiguration, + rootSuperview: rootController.view.superview, layoutGuide: layoutGuide, + textInputViewRectInRootSuperview: textInputViewRectInRootSuperview, + isScrollableTextInputView: isScrollableTextInputView, window: window, + kbSize: kbSize, keyboardDistance: keyboardDistance, + rootBeginSafeAreaInsets: rootConfiguration.beginSafeAreaInsets) + } + + // Special case for UITextView + // (Readjusting textInputView.contentInset when textInputView hight is too big to fit on screen) + // _lastScrollView If not having inside any scrollView, now contentInset manages the full screen textInputView. + // If is a UITextView type + if isScrollableTextInputView, let textInputView = textInputView as? UITextView { + + adjustTextInputViewContentInset(window: window, originalKbSize: originalKbSize, + rootSuperview: rootController.view.superview, + layoutGuide: layoutGuide, + textInputView: textInputView) + } + + adjustRootController(moveUp: moveUp, rootViewOrigin: rootViewOrigin, originalKbSize: originalKbSize, + rootController: rootController, rootBeginOrigin: rootConfiguration.beginOrigin) + } + // swiftlint:enable function_body_length + + internal func restorePosition() { + + // Setting rootViewController frame to it's original position. // (Bug ID: #18) + guard let configuration: IQRootControllerConfiguration = activeConfiguration.rootConfiguration else { + return + } + showLog(">>>>> \(#function) started >>>>>", indentation: 1) + + defer { + showLog("<<<<< \(#function) ended <<<<<", indentation: -1) + } + + activeConfiguration.animate(alongsideTransition: { + if configuration.hasChanged { + let classNameString: String = "\(type(of: configuration.rootController.self))" + self.showLog("Restoring \(classNameString) origin to: \(configuration.beginOrigin)") + } + configuration.restore() + + // Animating content if needed (Bug ID: #204) + if self.layoutIfNeededOnUpdate { + // Animating content (Bug ID: #160) + configuration.rootController?.view.setNeedsLayout() + configuration.rootController?.view.layoutIfNeeded() + } + }) + // Restoring the contentOffset of the lastScrollView + if let lastConfiguration: IQScrollViewConfiguration = lastScrollViewConfiguration { + let textInputView: (any IQTextInputView)? = activeConfiguration.textInputView + + restoreScrollViewConfigurationIfChanged(configuration: lastConfiguration, textInputView: textInputView) + + activeConfiguration.animate(alongsideTransition: { + // This is temporary solution. Have to implement the save and restore scrollView state + self.restoreScrollViewContentOffset(superScrollView: lastConfiguration.scrollView, + textInputView: textInputView) + }) + } + + self.movedDistance = 0 + } +} + +// swiftlint:disable function_parameter_count +@available(iOSApplicationExtension, unavailable) +@MainActor +private extension IQKeyboardManager { + + func getSpecialTextInputViewDistance(textInputView: some IQTextInputView) -> CGFloat { + // Maintain keyboardDistance + let specialKeyboardDistance: CGFloat + + if let searchBar: UISearchBar = textInputView.iq.textFieldSearchBar() { + specialKeyboardDistance = searchBar.iq.distanceFromKeyboard + } else { + specialKeyboardDistance = textInputView.iq.distanceFromKeyboard + } + + if specialKeyboardDistance == UIView.defaultKeyboardDistance { + return keyboardDistance + } else { + return specialKeyboardDistance + } + } + + static func getKeyboardSize(keyboardDistance: CGFloat, keyboardFrame: CGRect, + safeAreaInsets: UIEdgeInsets, windowFrame: CGRect) -> CGSize { + let kbSize: CGSize + var kbFrame: CGRect = keyboardFrame + + kbFrame.origin.y -= keyboardDistance + kbFrame.size.height += keyboardDistance + + kbFrame.origin.y -= safeAreaInsets.bottom + kbFrame.size.height += safeAreaInsets.bottom + + // (Bug ID: #469) (Bug ID: #381) (Bug ID: #1506) + // Calculating actual keyboard covered size respect to window, + // keyboard frame may be different when hardware keyboard is attached + let intersectRect: CGRect = kbFrame.intersection(windowFrame) + + if intersectRect.isNull { + kbSize = CGSize(width: kbFrame.size.width, height: 0) + } else { + kbSize = intersectRect.size + } + return kbSize + } + + static private func getLayoutGuides(rootController: UIViewController, window: UIWindow, + isScrollableTextInputView: Bool) -> IQLayoutGuide { + let navigationBarAreaHeight: CGFloat + if let navigationController: UINavigationController = rootController.navigationController { + navigationBarAreaHeight = navigationController.navigationBar.frame.maxY + } else { + let statusBarHeight: CGFloat = window.windowScene?.statusBarManager?.statusBarFrame.height ?? 0 + navigationBarAreaHeight = statusBarHeight + } + + let directionalLayoutMargin: NSDirectionalEdgeInsets = rootController.view.directionalLayoutMargins + let topLayoutGuide: CGFloat = CGFloat.maximum(navigationBarAreaHeight, directionalLayoutMargin.top) + + // Validation of textInputView for case where there is a tab bar + // at the bottom or running on iPhone X and textInputView is at the bottom. + let bottomLayoutGuide: CGFloat = isScrollableTextInputView ? 0 : directionalLayoutMargin.bottom + return (topLayoutGuide, bottomLayoutGuide) + } + + static private func getMoveUpDistance(keyboardSize: CGSize, + layoutGuide: IQLayoutGuide, + textInputViewRectInRootSuperview: CGRect, + textInputViewRectInWindow: CGRect, + windowFrame: CGRect) -> CGFloat { + + // Move positive = textInputView is hidden. + // Move negative = textInputView is showing. + // Calculating move position. + let visibleHeight: CGFloat = windowFrame.height-keyboardSize.height + + let topMovement: CGFloat = textInputViewRectInRootSuperview.minY-layoutGuide.top + let bottomMovement: CGFloat = textInputViewRectInWindow.maxY - visibleHeight + layoutGuide.bottom + var moveUp: CGFloat = CGFloat.minimum(topMovement, bottomMovement) + moveUp = CGFloat(Int(moveUp)) + return moveUp + } + + func setupActiveScrollViewConfiguration(superScrollView: UIScrollView?, textInputView: some IQTextInputView) { + // If there was a lastScrollView. // (Bug ID: #34) + guard let lastConfiguration: IQScrollViewConfiguration = lastScrollViewConfiguration else { + if let superScrollView: UIScrollView = superScrollView { + // If there was no lastScrollView and we found a current scrollView. then setting it as lastScrollView. + let configuration = IQScrollViewConfiguration(scrollView: superScrollView, + canRestoreContentOffset: true) + self.lastScrollViewConfiguration = configuration + showLog(""" + Saving ScrollView New contentInset: \(configuration.startingContentInset) + and contentOffset: \(configuration.startingContentOffset) + """) + } + return + } + + // If we can't find current superScrollView, then setting lastScrollView to it's original form. + if superScrollView == nil { + restoreScrollViewConfigurationIfChanged(configuration: lastConfiguration, + textInputView: textInputView) + self.lastScrollViewConfiguration = nil + } else if superScrollView != lastConfiguration.scrollView { + // If both scrollView's are different, + // then reset lastScrollView to it's original frame and setting current scrollView as last scrollView. + restoreScrollViewConfigurationIfChanged(configuration: lastConfiguration, + textInputView: textInputView) + + if let superScrollView = superScrollView { + let configuration = IQScrollViewConfiguration(scrollView: superScrollView, + canRestoreContentOffset: true) + self.lastScrollViewConfiguration = configuration + showLog(""" + Saving ScrollView New contentInset: \(configuration.startingContentInset) + and contentOffset: \(configuration.startingContentOffset) + """) + } else { + self.lastScrollViewConfiguration = nil + } + } + // Else the case where superScrollView == lastScrollView means we are on same scrollView + // after switching to different textInputView. So doing nothing, going ahead + } + + func restoreScrollViewConfigurationIfChanged(configuration: IQScrollViewConfiguration, + textInputView: (some IQTextInputView)?) { + guard configuration.hasChanged else { return } + if configuration.scrollView.contentInset != configuration.startingContentInset { + showLog("Restoring contentInset to: \(configuration.startingContentInset)") + } + + if configuration.scrollView.iq.restoreContentOffset, + !configuration.scrollView.contentOffset.equalTo(configuration.startingContentOffset) { + showLog("Restoring contentOffset to: \(configuration.startingContentOffset)") + } + + activeConfiguration.animate(alongsideTransition: { + configuration.restore(for: textInputView) + }) + } + + // swiftlint:disable function_body_length + private func adjustScrollViewContentOffsets(moveUp: inout CGFloat, textInputView: some IQTextInputView, + lastScrollViewConfiguration: IQScrollViewConfiguration, + rootSuperview: UIView?, + layoutGuide: IQLayoutGuide, + textInputViewRectInRootSuperview: CGRect, + isScrollableTextInputView: Bool, window: UIWindow, + kbSize: CGSize, keyboardDistance: CGFloat, + rootBeginSafeAreaInsets: UIEdgeInsets) { + // Saving + var lastView: UIView = textInputView + var superScrollView: UIScrollView? = lastScrollViewConfiguration.scrollView + + while let scrollView: UIScrollView = superScrollView { + + var isContinue: Bool = false + + if moveUp > 0 { + isContinue = moveUp > (-scrollView.contentOffset.y - scrollView.contentInset.top) + + } else if let tableView: UITableView = scrollView.iq.superviewOf(type: UITableView.self) { + // Special treatment for UITableView due to their cell reusing logic + + isContinue = scrollView.contentOffset.y > 0 + + Self.handleTableViewCase(moveUp: &moveUp, isContinue: isContinue, textInputView: textInputView, + tableView: tableView, rootSuperview: rootSuperview, layoutGuide: layoutGuide) + } else if let collectionView = scrollView.iq.superviewOf(type: UICollectionView.self) { + // Special treatment for UICollectionView due to their cell reusing logic + + isContinue = scrollView.contentOffset.y > 0 + + Self.handleCollectionViewCase(moveUp: &moveUp, isContinue: isContinue, + textInputView: textInputView, collectionView: collectionView, + rootSuperview: rootSuperview, layoutGuide: layoutGuide) + } else { + isContinue = textInputViewRectInRootSuperview.minY < layoutGuide.top + + if isContinue { + moveUp = CGFloat.minimum(0, textInputViewRectInRootSuperview.minY - layoutGuide.top) + } + } + + // Looping in upper hierarchy until we don't found any scrollView + // in it's upper hierarchy till UIWindow object. + if isContinue { + + var tempScrollView: UIScrollView? = scrollView.iq.superviewOf(type: UIScrollView.self) + var nextScrollView: UIScrollView? + while let view: UIScrollView = tempScrollView { + + if view.isScrollEnabled, !view.iq.ignoreScrollingAdjustment { + nextScrollView = view + break + } else { + tempScrollView = view.iq.superviewOf(type: UIScrollView.self) + } + } + + // Getting lastViewRect. + if let lastViewRect: CGRect = lastView.superview?.convert(lastView.frame, to: scrollView) { + + // Calculating the expected Y offset from move and scrollView's contentOffset. + let minimumMovement: CGFloat = CGFloat.minimum(scrollView.contentOffset.y, -moveUp) + var suggestedOffsetY: CGFloat = scrollView.contentOffset.y - minimumMovement + + // Rearranging the expected Y offset according to the view. + suggestedOffsetY = CGFloat.minimum(suggestedOffsetY, lastViewRect.minY) + + updateSuggestedOffsetYAndMoveUp(suggestedOffsetY: &suggestedOffsetY, moveUp: &moveUp, + isScrollableTextInputView: isScrollableTextInputView, + nextScrollView: nextScrollView, textInputView: textInputView, + window: window, layoutGuide: layoutGuide, + scrollViewContentOffset: scrollView.contentOffset) + + let newContentOffset: CGPoint = CGPoint(x: scrollView.contentOffset.x, y: suggestedOffsetY) + + if !scrollView.contentOffset.equalTo(newContentOffset) { + + updateScrollViewContentOffset(scrollView: scrollView, newContentOffset: newContentOffset, + moveUp: moveUp, textInputView: textInputView) + } + } + + // Getting next lastView & superScrollView. + lastView = scrollView + superScrollView = nextScrollView + } else { + moveUp = 0 + break + } + } + + adjustScrollViewContentInset(lastScrollViewConfiguration: lastScrollViewConfiguration, window: window, + kbSize: kbSize, keyboardDistance: keyboardDistance, + rootBeginSafeAreaInsets: rootBeginSafeAreaInsets) + } + // swiftlint:enable function_body_length + + private static func handleTableViewCase(moveUp: inout CGFloat, isContinue: Bool, + textInputView: some IQTextInputView, tableView: UITableView, + rootSuperview: UIView?, layoutGuide: IQLayoutGuide) { + guard isContinue, + let tableCell: UITableViewCell = textInputView.iq.superviewOf(type: UITableViewCell.self), + let indexPath: IndexPath = tableView.indexPath(for: tableCell), + let previousIndexPath: IndexPath = tableView.previousIndexPath(of: indexPath) else { return } + + let previousCellRect: CGRect = tableView.rectForRow(at: previousIndexPath) + guard !previousCellRect.isEmpty else { return } + + let previousCellRectInRootSuperview: CGRect = tableView.convert(previousCellRect, + to: rootSuperview) + + moveUp = CGFloat.minimum(0, previousCellRectInRootSuperview.maxY - layoutGuide.top) + } + + private static func handleCollectionViewCase(moveUp: inout CGFloat, isContinue: Bool, + textInputView: some IQTextInputView, collectionView: UICollectionView, + rootSuperview: UIView?, + layoutGuide: IQLayoutGuide) { + guard isContinue, + let collectionCell = textInputView.iq.superviewOf(type: UICollectionViewCell.self), + let indexPath: IndexPath = collectionView.indexPath(for: collectionCell), + let previousIndexPath: IndexPath = collectionView.previousIndexPath(of: indexPath), + let attributes = collectionView.layoutAttributesForItem(at: previousIndexPath) else { return } + + let previousCellRect: CGRect = attributes.frame + guard !previousCellRect.isEmpty else { return } + let previousCellRectInRootSuperview: CGRect = collectionView.convert(previousCellRect, + to: rootSuperview) + + moveUp = CGFloat.minimum(0, previousCellRectInRootSuperview.maxY - layoutGuide.top) + } + + private func updateSuggestedOffsetYAndMoveUp(suggestedOffsetY: inout CGFloat, moveUp: inout CGFloat, + isScrollableTextInputView: Bool, nextScrollView: UIScrollView?, + textInputView: some IQTextInputView, window: UIWindow, + layoutGuide: IQLayoutGuide, + scrollViewContentOffset: CGPoint) { + // If is a UITextView type + // nextScrollView == nil + // If processing scrollView is last scrollView in upper hierarchy + // (there is no other scrollView in upper hierarchy.) + // + // suggestedOffsetY >= 0 + // suggestedOffsetY must be >= 0 in order to keep distance from navigationBar (Bug ID: #92) + guard isScrollableTextInputView, + nextScrollView == nil, + suggestedOffsetY >= 0, + let superview: UIView = textInputView.superview else { + // Subtracting the Y offset from the move variable, + // because we are going to change scrollView's contentOffset.y to suggestedOffsetY. + moveUp -= (suggestedOffsetY-scrollViewContentOffset.y) + return + } + + let currentTextInputViewRect: CGRect = superview.convert(textInputView.frame, + to: window) + + // Calculating expected fix distance which needs to be managed from navigation bar + let expectedFixDistance: CGFloat = currentTextInputViewRect.minY - layoutGuide.top + + // Now if expectedOffsetY (scrollView.contentOffset.y + expectedFixDistance) + // is lower than current suggestedOffsetY, which means we're in a position where + // navigationBar up and hide, then reducing suggestedOffsetY with expectedOffsetY + // (scrollView.contentOffset.y + expectedFixDistance) + let expectedOffsetY: CGFloat = scrollViewContentOffset.y + expectedFixDistance + suggestedOffsetY = CGFloat.minimum(suggestedOffsetY, expectedOffsetY) + + // Setting move to 0 because now we don't want to move any view anymore + // (All will be managed by our contentInset logic. + moveUp = 0 + } + + func updateScrollViewContentOffset(scrollView: UIScrollView, newContentOffset: CGPoint, + moveUp: CGFloat, textInputView: some IQTextInputView) { + showLog(""" + old contentOffset: \(scrollView.contentOffset) + new contentOffset: \(newContentOffset) + """) + showLog("Remaining Move: \(moveUp)") + + // Getting problem while using `setContentOffset:animated:`, So I used animation API. + activeConfiguration.animate(alongsideTransition: { + + // (Bug ID: #1365, #1508, #1541) + let stackView: UIStackView? = textInputView.iq.superviewOf(type: UIStackView.self, + belowView: scrollView) + // (Bug ID: #1901, #1996) + let animatedContentOffset: Bool = stackView != nil || + scrollView is UICollectionView || + scrollView is UITableView + + if animatedContentOffset { + scrollView.setContentOffset(newContentOffset, animated: UIView.areAnimationsEnabled) + } else { + scrollView.contentOffset = newContentOffset + } + }, completion: { + + if scrollView is UITableView || scrollView is UICollectionView { + // Skip reloading input views during interactive navigation gesture to prevent toolbar flash (Issue #2102) + if self.activeConfiguration.rootConfiguration?.isInteractiveGestureActive == false { + // This will update the next/previous states + textInputView.reloadInputViews() + } + } + }) + } + + func adjustScrollViewContentInset(lastScrollViewConfiguration: IQScrollViewConfiguration, + window: UIWindow, kbSize: CGSize, keyboardDistance: CGFloat, + rootBeginSafeAreaInsets: UIEdgeInsets) { + + let lastScrollView = lastScrollViewConfiguration.scrollView + + guard let lastScrollViewRect: CGRect = lastScrollView.superview?.convert(lastScrollView.frame, to: window), + !lastScrollView.iq.ignoreContentInsetAdjustment else { return } + + // Updating contentInset + var bottomInset: CGFloat = (kbSize.height)-(window.frame.height-lastScrollViewRect.maxY) + let keyboardAndSafeArea: CGFloat = keyboardDistance + rootBeginSafeAreaInsets.bottom + var bottomScrollIndicatorInset: CGFloat = bottomInset - keyboardAndSafeArea + + // Update the insets so that the scrollView doesn't shift incorrectly + // when the offset is near the bottom of the scroll view. + bottomInset = CGFloat.maximum(lastScrollViewConfiguration.startingContentInset.bottom, bottomInset) + let startingScrollInset: UIEdgeInsets = lastScrollViewConfiguration.startingScrollIndicatorInsets + bottomScrollIndicatorInset = CGFloat.maximum(startingScrollInset.bottom, + bottomScrollIndicatorInset) + + bottomInset -= lastScrollView.safeAreaInsets.bottom + bottomScrollIndicatorInset -= lastScrollView.safeAreaInsets.bottom + + var movedInsets: UIEdgeInsets = lastScrollView.contentInset + movedInsets.bottom = bottomInset + + guard lastScrollView.contentInset != movedInsets else { return } + showLog(""" + old ContentInset: \(lastScrollView.contentInset) new ContentInset: \(movedInsets) + """) + + activeConfiguration.animate(alongsideTransition: { + lastScrollView.contentInset = movedInsets + lastScrollView.layoutIfNeeded() // (Bug ID: #1996) + + var newScrollIndicatorInset: UIEdgeInsets = lastScrollView.verticalScrollIndicatorInsets + + newScrollIndicatorInset.bottom = bottomScrollIndicatorInset + lastScrollView.scrollIndicatorInsets = newScrollIndicatorInset + }) + } + + private func adjustTextInputViewContentInset(window: UIWindow, originalKbSize: CGSize, + rootSuperview: UIView?, + layoutGuide: IQLayoutGuide, + textInputView: UIScrollView) { + let keyboardYPosition: CGFloat = window.frame.height - originalKbSize.height + var rootSuperViewFrameInWindow: CGRect = window.frame + if let rootSuperview: UIView = rootSuperview { + rootSuperViewFrameInWindow = rootSuperview.convert(rootSuperview.bounds, to: window) + } + + let keyboardOverlapping: CGFloat = rootSuperViewFrameInWindow.maxY - keyboardYPosition + + let availableHeight: CGFloat = rootSuperViewFrameInWindow.height-layoutGuide.top-keyboardOverlapping + let textInputViewHeight: CGFloat = CGFloat.minimum(textInputView.frame.height, availableHeight) + + guard textInputView.frame.size.height-textInputView.contentInset.bottom>textInputViewHeight else { return } + // If frame is not change by library in past, then saving user textInputView properties (Bug ID: #92) + if startingTextViewConfiguration == nil { + startingTextViewConfiguration = IQScrollViewConfiguration(scrollView: textInputView, + canRestoreContentOffset: false) + } + + var newContentInset: UIEdgeInsets = textInputView.contentInset + newContentInset.bottom = textInputView.frame.size.height-textInputViewHeight + newContentInset.bottom -= textInputView.safeAreaInsets.bottom + + guard textInputView.contentInset != newContentInset else { return } + showLog(""" + \(textInputView) Old textInputView.contentInset: \(textInputView.contentInset) + New textInputView.contentInset: \(newContentInset) + """) + + activeConfiguration.animate(alongsideTransition: { + + textInputView.contentInset = newContentInset + textInputView.layoutIfNeeded() // (Bug ID: #1996) + textInputView.scrollIndicatorInsets = newContentInset + }) + } + + func adjustRootController(moveUp: CGFloat, rootViewOrigin: CGPoint, originalKbSize: CGSize, + rootController: UIViewController, rootBeginOrigin: CGPoint) { + // +Positive or zero. + var rootViewOrigin: CGPoint = rootViewOrigin + if moveUp >= 0 { + + rootViewOrigin.y = CGFloat.maximum(rootViewOrigin.y - moveUp, CGFloat.minimum(0, -originalKbSize.height)) + + if !rootController.view.frame.origin.equalTo(rootViewOrigin) { + showLog("Moving Upward") + + activeConfiguration.animate(alongsideTransition: { + + var rect: CGRect = rootController.view.frame + rect.origin = rootViewOrigin + rootController.view.frame = rect + + // Animating content if needed (Bug ID: #204) + if self.layoutIfNeededOnUpdate { + // Animating content (Bug ID: #160) + rootController.view.setNeedsLayout() + rootController.view.layoutIfNeeded() + } + + let classNameString: String = "\(type(of: rootController.self))" + self.showLog("Set \(classNameString) origin to: \(rootViewOrigin)") + }) + } + + movedDistance = rootBeginOrigin.y-rootViewOrigin.y + } else { // -Negative + let disturbDistance: CGFloat = rootViewOrigin.y-rootBeginOrigin.y + + // disturbDistance Negative = frame disturbed. + // disturbDistance positive = frame not disturbed. + if disturbDistance <= 0 { + + rootViewOrigin.y -= CGFloat.maximum(moveUp, disturbDistance) + + if !rootController.view.frame.origin.equalTo(rootViewOrigin) { + showLog("Moving Downward") + // Setting adjusted rootViewRect + + activeConfiguration.animate(alongsideTransition: { + + var rect: CGRect = rootController.view.frame + rect.origin = rootViewOrigin + rootController.view.frame = rect + + // Animating content if needed (Bug ID: #204) + if self.layoutIfNeededOnUpdate { + // Animating content (Bug ID: #160) + rootController.view.setNeedsLayout() + rootController.view.layoutIfNeeded() + } + + let classNameString: String = "\(type(of: rootController.self))" + self.showLog("Set \(classNameString) origin to: \(rootViewOrigin)") + }) + } + + movedDistance = rootBeginOrigin.y-rootViewOrigin.y + } + } + } + + func restoreScrollViewContentOffset(superScrollView: UIScrollView, textInputView: (some IQTextInputView)?) { + var superScrollView: UIScrollView? = superScrollView + while let scrollView: UIScrollView = superScrollView { + + let width: CGFloat = CGFloat.maximum(scrollView.contentSize.width, scrollView.frame.width) + let height: CGFloat = CGFloat.maximum(scrollView.contentSize.height, scrollView.frame.height) + let contentSize: CGSize = CGSize(width: width, height: height) + + let minimumY: CGFloat = contentSize.height - scrollView.frame.height + + if minimumY < scrollView.contentOffset.y { + + let newContentOffset: CGPoint = CGPoint(x: scrollView.contentOffset.x, y: minimumY) + if !scrollView.contentOffset.equalTo(newContentOffset) { + + // (Bug ID: #1365, #1508, #1541) + let stackView: UIStackView? + if let textInputView: UIView = textInputView { + stackView = textInputView.iq.superviewOf(type: UIStackView.self, + belowView: scrollView) + } else { + stackView = nil + } + + // (Bug ID: #1901, #1996) + let animatedContentOffset: Bool = stackView != nil || + scrollView is UICollectionView || + scrollView is UITableView + + if animatedContentOffset { + scrollView.setContentOffset(newContentOffset, animated: UIView.areAnimationsEnabled) + } else { + scrollView.contentOffset = newContentOffset + } + + showLog("Restoring contentOffset to: \(newContentOffset)") + } + } + + superScrollView = scrollView.iq.superviewOf(type: UIScrollView.self) + } + } +} +// swiftlint:enable function_parameter_count diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager.swift new file mode 100644 index 0000000..3a76df7 --- /dev/null +++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager.swift @@ -0,0 +1,238 @@ +// +// IQKeyboardManager.swift +// 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: +// +// 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. + +import UIKit + +/** + IQKeyboardManager is a code-less drop-in universal library that automatically prevents issues + of the keyboard sliding up and covering UITextField/UITextView. + + ## Usage + Simply enable the manager in your AppDelegate: + ```swift + IQKeyboardManager.shared.isEnabled = true + ``` + + ## Thread Safety + All public APIs must be called from the main thread. The class is marked with @MainActor + to enforce this at compile time. + + ## Example + ```swift + import IQKeyboardManagerSwift + + @main + class AppDelegate: UIResponder, UIApplicationDelegate { + func application(_ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + IQKeyboardManager.shared.isEnabled = true + return true + } + } + ``` + */ +@available(iOSApplicationExtension, unavailable) +@MainActor +@objcMembers public final class IQKeyboardManager: NSObject { + + /** + Returns the default singleton instance. + */ + @MainActor + public static let shared: IQKeyboardManager = .init() + + internal var activeConfiguration: IQActiveConfiguration = .init() + + // MARK: UIKeyboard handling + + /** + Enable/disable managing distance between keyboard and textInputView. + Default is YES(Enabled when class loads in `+(void)load` method). + */ + public var isEnabled: Bool = false { + didSet { + guard isEnabled != oldValue else { return } + // If not enable, enable it. + if isEnabled { + // If keyboard is currently showing. + if activeConfiguration.keyboardInfo.isVisible { + adjustPosition() + } else { + restorePosition() + } + showLog("Enabled") + } else { // If not disable, disable it. + restorePosition() + showLog("Disabled") + } + } + } + + /** + Sets the default distance between the keyboard and the active text input view. + + This distance is applied to all text inputs unless overridden by setting + `view.iq.distanceFromKeyboard` for specific views. + + - Precondition: Value must be non-negative. Negative values will be logged as warnings. + - Default: `10.0` points + - Note: This is a global setting. Use `view.iq.distanceFromKeyboard` for per-view customization. + + ## Example + ```swift + // Set global distance + IQKeyboardManager.shared.keyboardDistance = 20.0 + + // Override for specific text field + myTextField.iq.distanceFromKeyboard = 30.0 + ``` + + - SeeAlso: `UIView.iq.distanceFromKeyboard` for per-view customization + */ + public var keyboardDistance: CGFloat = 10.0 { + didSet { + if keyboardDistance < 0 { + showLog("⚠️ keyboardDistance shouldn't be negative.") + } + } + } + + /*******************************************/ + + // MARK: UIAnimation handling + + /** + If YES, then calls 'setNeedsLayout' and 'layoutIfNeeded' on any frame update of to viewController's view. + */ + public var layoutIfNeededOnUpdate: Bool = false + + // MARK: Class Level disabling methods + + /** + Classes that should have keyboard distance handling disabled. + + When a view controller is of one of these types, keyboard distance handling + is disabled regardless of the `isEnabled` property. + + - Precondition: All classes must be subclasses of `UIViewController` + - Default: `[UITableViewController.self, UIInputViewController.self, UIAlertController.self]` + - Note: This takes precedence over `enabledDistanceHandlingClasses`. If a class appears + in both arrays, it will be disabled. + + ## Example + ```swift + // Disable for custom view controller + IQKeyboardManager.shared.disabledDistanceHandlingClasses.append(MyCustomViewController.self) + + // Disable for multiple controllers + IQKeyboardManager.shared.disabledDistanceHandlingClasses += [ + LoginViewController.self, + SignupViewController.self + ] + ``` + + - SeeAlso: `enabledDistanceHandlingClasses` for force-enabling specific classes + */ + public var disabledDistanceHandlingClasses: [UIViewController.Type] = [ + UITableViewController.self, + UIInputViewController.self, + UIAlertController.self + ] + + /** + Enable distance handling within the scope of enabled distance handling viewControllers classes. + Within this scope, 'enabled' property is ignored. Class should be kind of UIViewController. + If same Class is added in disabledDistanceHandlingClasses list, + then enabledDistanceHandlingClasses will be ignored. + */ + public var enabledDistanceHandlingClasses: [UIViewController.Type] = [] + + /**************************************************************************************/ + + // MARK: Initialization/De-initialization + + /* Singleton Object Initialization. */ + private override init() { + + super.init() + + self.addActiveConfigurationObserver() + + NotificationCenter.default.addObserver(self, selector: #selector(applicationDidBecomeActive(_:)), + name: UIApplication.didBecomeActiveNotification, object: nil) + } + + + deinit { + // Disable the keyboard manager. + isEnabled = false + NotificationCenter.default.removeObserver(self) + } + + // MARK: Public Methods + + /** + Manually triggers a position adjustment for the active text input view. + + Call this method when you've made external changes to the view hierarchy that + might affect keyboard positioning (e.g., programmatically changing view frames, + adding/removing views, changing constraints). + + This method is safe to call even when no text input is active or the keyboard + is hidden - it will simply return early. + + ## When to Call + - After programmatically modifying view frames + - After adding or removing views from the hierarchy + - After changing Auto Layout constraints that affect the active text field's position + - When orientation changes occur outside the normal notification flow + + ## Example + ```swift + // After programmatic layout changes + myView.frame = newFrame + IQKeyboardManager.shared.reloadLayoutIfNeeded() + + // After constraint updates + NSLayoutConstraint.activate(newConstraints) + view.layoutIfNeeded() + IQKeyboardManager.shared.reloadLayoutIfNeeded() + ``` + + - Note: This method only has an effect when: + - `isEnabled` is `true` + - A text input view is currently active + - The keyboard is visible + - The root configuration is ready + - SeeAlso: `isEnabled` for enabling/disabling the manager + */ + public func reloadLayoutIfNeeded() { + + guard privateIsEnabled(), + activeConfiguration.keyboardInfo.isVisible, + activeConfiguration.isReady else { + return + } + adjustPosition() + } +} diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIScrollView+IQKeyboardManagerExtension.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIScrollView+IQKeyboardManagerExtension.swift new file mode 100644 index 0000000..91c2534 --- /dev/null +++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIScrollView+IQKeyboardManagerExtension.swift @@ -0,0 +1,118 @@ +// +// UIScrollView+IQKeyboardManagerExtension.swift +// 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: +// +// 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. + +import UIKit +import IQKeyboardCore + +@available(iOSApplicationExtension, unavailable) +@MainActor +private struct AssociatedKeys { + static var ignoreScrollingAdjustment: Int = 0 + static var ignoreContentInsetAdjustment: Int = 0 + static var restoreContentOffset: Int = 0 +} + +@available(iOSApplicationExtension, unavailable) +@MainActor +public extension IQKeyboardExtension where Base: UIScrollView { + + /** + If YES, then scrollview will ignore scrolling (simply not scroll it) for adjusting textInputView position. + Default is NO. + */ + var ignoreScrollingAdjustment: Bool { + get { + if let base = base { + return objc_getAssociatedObject(base, &AssociatedKeys.ignoreScrollingAdjustment) as? Bool ?? false + } + return false + } + set(newValue) { + if let base = base { + objc_setAssociatedObject(base, &AssociatedKeys.ignoreScrollingAdjustment, + newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + } + } + } + + /** + If YES, then scrollview will ignore content inset adjustment (simply not updating it) when keyboard is shown. + Default is NO. + */ + var ignoreContentInsetAdjustment: Bool { + get { + if let base = base { + return objc_getAssociatedObject(base, &AssociatedKeys.ignoreContentInsetAdjustment) as? Bool ?? false + } + return false + } + set(newValue) { + if let base = base { + objc_setAssociatedObject(base, &AssociatedKeys.ignoreContentInsetAdjustment, + newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + } + } + } + + /** + If we should restore scrollView contentOffset to it's initial position + */ + var restoreContentOffset: Bool { + get { + if let base = base { + return objc_getAssociatedObject(base, &AssociatedKeys.restoreContentOffset) as? Bool ?? false + } + return false + } + set(newValue) { + if let base = base { + objc_setAssociatedObject(base, &AssociatedKeys.restoreContentOffset, + newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + } + } + } +} + +// swiftlint:disable unused_setter_value +@available(iOSApplicationExtension, unavailable) +@MainActor +@objc public extension UIScrollView { + @available(*, unavailable, renamed: "iq.ignoreScrollingAdjustment") + var shouldIgnoreScrollingAdjustment: Bool { + get { false } + set { } + } + + @available(*, unavailable, renamed: "iq.ignoreContentInsetAdjustment") + var shouldIgnoreContentInsetAdjustment: Bool { + get { false } + set { } + } + + @available(*, unavailable, renamed: "iq.restoreContentOffset") + var shouldRestoreScrollViewContentOffset: Bool { + get { false } + set { } + } +} +// swiftlint:enable unused_setter_value diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIScrollView+IQKeyboardManagerExtensionObjc.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIScrollView+IQKeyboardManagerExtensionObjc.swift new file mode 100644 index 0000000..7a7c4b4 --- /dev/null +++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIScrollView+IQKeyboardManagerExtensionObjc.swift @@ -0,0 +1,46 @@ +// +// UIScrollView+IQKeyboardManagerExtensionObjc.swift +// 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: +// +// 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. + +import UIKit + +// MARK: For ObjectiveC Compatibility + +// swiftlint:disable identifier_name +@objc public extension UIScrollView { + + var iq_ignoreScrollingAdjustment: Bool { + get { iq.ignoreScrollingAdjustment } + set { iq.ignoreScrollingAdjustment = newValue } + } + + var iq_ignoreContentInsetAdjustment: Bool { + get { iq.ignoreContentInsetAdjustment } + set { iq.ignoreContentInsetAdjustment = newValue } + } + + var iq_restoreContentOffset: Bool { + get { iq.restoreContentOffset } + set { iq.restoreContentOffset = newValue } + } +} +// swiftlint:enable identifier_name diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIView+IQKeyboardManagerExtension.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIView+IQKeyboardManagerExtension.swift new file mode 100644 index 0000000..1c79e4d --- /dev/null +++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIView+IQKeyboardManagerExtension.swift @@ -0,0 +1,158 @@ +// +// UIView+IQKeyboardManagerExtension.swift +// 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: +// +// 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. + +import UIKit +import IQKeyboardCore + +@available(iOSApplicationExtension, unavailable) +@MainActor +private struct AssociatedKeys { + static var distanceFromKeyboard: Int = 0 + static var enableMode: Int = 0 +} + +@available(iOSApplicationExtension, unavailable) +@MainActor +@objc public extension UIView { + nonisolated static let defaultKeyboardDistance: CGFloat = .greatestFiniteMagnitude +} + +@available(iOSApplicationExtension, unavailable) +@available(*, unavailable, renamed: "UIView.defaultKeyboardDistance") +nonisolated public let kIQUseDefaultKeyboardDistance: CGFloat = .greatestFiniteMagnitude + +/** + Extension providing keyboard management functionality to UIView instances. + + This extension allows per-view configuration of keyboard behavior, including + custom distance and enable/disable modes. + + ## Usage + ```swift + // Set custom distance for a text field + textField.iq.distanceFromKeyboard = 30.0 + + // Disable keyboard management for a specific text field + textField.iq.enableMode = .disabled + ``` + */ +@available(iOSApplicationExtension, unavailable) +@MainActor +public extension IQKeyboardExtension where Base: IQTextInputView { + + /** + Custom distance from keyboard for this specific text input view. + + If set to `UIView.defaultKeyboardDistance`, the global `keyboardDistance` + value from `IQKeyboardManager.shared.keyboardDistance` will be used. + Otherwise, this value takes precedence. + + - Default: `UIView.defaultKeyboardDistance` (uses global setting) + - Note: Value cannot be negative. Negative values may cause unexpected behavior. + + ## Example + ```swift + // Use global setting + textField.iq.distanceFromKeyboard = UIView.defaultKeyboardDistance + + // Use custom distance + textField.iq.distanceFromKeyboard = 50.0 + ``` + */ + var distanceFromKeyboard: CGFloat { + get { + if let base = base { + if let value = objc_getAssociatedObject(base, &AssociatedKeys.distanceFromKeyboard) as? CGFloat { + return value + } + } + return UIView.defaultKeyboardDistance + } + set(newValue) { + if let base = base { + objc_setAssociatedObject(base, &AssociatedKeys.distanceFromKeyboard, + newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + } + + if newValue < 0 { + IQKeyboardManager.shared.showLog("Warning: distanceFromKeyboard shouldn't be negative.") + } + } + } + + /** + Enable mode for this specific text input view. + + Controls whether keyboard management is enabled, disabled, or uses the default + global setting for this view. + + - `.default`: Use global `IQKeyboardManager.shared.isEnabled` setting + - `.enabled`: Force enable keyboard management for this view + - `.disabled`: Force disable keyboard management for this view + + ## Example + ```swift + // Use global setting + textField.iq.enableMode = .default + + // Always enable for this field + textField.iq.enableMode = .enabled + + // Always disable for this field + textField.iq.enableMode = .disabled + ``` + + - SeeAlso: `IQKeyboardManager.isEnabled` for global control + */ + var enableMode: IQEnableMode { + get { + if let base = base { + return objc_getAssociatedObject(base, &AssociatedKeys.enableMode) as? IQEnableMode ?? .default + } + return .default + } + set(newValue) { + if let base = base { + objc_setAssociatedObject(base, &AssociatedKeys.enableMode, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + } + } + } +} + +// swiftlint:disable unused_setter_value +@available(iOSApplicationExtension, unavailable) +@MainActor +@objc public extension UIView { + @available(*, unavailable, renamed: "iq.distanceFromKeyboard") + var keyboardDistanceFromTextField: CGFloat { + get { 0 } + set { } + } + + @available(*, unavailable, renamed: "iq.enableMode") + var enableMode: IQEnableMode { + get { .default } + set { } + } +} +// swiftlint:enable unused_setter_value diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIView+IQKeyboardManagerExtensionObjc.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIView+IQKeyboardManagerExtensionObjc.swift new file mode 100644 index 0000000..84b52c8 --- /dev/null +++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIView+IQKeyboardManagerExtensionObjc.swift @@ -0,0 +1,55 @@ +// +// UIView+IQKeyboardManagerExtensionObjc.swift +// 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: +// +// 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. + +import UIKit +import IQKeyboardCore + +// MARK: For ObjectiveC Compatibility + +// swiftlint:disable identifier_name +@objc public extension UITextField { + + var iq_distanceFromKeyboard: CGFloat { + get { iq.distanceFromKeyboard } + set { iq.distanceFromKeyboard = newValue } + } + + var iq_enableMode: IQEnableMode { + get { iq.enableMode } + set { iq.enableMode = newValue } + } +} + +@objc public extension UITextView { + + var iq_distanceFromKeyboard: CGFloat { + get { iq.distanceFromKeyboard } + set { iq.distanceFromKeyboard = newValue } + } + + var iq_enableMode: IQEnableMode { + get { iq.enableMode } + set { iq.enableMode = newValue } + } +} +// swiftlint:enable identifier_name diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UICollectionView+IndexPaths.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UICollectionView+IndexPaths.swift new file mode 100644 index 0000000..99238ad --- /dev/null +++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UICollectionView+IndexPaths.swift @@ -0,0 +1,45 @@ +// +// UICollectionView+IndexPaths.swift +// 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: +// +// 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. + +import UIKit + +@available(iOSApplicationExtension, unavailable) +@MainActor +internal extension UICollectionView { + + func previousIndexPath(of indexPath: IndexPath) -> IndexPath? { + var previousRow: Int = indexPath.row - 1 + var previousSection: Int = indexPath.section + + // Fixing indexPath + if previousRow < 0 { + previousSection -= 1 + if previousSection >= 0 { + previousRow = self.numberOfItems(inSection: previousSection) - 1 + } + } + + guard previousRow >= 0, previousSection >= 0 else { return nil } + return IndexPath(item: previousRow, section: previousSection) + } +} diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UITableView+IndexPaths.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UITableView+IndexPaths.swift new file mode 100644 index 0000000..f3493cd --- /dev/null +++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UITableView+IndexPaths.swift @@ -0,0 +1,46 @@ +// +// UITableView+IndexPaths.swift +// 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: +// +// 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. + +import UIKit + +@available(iOSApplicationExtension, unavailable) +@MainActor +internal extension UITableView { + + func previousIndexPath(of indexPath: IndexPath) -> IndexPath? { + var previousRow: Int = indexPath.row - 1 + var previousSection: Int = indexPath.section + + // Fixing indexPath + if previousRow < 0 { + previousSection -= 1 + if previousSection >= 0 { + let rowCount = self.numberOfRows(inSection: previousSection) + previousRow = rowCount > 0 ? rowCount - 1 : -1 + } + } + + guard previousRow >= 0, previousSection >= 0 else { return nil } + return IndexPath(row: previousRow, section: previousSection) + } +} diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UIView+Parent.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UIView+Parent.swift new file mode 100644 index 0000000..cf2e63c --- /dev/null +++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UIView+Parent.swift @@ -0,0 +1,99 @@ +// +// UIView+Parent.swift +// 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: +// +// 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. + +import UIKit +import IQKeyboardCore + +/** +UIView hierarchy category. +*/ + +@available(iOSApplicationExtension, unavailable) +@MainActor +public extension IQKeyboardExtension where Base: UIView { + + /** + Returns the UIViewController object that is actually the parent of this object. + Most of the time it's the viewController object which actually contains it, + but result may be different if it's viewController is added as childViewController of another viewController. + */ + func parentContainerViewController() -> UIViewController? { + + var matchController: UIViewController? = viewContainingController() + var parentContainerViewController: UIViewController? + + if var navController: UINavigationController = matchController?.navigationController { + + while let parentNav: UINavigationController = navController.navigationController { + navController = parentNav + } + + var parentController: UIViewController = navController + + while let parent: UIViewController = parentController.parent, + !(parent is UINavigationController) && + !(parent is UITabBarController) && + !(parent is UISplitViewController) { + + parentController = parent + } + + if navController == parentController { + parentContainerViewController = navController.topViewController + } else { + parentContainerViewController = parentController + } + } else if let tabController: UITabBarController = matchController?.tabBarController { + let selectedController = tabController.selectedViewController + if let navController: UINavigationController = selectedController as? UINavigationController { + parentContainerViewController = navController.topViewController + } else { + parentContainerViewController = tabController.selectedViewController + } + } else { + while let parent: UIViewController = matchController?.parent, + !(parent is UINavigationController) && + !(parent is UITabBarController) && + !(parent is UISplitViewController) { + + matchController = parent + } + + parentContainerViewController = matchController + } + + if let controller: UIViewController = parentContainerViewController?.iq_parentContainerViewController() { + return controller + } else { + return parentContainerViewController + } + } +} + +@available(iOSApplicationExtension, unavailable) +@MainActor +@objc public extension UIView { + + @available(*, unavailable, renamed: "iq.parentContainerViewController()") + func parentContainerViewController() -> UIViewController? { nil } +} diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UIView+ParentObjc.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UIView+ParentObjc.swift new file mode 100644 index 0000000..9c0730e --- /dev/null +++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UIView+ParentObjc.swift @@ -0,0 +1,31 @@ +// +// UIView+ParentObjc.swift +// 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: +// +// 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. + +import UIKit + +@objc public extension UIView { + + func iq_parentContainerViewController() -> UIViewController? { + iq.parentContainerViewController() + } +} diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UIViewController+ParentContainer.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UIViewController+ParentContainer.swift new file mode 100644 index 0000000..7fc96a9 --- /dev/null +++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UIViewController+ParentContainer.swift @@ -0,0 +1,49 @@ +// +// UIViewController+ParentContainer.swift +// 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: +// +// 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. + +import UIKit + +@available(iOSApplicationExtension, unavailable) +@MainActor +@objc extension UIViewController { + + /** + This method is provided to override by viewController's + if the library lifts a viewController which you doesn't want to lift. + This may happen if you have implemented side menu feature + in your app and the library try to lift the side menu controller. + Overriding this method in side menu class to return correct controller should fix the problem. + */ + open func iq_parentContainerViewController() -> UIViewController? { + return self + } +} + +@available(iOSApplicationExtension, unavailable) +@MainActor +@objc extension UIViewController { + @available(*, unavailable, renamed: "iq_parentContainerViewController()") + open func parentIQContainerViewController() -> UIViewController? { + return self + } +} diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardToolbarManager/IQKeyboardManager+ToolbarManager.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardToolbarManager/IQKeyboardManager+ToolbarManager.swift new file mode 100644 index 0000000..4cf109c --- /dev/null +++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardToolbarManager/IQKeyboardManager+ToolbarManager.swift @@ -0,0 +1,137 @@ +// +// IQKeyboardManager+ToolbarManager.swift +// 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: +// +// 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. + +import UIKit +import IQKeyboardToolbarManager + +@available(iOSApplicationExtension, unavailable) +// swiftlint:disable line_length +@available(*, deprecated, + message: "Please use `IQKeyboardToolbarManager` independently from https://github.com/hackiftekhar/IQKeyboardToolbarManager") +// swiftlint:enable line_length +@MainActor +@objc public extension IQKeyboardManager { + + @MainActor + private struct AssociatedKeys { + static var toolbarManager: Int = 0 + } + + internal var toolbarManager: IQKeyboardToolbarManager { + IQKeyboardToolbarManager.shared + } + + var enableToolbarDebugging: Bool { + get { toolbarManager.isDebuggingEnabled } + set { toolbarManager.isDebuggingEnabled = newValue } + } + + /** + Automatic add the toolbar functionality. Default is YES. + */ + var enableAutoToolbar: Bool { + get { toolbarManager.isEnabled } + set { toolbarManager.isEnabled = newValue } + } + + /** + Configurations related to the toolbar display over the keyboard. + */ + var toolbarConfiguration: IQKeyboardToolbarConfiguration { + toolbarManager.toolbarConfiguration + } + + // MARK: UISound handling + + /** + If YES, then it plays inputClick sound on next/previous/done click. + */ + var playInputClicks: Bool { + get { toolbarManager.playInputClicks } + set { toolbarManager.playInputClicks = newValue } + } + + /** + 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. + */ + var disabledToolbarClasses: [UIViewController.Type] { + get { toolbarManager.disabledToolbarClasses } + set { toolbarManager.disabledToolbarClasses = newValue } + } + + /** + 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. + */ + var enabledToolbarClasses: [UIViewController.Type] { + get { toolbarManager.enabledToolbarClasses } + set { toolbarManager.enabledToolbarClasses = newValue } + } + + /** + 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. + */ + var deepResponderAllowedContainerClasses: [UIView.Type] { + get { toolbarManager.deepResponderAllowedContainerClasses } + set { toolbarManager.deepResponderAllowedContainerClasses = newValue } + } + + /** reloadInputViews to reload toolbar buttons enable/disable state on the fly Enhancement ID #434. */ + func reloadInputViews() { + toolbarManager.reloadInputViews() + } + + /** + Returns YES if can navigate to previous responder textInputView, otherwise NO. + */ + var canGoPrevious: Bool { + toolbarManager.canGoPrevious + } + + /** + Returns YES if can navigate to next responder textInputViews, otherwise NO. + */ + var canGoNext: Bool { + toolbarManager.canGoNext + } + + /** + Navigate to previous responder textInputViews + */ + @discardableResult + func goPrevious() -> Bool { + toolbarManager.goPrevious() + } + + /** + Navigate to next responder textInputView. + */ + @discardableResult + func goNext() -> Bool { + toolbarManager.goNext() + } +} diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardToolbarManager/IQKeyboardManager+ToolbarManagerDeprecated.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardToolbarManager/IQKeyboardManager+ToolbarManagerDeprecated.swift new file mode 100644 index 0000000..e6b7321 --- /dev/null +++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardToolbarManager/IQKeyboardManager+ToolbarManagerDeprecated.swift @@ -0,0 +1,177 @@ +// +// IQKeyboardManager+ToolbarManagerDeprecated.swift +// 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: +// +// 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. + +import UIKit +import IQKeyboardToolbarManager + +// swiftlint:disable unused_setter_value +// swiftlint:disable identifier_name +@available(iOSApplicationExtension, unavailable) +@MainActor +@objc public extension IQKeyboardManager { + + @available(*, unavailable, renamed: "playInputClicks") + var shouldPlayInputClicks: Bool { + get { false } + set { } + } +} + +@available(iOSApplicationExtension, unavailable) +@MainActor +@objc public extension IQKeyboardManager { + + @available(*, unavailable, renamed: "toolbarConfiguration.manageBehavior") + var toolbarManageBehaviour: IQKeyboardToolbarManageBehavior { + get { .bySubviews } + set { } + } + + @available(*, unavailable, renamed: "toolbarConfiguration.useTextInputViewTintColor") + var shouldToolbarUsesTextFieldTintColor: Bool { + get { false } + set { } + } + + @available(*, unavailable, renamed: "toolbarConfiguration.tintColor") + var toolbarTintColor: UIColor? { + get { nil } + set { } + } + + @available(*, unavailable, renamed: "toolbarConfiguration.barTintColor") + var toolbarBarTintColor: UIColor? { + get { nil } + set { } + } + + @available(*, unavailable, renamed: "toolbarConfiguration.previousNextDisplayMode") + var previousNextDisplayMode: IQPreviousNextDisplayMode { + get { .default } + set { } + } + + @available(*, unavailable, renamed: "deepResponderAllowedContainerClasses") + var toolbarPreviousNextAllowedClasses: [UIView.Type] { + get { [] } + set { } + } +} + +@available(iOSApplicationExtension, unavailable) +@MainActor +@objc public extension IQKeyboardManager { + @available(*, unavailable, renamed: "toolbarConfiguration.previousBarButtonConfiguration.image", + message: "To change, please assign a new toolbarConfiguration.previousBarButtonConfiguration") + var toolbarPreviousBarButtonItemImage: UIImage? { + get { nil } + set { } + } + @available(*, unavailable, renamed: "toolbarConfiguration.previousBarButtonConfiguration.title", + message: "To change, please assign a new toolbarConfiguration.previousBarButtonConfiguration") + var toolbarPreviousBarButtonItemText: String? { + get { nil } + set { } + } + @available(*, unavailable, renamed: "toolbarConfiguration.previousBarButtonConfiguration.accessibilityLabel", + message: "To change, please assign a new toolbarConfiguration.previousBarButtonConfiguration") + var toolbarPreviousBarButtonItemAccessibilityLabel: String? { + get { nil } + set { } + } + + @available(*, unavailable, renamed: "toolbarConfiguration.nextBarButtonConfiguration.image", + message: "To change, please assign a new toolbarConfiguration.nextBarButtonConfiguration") + var toolbarNextBarButtonItemImage: UIImage? { + get { nil } + set { } + } + @available(*, unavailable, renamed: "toolbarConfiguration.nextBarButtonConfiguration.title", + message: "To change, please assign a new toolbarConfiguration.nextBarButtonConfiguration") + var toolbarNextBarButtonItemText: String? { + get { nil } + set { } + } + @available(*, unavailable, renamed: "toolbarConfiguration.nextBarButtonConfiguration.accessibilityLabel", + message: "To change, please assign a new toolbarConfiguration.nextBarButtonConfiguration") + var toolbarNextBarButtonItemAccessibilityLabel: String? { + get { nil } + set { } + } + + @available(*, unavailable, renamed: "toolbarConfiguration.doneBarButtonConfiguration.image", + message: "To change, please assign a new toolbarConfiguration.doneBarButtonConfiguration") + var toolbarDoneBarButtonItemImage: UIImage? { + get { nil } + set { } + } + @available(*, unavailable, renamed: "toolbarConfiguration.doneBarButtonConfiguration.title", + message: "To change, please assign a new toolbarConfiguration.doneBarButtonConfiguration") + var toolbarDoneBarButtonItemText: String? { + get { nil } + set { } + } + @available(*, unavailable, renamed: "toolbarConfiguration.doneBarButtonConfiguration.accessibilityLabel", + message: "To change, please assign a new toolbarConfiguration.doneBarButtonConfiguration") + var toolbarDoneBarButtonItemAccessibilityLabel: String? { + get { nil } + set { } + } +} + +@available(iOSApplicationExtension, unavailable) +@MainActor +@objc public extension IQKeyboardManager { + + @available(*, unavailable, renamed: "toolbarConfiguration.placeholderConfiguration.accessibilityLabel") + var toolbarTitleBarButtonItemAccessibilityLabel: String? { + get { nil } + set { } + } + + @available(*, unavailable, renamed: "toolbarConfiguration.placeholderConfiguration.showPlaceholder") + var shouldShowToolbarPlaceholder: Bool { + get { false } + set { } + } + + @available(*, unavailable, renamed: "toolbarConfiguration.placeholderConfiguration.font") + var placeholderFont: UIFont? { + get { nil } + set { } + } + + @available(*, unavailable, renamed: "toolbarConfiguration.placeholderConfiguration.color") + var placeholderColor: UIColor? { + get { nil } + set { } + } + + @available(*, unavailable, renamed: "toolbarConfiguration.placeholderConfiguration.buttonColor") + var placeholderButtonColor: UIColor? { + get { nil } + set { } + } +} +// swiftlint:enable unused_setter_value +// swiftlint:enable identifier_name diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/PrivacyInfo.xcprivacy b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..9021190 --- /dev/null +++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/PrivacyInfo.xcprivacy @@ -0,0 +1,14 @@ + + + + + NSPrivacyAccessedAPITypes + + NSPrivacyTrackingDomains + + NSPrivacyCollectedDataTypes + + NSPrivacyTracking + + + diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Resign/IQKeyboardManager+Resign.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Resign/IQKeyboardManager+Resign.swift new file mode 100644 index 0000000..5fc408d --- /dev/null +++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Resign/IQKeyboardManager+Resign.swift @@ -0,0 +1,100 @@ +// +// IQKeyboardManager+Resign.swift +// 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: +// +// 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. + +import UIKit + +@available(iOSApplicationExtension, unavailable) +@MainActor +@objc public extension IQKeyboardManager { + + @MainActor + private struct AssociatedKeys { + static var resignHandler: Int = 0 + } + + internal var resignHandler: IQKeyboardResignHandler { + if let object = objc_getAssociatedObject(self, &AssociatedKeys.resignHandler) + as? IQKeyboardResignHandler { + return object + } + + let object: IQKeyboardResignHandler = .init() + objc_setAssociatedObject(self, &AssociatedKeys.resignHandler, + object, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + + return object + } + + /** + Resigns Keyboard on touching outside TextInputView. Default is NO. + */ + var resignOnTouchOutside: Bool { + get { resignHandler.resignOnTouchOutside } + set { resignHandler.resignOnTouchOutside = newValue } + } + + /** 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 + */ + var resignGesture: UITapGestureRecognizer { + get { resignHandler.resignGesture } + set { resignHandler.resignGesture = newValue } + } + + /** + Disabled classes to ignore resignOnTouchOutside' property, Class should be kind of UIViewController. + */ + var disabledTouchResignedClasses: [UIViewController.Type] { + get { resignHandler.disabledTouchResignedClasses } + set { resignHandler.disabledTouchResignedClasses = newValue } + } + + /** + 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. + */ + var enabledTouchResignedClasses: [UIViewController.Type] { + get { resignHandler.enabledTouchResignedClasses } + set { resignHandler.enabledTouchResignedClasses = newValue } + } + + /** + 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] + */ + var touchResignedGestureIgnoreClasses: [UIView.Type] { + get { resignHandler.touchResignedGestureIgnoreClasses } + set { resignHandler.touchResignedGestureIgnoreClasses = newValue } + } + + /** + Resigns currently first responder field. + */ + @discardableResult + func resignFirstResponder() -> Bool { + resignHandler.resignFirstResponder() + } +} diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Resign/IQKeyboardManager+Resign_Deprecated.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Resign/IQKeyboardManager+Resign_Deprecated.swift new file mode 100644 index 0000000..b304c72 --- /dev/null +++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Resign/IQKeyboardManager+Resign_Deprecated.swift @@ -0,0 +1,37 @@ +// +// IQKeyboardManager+Resign_Deprecated.swift +// 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: +// +// 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. + +import UIKit + +// swiftlint:disable unused_setter_value +@available(iOSApplicationExtension, unavailable) +@MainActor +@objc public extension IQKeyboardManager { + + @available(*, unavailable, renamed: "resignOnTouchOutside") + var shouldResignOnTouchOutside: Bool { + get { false } + set { } + } +} +// swiftlint:enable unused_setter_value diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Resign/IQKeyboardResignHandler+Internal.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Resign/IQKeyboardResignHandler+Internal.swift new file mode 100644 index 0000000..6faff11 --- /dev/null +++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Resign/IQKeyboardResignHandler+Internal.swift @@ -0,0 +1,105 @@ +// +// IQKeyboardResignHandler+Internal.swift +// 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: +// +// 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. + +import UIKit +import IQKeyboardCore + +@available(iOSApplicationExtension, unavailable) +@MainActor +internal extension IQKeyboardResignHandler { + + func removeTextInputViewObserver() { + textInputViewObserver.unsubscribe(identifier: "IQKeyboardResignHandler") + } + + func addTextInputViewObserver() { + textInputViewObserver.subscribe(identifier: "IQKeyboardResignHandler", + changeHandler: { [weak self] event, textInputView in + guard let self = self else { return } + switch event { + case .beginEditing: + self.resignGesture.isEnabled = self.privateResignOnTouchOutside() + textInputView.window?.addGestureRecognizer(self.resignGesture) + case .endEditing: + textInputView.window?.removeGestureRecognizer(self.resignGesture) + } + }) + } + + func privateResignOnTouchOutside() -> Bool { + + guard let textInputView: any IQTextInputView = textInputViewObserver.textInputView else { + return resignOnTouchOutside + } + + switch textInputView.internalResignOnTouchOutsideMode { + case .default: + guard var controller = (textInputView as UIView).iq.viewContainingController() else { + return resignOnTouchOutside + } + + // If it is searchBar textField embedded in Navigation Bar + if textInputView is UISearchTextField { + if let navController: UINavigationController = controller as? UINavigationController, + let topController: UIViewController = navController.topViewController, + controller.navigationItem.searchController?.searchBar.searchTextField == textInputView { + controller = topController + } + } + + // If viewController is in enabledTouchResignedClasses, then assuming resignOnTouchOutside is enabled. + let isWithEnabledClass: Bool = enabledTouchResignedClasses.contains(where: { controller.isKind(of: $0) }) + var isEnabled: Bool = resignOnTouchOutside || isWithEnabledClass + + if isEnabled { + + // If viewController is in disabledTouchResignedClasses, + // then assuming resignOnTouchOutside is disable. + if disabledTouchResignedClasses.contains(where: { controller.isKind(of: $0) }) { + isEnabled = false + } else { + let classNameString: String = "\(type(of: controller.self))" + + // _UIAlertControllerTextFieldViewController + if classNameString.contains("UIAlertController"), + classNameString.hasSuffix("TextFieldViewController") { + isEnabled = false + } + } + } + return isEnabled + case .enabled: + return true + case .disabled: + return false + } + } +} + +@available(iOSApplicationExtension, unavailable) +@MainActor +fileprivate extension IQTextInputView { + var internalResignOnTouchOutsideMode: IQEnableMode { + iq.resignOnTouchOutsideMode + } +} diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Resign/IQKeyboardResignHandler.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Resign/IQKeyboardResignHandler.swift new file mode 100644 index 0000000..75b2562 --- /dev/null +++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Resign/IQKeyboardResignHandler.swift @@ -0,0 +1,154 @@ +// +// IQKeyboardResignHandler.swift +// 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: +// +// 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. + +import UIKit +import IQTextInputViewNotification +import IQKeyboardCore + +@available(iOSApplicationExtension, unavailable) +@MainActor +@objcMembers internal final class IQKeyboardResignHandler: NSObject { + + let textInputViewObserver: IQTextInputViewNotification = .init() + + /** + Resigns Keyboard on touching outside of TextInputView. Default is NO. + */ + public var resignOnTouchOutside: Bool = false { + + didSet { + resignGesture.isEnabled = privateResignOnTouchOutside() + + IQKeyboardManager.shared.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 + */ + public var resignGesture: UITapGestureRecognizer = .init() + + /** + Disabled classes to ignore resignOnTouchOutside' property, Class should be kind of UIViewController. + */ + public var disabledTouchResignedClasses: [UIViewController.Type] = [ + UIAlertController.self, + UIInputViewController.self + ] + + /** + 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. + */ + 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] + */ + public var touchResignedGestureIgnoreClasses: [UIView.Type] = [ + UIControl.self, + UINavigationBar.self + ] + + /** + Resigns currently first responder field. + */ + @discardableResult + public func resignFirstResponder() -> Bool { + + guard let textInputView: any IQTextInputView = textInputViewObserver.textInputView else { + return false + } + + // Resigning first responder + guard textInputView.resignFirstResponder() else { + IQKeyboardManager.shared.showLog("Warning: Refuses to resign first responder: \(textInputView)") + // 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. + textInputView.becomeFirstResponder() + return false + } + return true + } + + public override init() { + super.init() + + resignGesture.addTarget(self, action: #selector(self.tapRecognized(_:))) + resignGesture.cancelsTouchesInView = false + resignGesture.delegate = self + resignGesture.isEnabled = false + + addTextInputViewObserver() + } +} + +@available(iOSApplicationExtension, unavailable) +@MainActor +@objc extension IQKeyboardResignHandler: UIGestureRecognizerDelegate { + + /** Resigning on tap gesture. (Enhancement ID: #14)*/ + private func tapRecognized(_ gesture: UITapGestureRecognizer) { + + if gesture.state == .ended { + + // Resigning currently responder textInputView. + 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. + */ + 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 + */ + 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( + Icon +

+ +[![LICENSE.md](https://img.shields.io/github/license/hackiftekhar/IQKeyboardManager.svg)](https://github.com/hackiftekhar/IQKeyboardManager/blob/master/LICENSE.md) +[![Build Status](https://travis-ci.org/hackiftekhar/IQKeyboardManager.svg)](https://travis-ci.org/hackiftekhar/IQKeyboardManager) +![Platform iOS](https://img.shields.io/badge/Platform-iOS-blue.svg?style=fla) +[![CocoaPods](https://img.shields.io/cocoapods/v/IQKeyboardManagerSwift.svg)](http://cocoadocs.org/docsets/IQKeyboardManagerSwift) +[![Github tag](https://img.shields.io/github/tag/hackiftekhar/iqkeyboardmanager.svg)](https://github.com/hackiftekhar/IQKeyboardManager/tags) + +## IQKeyboardManager Objective-C version source code is moved to https://github.com/hackiftekhar/IQKeyboardManagerObjC + + +## Introduction +While developing iOS apps, we often run into issues where the iPhone keyboard slides up and covers the `UITextField/UITextView`. `IQKeyboardManager` allows you to prevent this issue of keyboard sliding up and covering `UITextField/UITextView` without needing you to write any code or make any additional setup. To use `IQKeyboardManager` you simply need to add source files to your project. + + +## Key Features + +1. **One Line of Code** - Just enable and it works +2. **Works Automatically** - No manual setup required +3. **No More UIScrollView** - Automatically handles scroll views +4. **No More Subclasses** - Works with standard UIKit components +5. **No More Manual Work** - Handles all edge cases automatically +6. **Modular Architecture** - Include only what you need via subspecs + +### What's Included + +- ✅ Automatic keyboard avoidance for UITextField/UITextView +- ✅ Support for UIScrollView, UITableView, UICollectionView +- ✅ All interface orientations +- ✅ Configurable keyboard distance +- ✅ Class-level enable/disable control + +### Optional Features (via Subspecs) + +- 📦 Toolbar with Previous/Next/Done buttons +- 📦 Return key handling customization +- 📦 Tap-to-resign keyboard +- 📦 Keyboard appearance configuration +- 📦 UITextView with placeholder supportv + +## Subspecs + +Now IQKeyboardManagerSwift uses a modular architecture with subspecs. +By default, all subspecs are included, but you can include only what you need: + +### Available Subspecs + +- **Core** (always included): Basic keyboard distance management +- **Appearance**: Keyboard appearance configuration +- **IQKeyboardReturnManager**: Return key handling +- **IQKeyboardToolbarManager**: Toolbar functionality (Previous/Next/Done buttons) +- **IQTextView**: UITextView with placeholder support +- **Resign**: Tap-to-resign keyboard functionality + +### Including Specific Subspecs + +```ruby +# Include toolbar example +pod 'IQKeyboardManagerSwift/IQKeyboardToolbarManager' +``` + +## Screenshot +[![Screenshot 1](https://raw.githubusercontent.com/hackiftekhar/IQKeyboardManager/master/Screenshot/README_Screenshot1.png)](http://youtu.be/6nhLw6hju2A) +[![Screenshot 2](https://raw.githubusercontent.com/hackiftekhar/IQKeyboardManager/master/Screenshot/README_Screenshot2.png)](http://youtu.be/6nhLw6hju2A) +[![Screenshot 3](https://raw.githubusercontent.com/hackiftekhar/IQKeyboardManager/master/Screenshot/README_Screenshot3.png)](http://youtu.be/6nhLw6hju2A) +[![Screenshot 4](https://raw.githubusercontent.com/hackiftekhar/IQKeyboardManager/master/Screenshot/README_Screenshot4.png)](http://youtu.be/6nhLw6hju2A) +[![Screenshot 5](https://raw.githubusercontent.com/hackiftekhar/IQKeyboardManager/master/Screenshot/README_Screenshot5.png)](http://youtu.be/6nhLw6hju2A) + +## GIF animation +[![IQKeyboardManager](https://raw.githubusercontent.com/hackiftekhar/IQKeyboardManager/v3.3.0/Screenshot/IQKeyboardManager.gif)](http://youtu.be/6nhLw6hju2A) + +## Video + + + +## Tutorial video by @rebeloper ([#1135](https://github.com/hackiftekhar/IQKeyboardManager/issues/1135)) + +@rebeloper demonstrated two videos on how to implement **IQKeyboardManager** at it's core: + + + +https://www.youtube.com/playlist?list=PL_csAAO9PQ8aTL87XnueOXi3RpWE2m_8v + +## Warning + +- **If you're planning to build SDK/library/framework and want to handle UITextField/UITextView with IQKeyboardManager then you're totally going the wrong way.** I would never suggest to add **IQKeyboardManager** as **dependency/adding/shipping** with any third-party library. Instead of adding **IQKeyboardManager** you should implement your own solution to achieve same kind of results. **IQKeyboardManager** is totally designed for projects to help developers for their convenience, it's not designed for **adding/dependency/shipping** with any **third-party library**, because **doing this could block adoption by other developers for their projects as well (who are not using IQKeyboardManager and have implemented their custom solution to handle UITextField/UITextView in the project).** +- If **IQKeyboardManager** conflicts with other **third-party library**, then it's **developer responsibility** to **enable/disable IQKeyboardManager** when **presenting/dismissing** third-party library UI. Third-party libraries are not responsible to handle IQKeyboardManager. + +## Requirements + +| | Minimum iOS Target | Minimum Xcode Version | +|------------------------|--------------------|-----------------------| +| IQKeyboardManagerSwift | iOS 13.0 | Xcode 13 | +| Demo Project | | Xcode 15 | + +#### Swift versions support + +| Swift | Xcode | IQKeyboardManagerSwift | +|-------------------|-------|------------------------| +| 5.9, 5.8, 5.7 | 16 | >= 7.0.0 | +| 5.9, 5.8, 5.7, 5.6| 15 | >= 7.0.0 | +| 5.5, 5.4, 5.3, 5.2, 5.1, 5.0, 4.2| 11 | >= 6.5.7 | +| 5.1, 5.0, 4.2, 4.0, 3.2, 3.0| 11 | >= 6.5.0 | +| 5.0,4.2, 4.0, 3.2, 3.0| 10.2 | >= 6.2.1 | +| 4.2, 4.0, 3.2, 3.0| 10.0 | >= 6.0.4 | +| 4.0, 3.2, 3.0 | 9.0 | 5.0.0 | + + +Installation +========================== + +#### CocoaPods + +To install it, simply add the following line to your Podfile: ([#236](https://github.com/hackiftekhar/IQKeyboardManager/issues/236)) + +```ruby +pod 'IQKeyboardManagerSwift' +``` + +*Or you can choose the version you need based on Swift support table from [Requirements](README.md#requirements)* + +```ruby +pod 'IQKeyboardManagerSwift', '8.0.0' +``` + +#### Carthage + +To integrate `IQKeyboardManger` or `IQKeyboardManagerSwift` into your Xcode project using Carthage, add the following line to your `Cartfile`: + +```ogdl +github "hackiftekhar/IQKeyboardManager" +``` + +Run `carthage update --use-xcframeworks` to build the frameworks and drag `IQKeyboardManagerSwift.xcframework` into your Xcode project based on your need. Make sure to add only one framework, not both. + +#### Swift Package Manager (SPM) + +To install `IQKeyboardManagerSwift` package via Xcode + + * Go to File -> Swift Packages -> Add Package Dependency... + * Then search for https://github.com/hackiftekhar/IQKeyboardManager.git + * And choose the version you want + +#### Source Code + +***IQKeyboardManagerSwift:*** Source code installation is not supported (since 7.2.0) because now the library depends on some other independent libraries. Due to this you may face compilation issues. + +#### Basic Usage + +### Minimal Setup (Core Only) + +In `AppDelegate.swift`, import and enable IQKeyboardManager: + +```swift +import IQKeyboardManagerSwift + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + + func application(_ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + + // Enable keyboard management + IQKeyboardManager.shared.isEnabled = true + + return true + } +} +``` + +That's it! The keyboard will now automatically adjust to avoid covering text fields. + +### With Toolbar (Requires IQKeyboardToolbarManager Subspec) + +```swift +import IQKeyboardManagerSwift + +func application(_ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + + // Enable keyboard management + IQKeyboardManager.shared.isEnabled = true + + // Enable toolbar (@Deprecated: Please use IQKeyboardToolbarManager pod independently) + IQKeyboardManager.shared.enableAutoToolbar = true + + return true +} +``` + +### With All Features + +```swift +import IQKeyboardManagerSwift + +func application(_ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + + // Core functionality + IQKeyboardManager.shared.isEnabled = true + IQKeyboardManager.shared.keyboardDistance = 20.0 + + // Toolbar (if using IQKeyboardToolbarManager subspec) + IQKeyboardManager.shared.enableAutoToolbar = true + + // Tap to resign (if using Resign subspec) + IQKeyboardManager.shared.resignOnTouchOutside = true + + // Appearance (if using Appearance subspec) + IQKeyboardManager.shared.keyboardConfiguration.overrideKeyboardAppearance = true + IQKeyboardManager.shared.keyboardConfiguration.keyboardAppearance = .dark + + return true +} +``` + + +Migration Guide +========================== +- [IQKeyboardManager 2.0.0 Migration Guide](https://github.com/hackiftekhar/IQKeyboardManager/blob/master/Documentation/MIGRATION%20GUIDE%201.0%20TO%202.0.md) +- [IQKeyboardManager 3.0.0 Migration Guide](https://github.com/hackiftekhar/IQKeyboardManager/blob/master/Documentation/MIGRATION%20GUIDE%202.0%20TO%203.0.md) +- [IQKeyboardManager 4.0.0 Migration Guide](https://github.com/hackiftekhar/IQKeyboardManager/blob/master/Documentation/MIGRATION%20GUIDE%203.0%20TO%204.0.md) +- [IQKeyboardManager 5.0.0 Migration Guide](https://github.com/hackiftekhar/IQKeyboardManager/blob/master/Documentation/MIGRATION%20GUIDE%204.0%20TO%205.0.md) +- [IQKeyboardManager 6.0.0 Migration Guide](https://github.com/hackiftekhar/IQKeyboardManager/blob/master/Documentation/MIGRATION%20GUIDE%205.0%20TO%206.0.md) +- [IQKeyboardManager 7.0.0 Migration Guide](https://github.com/hackiftekhar/IQKeyboardManager/blob/master/Documentation/MIGRATION%20GUIDE%206.0%20TO%207.0.md) +- [IQKeyboardManager 8.0.0 Migration Guide](https://github.com/hackiftekhar/IQKeyboardManager/blob/master/Documentation/MIGRATION%20GUIDE%207.0%20TO%208.0.md) + +Other Links +========================== + +- [Known Issues](https://github.com/hackiftekhar/IQKeyboardManager/wiki/Known-Issues) +- [Manual Management Tweaks](https://github.com/hackiftekhar/IQKeyboardManager/wiki/Manual-Management) +- [Properties and functions usage](https://github.com/hackiftekhar/IQKeyboardManager/wiki/Properties-&-Functions) + +## Dependency Diagram +[![IQKeyboardManager Dependency Diagram](https://raw.githubusercontent.com/hackiftekhar/IQKeyboardManager/master/Screenshot/IQKeyboardManagerDependency.jpg)](https://raw.githubusercontent.com/hackiftekhar/IQKeyboardManager/master/Screenshot/IQKeyboardManagerDependency.jpg) + +LICENSE +--- +Distributed under the MIT License. + +Contributions +--- +Any contribution is more than welcome! You can contribute through pull requests and issues on GitHub. + +Author +--- +If you wish to contact me, email at: hack.iftekhar@gmail.com diff --git a/Pods/IQKeyboardNotification/IQKeyboardNotification/Assets/PrivacyInfo.xcprivacy b/Pods/IQKeyboardNotification/IQKeyboardNotification/Assets/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..9021190 --- /dev/null +++ b/Pods/IQKeyboardNotification/IQKeyboardNotification/Assets/PrivacyInfo.xcprivacy @@ -0,0 +1,14 @@ + + + + + NSPrivacyAccessedAPITypes + + NSPrivacyTrackingDomains + + NSPrivacyCollectedDataTypes + + NSPrivacyTracking + + + diff --git a/Pods/IQKeyboardNotification/IQKeyboardNotification/Classes/IQKeyboardInfo.swift b/Pods/IQKeyboardNotification/IQKeyboardNotification/Classes/IQKeyboardInfo.swift new file mode 100644 index 0000000..6f247f9 --- /dev/null +++ b/Pods/IQKeyboardNotification/IQKeyboardNotification/Classes/IQKeyboardInfo.swift @@ -0,0 +1,243 @@ +// +// IQKeyboardInfo.swift +// https://github.com/hackiftekhar/IQKeyboardNotification +// 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: +// +// 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. + +import UIKit + +@available(iOSApplicationExtension, unavailable) +public struct IQKeyboardInfo: Equatable { + nonisolated public static func == (lhs: Self, rhs: Self) -> Bool { + lhs.event == rhs.event && + lhs.endFrame.equalTo(rhs.endFrame) + } + + @objc public enum Event: Int, CaseIterable { + case willShow + case didShow + case willChangeFrame + case didChangeFrame + case willHide + case didHide + + @MainActor + public var notification: Notification.Name { + switch self { + case .willShow: + return UIResponder.keyboardWillShowNotification + case .didShow: + return UIResponder.keyboardDidShowNotification + case .willChangeFrame: + return UIResponder.keyboardWillChangeFrameNotification + case .didChangeFrame: + return UIResponder.keyboardDidChangeFrameNotification + case .willHide: + return UIResponder.keyboardWillHideNotification + case .didHide: + return UIResponder.keyboardDidHideNotification + } + } + } + + public let event: Event + + /// `keyboardIsLocalUserInfoKey`. + public let isLocal: Bool + + /// `UIKeyboardFrameBeginUserInfoKey`. + public let beginFrame: CGRect + + /// `UIKeyboardFrameEndUserInfoKey`. + public let endFrame: CGRect + + /// `UIKeyboardAnimationDurationUserInfoKey`. + public let animationDuration: TimeInterval + + /// `UIKeyboardAnimationCurveUserInfoKey`. + public let animationCurve: UIView.AnimationCurve + + public var animationOptions: UIView.AnimationOptions { + return UIView.AnimationOptions(rawValue: UInt(animationCurve.rawValue << 16)) + } + + public var isVisible: Bool { + endFrame.height > 0 + } + + internal init(notification: Notification?, event: Event) { + self.event = event + + let screenBounds: CGRect + if let screen: UIScreen = notification?.object as? UIScreen { + screenBounds = screen.bounds + } else { + screenBounds = UIScreen.main.bounds + } + + if let info: [AnyHashable: Any] = notification?.userInfo { + + if let value = info[UIResponder.keyboardIsLocalUserInfoKey] as? Bool { + isLocal = value + } else { + isLocal = true + } + + // Getting keyboard animation. + if let curveValue: Int = info[UIResponder.keyboardAnimationCurveUserInfoKey] as? Int, + let curve: UIView.AnimationCurve = UIView.AnimationCurve(rawValue: curveValue) { + animationCurve = curve + } else { + animationCurve = .easeOut + } + + // Getting keyboard animation duration + if let duration: TimeInterval = info[UIResponder.keyboardAnimationDurationUserInfoKey] as? TimeInterval, + duration != 0.0 { + animationDuration = duration + } else { + animationDuration = 0.25 + } + + if let beginKeyboardFrame: CGRect = info[UIResponder.keyboardFrameBeginUserInfoKey] as? CGRect { + beginFrame = Self.getKeyboardFrame(of: beginKeyboardFrame, inScreenBounds: screenBounds) + } else { + beginFrame = CGRect(x: 0, y: screenBounds.height, width: screenBounds.width, height: 0) + } + + var endFrame: CGRect + if let endKeyboardFrame: CGRect = info[UIResponder.keyboardFrameEndUserInfoKey] as? CGRect { + endFrame = Self.getKeyboardFrame(of: endKeyboardFrame, inScreenBounds: screenBounds) + } else { + endFrame = CGRect(x: 0, y: screenBounds.height, width: screenBounds.width, height: 0) + } + + // With iOS 26, the endFrame returns height equal to the input accessory view height even when keyboard is dismissed. + // Unfortunately we have to assume this hack for iOS 26. + #if compiler(>=6.2) // Xcode 26 + if #available(iOS 26.0, *) { + switch event { + case .willHide, .didHide: + endFrame.origin.y += endFrame.size.height + endFrame.size.height = 0 + case .willShow, .didShow, .willChangeFrame, .didChangeFrame: + break + } + } + #endif + self.endFrame = endFrame + } else { + isLocal = true + animationCurve = .easeOut + animationDuration = 0.25 + beginFrame = CGRect(x: 0, y: screenBounds.height, width: screenBounds.width, height: 0) + endFrame = CGRect(x: 0, y: screenBounds.height, width: screenBounds.width, height: 0) + } + } + + @MainActor + public func animate(alongsideTransition transition: @escaping () -> Void, completion: (() -> Void)? = nil) { + +// if let timing = UIView.AnimationCurve.RawValue(exactly: animationCurve.rawValue), +// let curve = UIView.AnimationCurve(rawValue: timing) { +// let animator = UIViewPropertyAnimator(duration: animationDuration, curve: curve) { +// transition() +// } +// animator.addCompletion { _ in +// completion?() +// } +// animator.isUserInteractionEnabled = true +// animator.startAnimation() +// } else { + var animationOptions: UIView.AnimationOptions = self.animationOptions + animationOptions.formUnion(.allowUserInteraction) + animationOptions.formUnion(.beginFromCurrentState) + UIView.animate(withDuration: animationDuration, delay: 0, + options: animationOptions, + animations: transition, + completion: { _ in + completion?() + }) +// } + } +} + +@available(iOSApplicationExtension, unavailable) +private extension IQKeyboardInfo { + + static func getKeyboardFrame(of rect: CGRect, inScreenBounds screenBounds: CGRect) -> CGRect { + var finalFrame: CGRect = rect + // If this is floating keyboard + if finalFrame.width < screenBounds.width, + finalFrame.maxY < screenBounds.height { + finalFrame.size = CGSize(width: finalFrame.size.width, height: 0) + } else { + // (Bug ID: #469) (Bug ID: #381) (Bug ID: #1506) + // Calculating actual keyboard covered size respect to window, + // keyboard frame may be different when hardware keyboard is attached + let keyboardHeight = CGFloat.maximum(screenBounds.height - finalFrame.minY, 0) + finalFrame.size = CGSize(width: finalFrame.size.width, height: keyboardHeight) + } + + return finalFrame + } +} + +@available(iOSApplicationExtension, unavailable) +@objcMembers public class IQKeyboardInfoObjC: NSObject { + private let wrappedValue: IQKeyboardInfo + + public var event: IQKeyboardInfo.Event { wrappedValue.event } + + public var isLocal: Bool { wrappedValue.isLocal } + + public var beginFrame: CGRect { wrappedValue.beginFrame } + + public var endFrame: CGRect { wrappedValue.endFrame } + + public var animationDuration: TimeInterval { wrappedValue.animationDuration } + + public var animationCurve: UIView.AnimationCurve { wrappedValue.animationCurve } + + public var animationOptions: UIView.AnimationOptions { wrappedValue.animationOptions } + + public var isVisible: Bool { wrappedValue.isVisible } + + init(wrappedValue: IQKeyboardInfo){ + self.wrappedValue = wrappedValue + } + + @MainActor + public func animate(alongsideTransition transition: @escaping () -> Void, completion: (() -> Void)? = nil) { + wrappedValue.animate(alongsideTransition: transition, completion: completion) + } +} + +// MARK: Deprecated +@available(iOSApplicationExtension, unavailable) +public extension IQKeyboardInfo { + + @available(*, unavailable, renamed: "event") + var name: Event { event } + + @available(*, unavailable, renamed: "isVisible") + var keyboardShowing: Bool { isVisible } +} + diff --git a/Pods/IQKeyboardNotification/IQKeyboardNotification/Classes/IQKeyboardNotification.swift b/Pods/IQKeyboardNotification/IQKeyboardNotification/Classes/IQKeyboardNotification.swift new file mode 100644 index 0000000..9df3d62 --- /dev/null +++ b/Pods/IQKeyboardNotification/IQKeyboardNotification/Classes/IQKeyboardNotification.swift @@ -0,0 +1,172 @@ +// +// IQKeyboardNotification.swift +// https://github.com/hackiftekhar/IQKeyboardNotification +// 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: +// +// 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. + +import UIKit +import Combine + +@available(iOSApplicationExtension, unavailable) +@MainActor +@objcMembers public final class IQKeyboardNotification: NSObject { + + private var storage: Set = [] + + private var eventObservers: [IQKeyboardInfo.Event: [AnyHashable: SizeCompletion]] = [:] + + public private(set) var oldKeyboardInfo: IQKeyboardInfo + + public private(set) var keyboardInfo: IQKeyboardInfo { + didSet { + guard keyboardInfo != oldValue else { return } + oldKeyboardInfo = oldValue + sendKeyboardInfo(info: keyboardInfo) + } + } + + public var isVisible: Bool { + keyboardInfo.isVisible + } + + public var frame: CGRect { + keyboardInfo.endFrame + } + + public override init() { + keyboardInfo = IQKeyboardInfo(notification: nil, event: .didHide) + oldKeyboardInfo = keyboardInfo + super.init() + + // Registering for keyboard notification. + for event in IQKeyboardInfo.Event.allCases { + NotificationCenter.default.publisher(for: event.notification) + .map({ IQKeyboardInfo(notification: $0, event: event) }) + .sink(receiveValue: { [weak self] keyboardInfo in + self?.keyboardInfo = keyboardInfo + }) + .store(in: &storage) + } + } + + public func animate(alongsideTransition transition: @escaping () -> Void, completion: (() -> Void)? = nil) { + keyboardInfo.animate(alongsideTransition: transition, completion: completion) + } +} + +@available(iOSApplicationExtension, unavailable) +@MainActor +public extension IQKeyboardNotification { + + typealias SizeCompletion = (_ event: IQKeyboardInfo.Event, _ endFrame: CGRect) -> Void + + func subscribe(for events: [IQKeyboardInfo.Event], + identifier: AnyHashable, changeHandler: @escaping SizeCompletion) { + + for event in events { + var existingObservers: [AnyHashable: SizeCompletion] = eventObservers[event] ?? [:] + existingObservers[identifier] = changeHandler + eventObservers[event] = existingObservers + } + + // If current event is the one user is subscribed to, then call changeHandler immediately for the first time. + if events.contains(keyboardInfo.event) { + changeHandler(keyboardInfo.event, keyboardInfo.endFrame) + } + } + + func unsubscribe(for events: [IQKeyboardInfo.Event], identifier: AnyHashable) { + + for event in events { + var existingObservers: [AnyHashable: SizeCompletion] = eventObservers[event] ?? [:] + existingObservers[identifier] = nil + eventObservers[event] = existingObservers + } + } + + func isSubscribed(for event: IQKeyboardInfo.Event? = nil, identifier: AnyHashable) -> Bool { + if let event = event { + guard let observers = eventObservers[event], !observers.isEmpty else { return false } + return observers[identifier] != nil + } else { + + for event in IQKeyboardInfo.Event.allCases { + let observers = eventObservers[event] ?? [:] + if observers[identifier] != nil { + return true + } + } + return false + } + } + + private func sendKeyboardInfo(info: IQKeyboardInfo) { + + guard let observers = eventObservers[info.event], !observers.isEmpty else { return } + + let endFrame: CGRect = info.endFrame + + for block in observers.values { + block(info.event, endFrame) + } + } +} + +@available(iOSApplicationExtension, unavailable) +@MainActor +@objc public extension IQKeyboardNotification { + + var oldKeyboardInfoObjc: IQKeyboardInfoObjC { IQKeyboardInfoObjC(wrappedValue: oldKeyboardInfo) } + + var keyboardInfoObjc: IQKeyboardInfoObjC { IQKeyboardInfoObjC(wrappedValue: keyboardInfo) } + + func subscribe(identifier: AnyHashable, changeHandler: @escaping SizeCompletion) { + subscribe(for: IQKeyboardInfo.Event.allCases, identifier: identifier, changeHandler: changeHandler) + } + + func unsubscribe(identifier: AnyHashable) { + unsubscribe(for: IQKeyboardInfo.Event.allCases, identifier: identifier) + } + + func isSubscribed(identifier: AnyHashable) -> Bool { + isSubscribed(for: nil, identifier: identifier) + } +} + +// MARK: Deprecated +@available(iOSApplicationExtension, unavailable) +@objc public extension IQKeyboardNotification { + + // MARK: Deprecated + + @available(*, unavailable, renamed: "isVisible") + var keyboardShowing: Bool { isVisible } + + @available(*, unavailable, renamed: "subscribe(identifier:changeHandler:)") + func registerSizeChange(identifier: AnyHashable, changeHandler: @escaping SizeCompletion) { + subscribe(identifier: identifier, changeHandler: changeHandler) + } + + @available(*, unavailable, renamed: "unsubscribe(identifier:)") + func unregisterSizeChange(identifier: AnyHashable) { + unsubscribe(identifier: identifier) + } +} + diff --git a/Pods/IQKeyboardNotification/LICENSE b/Pods/IQKeyboardNotification/LICENSE new file mode 100644 index 0000000..5d8eb96 --- /dev/null +++ b/Pods/IQKeyboardNotification/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 Mohd 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: + +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. diff --git a/Pods/IQKeyboardNotification/README.md b/Pods/IQKeyboardNotification/README.md new file mode 100644 index 0000000..6efb6f7 --- /dev/null +++ b/Pods/IQKeyboardNotification/README.md @@ -0,0 +1,66 @@ +# IQKeyboardNotification +Lightweight library to observe keyboard events with ease. + +[![CI Status](https://img.shields.io/travis/hackiftekhar/IQKeyboardNotification.svg?style=flat)](https://travis-ci.org/hackiftekhar/IQKeyboardNotification) +[![Version](https://img.shields.io/cocoapods/v/IQKeyboardNotification.svg?style=flat)](https://cocoapods.org/pods/IQKeyboardNotification) +[![License](https://img.shields.io/cocoapods/l/IQKeyboardNotification.svg?style=flat)](https://cocoapods.org/pods/IQKeyboardNotification) +[![Platform](https://img.shields.io/cocoapods/p/IQKeyboardNotification.svg?style=flat)](https://cocoapods.org/pods/IQKeyboardNotification) + +![Screenshot](https://raw.githubusercontent.com/hackiftekhar/IQKeyboardNotification/master/Screenshot/IQKeyboardNotificationScreenshot.png) + +## Example + +To run the example project, clone the repo, and run `pod install` from the Example directory first. + +## Requirements + +## Installation + +IQKeyboardNotification is available through [CocoaPods](https://cocoapods.org). To install +it, simply add the following line to your Podfile: + +```ruby +pod 'IQKeyboardNotification' +``` + +## Usage + +To observe keyboard events, subscribe to the keyboard events:- + +```swift +import IQKeyboardNotification + +class ViewController: UIViewController { + + private let keyboard: IQKeyboardNotification = .init() + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + + // Subscribe + keyboard.subscribe(identifier: "YOUR_UNIQUE_IDENTIFIER") { event, frame in + print(frame) + // Write your own logic here based on event and keyboard frame + } + } + + override func viewWillDisappear(_ animated: Bool) { + super.viewWillDisappear(animated) + + // Unsubscribe + keyboard.unsubscribe(identifier: "YOUR_UNIQUE_IDENTIFIER") + } +} +``` + +## Author + +Iftekhar Qurashi hack.iftekhar@gmail.com + +## Flow + +![Screenshot](https://raw.githubusercontent.com/hackiftekhar/IQKeyboardNotification/master/Screenshot/FlowDiagram.jpg) + +## License + +IQKeyboardNotification is available under the MIT license. See the LICENSE file for more info. diff --git a/Pods/IQKeyboardReturnManager/IQKeyboardReturnManager/Assets/PrivacyInfo.xcprivacy b/Pods/IQKeyboardReturnManager/IQKeyboardReturnManager/Assets/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..9021190 --- /dev/null +++ b/Pods/IQKeyboardReturnManager/IQKeyboardReturnManager/Assets/PrivacyInfo.xcprivacy @@ -0,0 +1,14 @@ + + + + + NSPrivacyAccessedAPITypes + + NSPrivacyTrackingDomains + + NSPrivacyCollectedDataTypes + + NSPrivacyTracking + + + diff --git a/Pods/IQKeyboardReturnManager/IQKeyboardReturnManager/Classes/Delegates/IQKeyboardReturnManager+UITextFieldDelegate.swift b/Pods/IQKeyboardReturnManager/IQKeyboardReturnManager/Classes/Delegates/IQKeyboardReturnManager+UITextFieldDelegate.swift new file mode 100644 index 0000000..42692cc --- /dev/null +++ b/Pods/IQKeyboardReturnManager/IQKeyboardReturnManager/Classes/Delegates/IQKeyboardReturnManager+UITextFieldDelegate.swift @@ -0,0 +1,286 @@ +// +// IQKeyboardReturnManager+UITextFieldDelegate.swift +// https://github.com/hackiftekhar/IQKeyboardReturnManager +// 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: +// +// 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. + +import UIKit + +// MARK: UITextFieldDelegate +@available(iOSApplicationExtension, unavailable) +@MainActor +@objc extension IQKeyboardReturnManager: UITextFieldDelegate { +} + +@objc public extension IQKeyboardReturnManager { + + func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool { + + var returnValue: Bool = true + + if delegate == nil, + let textFieldDelegate: any UITextFieldDelegate = textInputViewCachedInfo(textField)?.textFieldDelegate { + let selector = #selector((any UITextFieldDelegate).textFieldShouldBeginEditing(_:)) + if textFieldDelegate.responds(to: selector) { + returnValue = textFieldDelegate.textFieldShouldBeginEditing?(textField) ?? false + } + } + + if returnValue { + updateReturnKey(textInputView: textField) + } + + return returnValue + } + + func textFieldShouldEndEditing(_ textField: UITextField) -> Bool { + + guard delegate == nil else { return true } + + if let textFieldDelegate: any UITextFieldDelegate = textInputViewCachedInfo(textField)?.textFieldDelegate { + let selector = #selector((any UITextFieldDelegate).textFieldShouldEndEditing(_:)) + if textFieldDelegate.responds(to: selector) { + return textFieldDelegate.textFieldShouldEndEditing?(textField) ?? false + } + } + + return true + } + + func textFieldDidBeginEditing(_ textField: UITextField) { + + var aDelegate: (any UITextFieldDelegate)? = delegate + + if aDelegate == nil { + + if let model: IQTextInputViewInfoModel = textInputViewCachedInfo(textField) { + aDelegate = model.textFieldDelegate + } + } + + aDelegate?.textFieldDidBeginEditing?(textField) + } + + func textFieldDidEndEditing(_ textField: UITextField) { + + var aDelegate: (any UITextFieldDelegate)? = delegate + + if aDelegate == nil { + + if let model: IQTextInputViewInfoModel = textInputViewCachedInfo(textField) { + aDelegate = model.textFieldDelegate + } + } + + aDelegate?.textFieldDidEndEditing?(textField) + } + + func textFieldDidEndEditing(_ textField: UITextField, reason: UITextField.DidEndEditingReason) { + + var aDelegate: (any UITextFieldDelegate)? = delegate + + if aDelegate == nil { + + if let model: IQTextInputViewInfoModel = textInputViewCachedInfo(textField) { + aDelegate = model.textFieldDelegate + } + } + + aDelegate?.textFieldDidEndEditing?(textField, reason: reason) + } + + func textField(_ textField: UITextField, + shouldChangeCharactersIn range: NSRange, + replacementString string: String) -> Bool { + + guard delegate == nil else { return true } + + if let textFieldDelegate: any UITextFieldDelegate = textInputViewCachedInfo(textField)?.textFieldDelegate { + let selector: Selector = #selector((any UITextFieldDelegate).textField(_:shouldChangeCharactersIn: + replacementString:)) + if textFieldDelegate.responds(to: selector) { + return textFieldDelegate.textField?(textField, + shouldChangeCharactersIn: range, + replacementString: string) ?? false + } + } + return true + } + + func textFieldDidChangeSelection(_ textField: UITextField) { + + var aDelegate: (any UITextFieldDelegate)? = delegate + + if aDelegate == nil { + + if let model: IQTextInputViewInfoModel = textInputViewCachedInfo(textField) { + aDelegate = model.textFieldDelegate + } + } + + aDelegate?.textFieldDidChangeSelection?(textField) + } + + func textFieldShouldClear(_ textField: UITextField) -> Bool { + + guard delegate == nil else { return true } + + if let textFieldDelegate: any UITextFieldDelegate = textInputViewCachedInfo(textField)?.textFieldDelegate { + let selector: Selector = #selector((any UITextFieldDelegate).textFieldShouldClear(_:)) + if textFieldDelegate.responds(to: selector) { + return textFieldDelegate.textFieldShouldClear?(textField) ?? false + } + } + + return true + } + + func textFieldShouldReturn(_ textField: UITextField) -> Bool { + + guard delegate == nil else { return true } + + var isReturn: Bool = true + + if let textFieldDelegate: any UITextFieldDelegate = textInputViewCachedInfo(textField)?.textFieldDelegate { + let selector: Selector = #selector((any UITextFieldDelegate).textFieldShouldReturn(_:)) + if textFieldDelegate.responds(to: selector) { + isReturn = textFieldDelegate.textFieldShouldReturn?(textField) ?? false + } + } + + if isReturn { + goToNextResponderOrResign(from: textField) + return true + } else { + return goToNextResponderOrResign(from: textField) + } + } +} + +#if compiler(>=5.7) // Xcode 14 +@available(iOS 16.0, *) +@available(iOSApplicationExtension, unavailable) +@MainActor +@objc public extension IQKeyboardReturnManager { + + func textField(_ textField: UITextField, editMenuForCharactersIn range: NSRange, suggestedActions: [UIMenuElement]) -> UIMenu? { + + guard delegate == nil else { return nil } + + if let textFieldDelegate: any UITextFieldDelegate = textInputViewCachedInfo(textField)?.textFieldDelegate { + + let selector = #selector((any UITextFieldDelegate).textField(_:editMenuForCharactersIn:suggestedActions:)) + if textFieldDelegate.responds(to: selector) { + return textFieldDelegate.textField?(textField, editMenuForCharactersIn: range, suggestedActions: suggestedActions) + } + } + + return nil + } + + func textField(_ textField: UITextField, willPresentEditMenuWith animator: any UIEditMenuInteractionAnimating) { + var aDelegate: (any UITextFieldDelegate)? = delegate + + if aDelegate == nil { + + if let model: IQTextInputViewInfoModel = textInputViewCachedInfo(textField) { + aDelegate = model.textFieldDelegate + } + } + + aDelegate?.textField?(textField, willPresentEditMenuWith: animator) + } + + func textField(_ textField: UITextField, willDismissEditMenuWith animator: any UIEditMenuInteractionAnimating) { + var aDelegate: (any UITextFieldDelegate)? = delegate + + if aDelegate == nil { + + if let model: IQTextInputViewInfoModel = textInputViewCachedInfo(textField) { + aDelegate = model.textFieldDelegate + } + } + + aDelegate?.textField?(textField, willDismissEditMenuWith: animator) + } +} +#endif + +#if compiler(>=6.0) // Xcode 16 +@available(iOS 18.0, *) +@available(iOSApplicationExtension, unavailable) +@MainActor +@objc public extension IQKeyboardReturnManager { + +#if compiler(>=6.1) // Xcode 16.3 + @available(iOS 18.4, *) + func textField(_ textField: UITextField, insertInputSuggestion inputSuggestion: UIInputSuggestion) { + var aDelegate: (any UITextFieldDelegate)? = delegate + + if aDelegate == nil { + + if let model: IQTextInputViewInfoModel = textInputViewCachedInfo(textField) { + aDelegate = model.textFieldDelegate + } + } + + aDelegate?.textField?(textField, insertInputSuggestion: inputSuggestion) + } +#endif +} +#endif + +#if compiler(>=6.2) // Xcode 26 +@available(iOS 26.0, *) +@available(iOSApplicationExtension, unavailable) +@MainActor +@objc public extension IQKeyboardReturnManager { + + func textField(_ textField: UITextField, shouldChangeCharactersInRanges ranges: [NSValue], replacementString string: String) -> Bool { + guard delegate == nil else { return true } + + if let textFieldDelegate: any UITextFieldDelegate = textInputViewCachedInfo(textField)?.textFieldDelegate { + let selector: Selector = #selector((any UITextFieldDelegate).textField(_:shouldChangeCharactersInRanges: + replacementString:)) + if textFieldDelegate.responds(to: selector) { + return textFieldDelegate.textField?(textField, + shouldChangeCharactersInRanges: ranges, + replacementString: string) ?? false + } + } + return true + } + + func textField(_ textField: UITextField, editMenuForCharactersInRanges ranges: [NSValue], suggestedActions: [UIMenuElement]) -> UIMenu? { + + guard delegate == nil else { return nil } + + if let textFieldDelegate: any UITextFieldDelegate = textInputViewCachedInfo(textField)?.textFieldDelegate { + + let selector = #selector((any UITextFieldDelegate).textField(_:editMenuForCharactersInRanges:suggestedActions:)) + if textFieldDelegate.responds(to: selector) { + return textFieldDelegate.textField?(textField, editMenuForCharactersInRanges: ranges, suggestedActions: suggestedActions) + } + } + + return nil + } +} +#endif diff --git a/Pods/IQKeyboardReturnManager/IQKeyboardReturnManager/Classes/Delegates/IQKeyboardReturnManager+UITextViewDelegate.swift b/Pods/IQKeyboardReturnManager/IQKeyboardReturnManager/Classes/Delegates/IQKeyboardReturnManager+UITextViewDelegate.swift new file mode 100644 index 0000000..1d21d18 --- /dev/null +++ b/Pods/IQKeyboardReturnManager/IQKeyboardReturnManager/Classes/Delegates/IQKeyboardReturnManager+UITextViewDelegate.swift @@ -0,0 +1,532 @@ +// +// IQKeyboardReturnManager+UITextViewDelegate.swift +// https://github.com/hackiftekhar/IQKeyboardReturnManager +// 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: +// +// 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. + +import UIKit + +// MARK: UITextViewDelegate +@available(iOSApplicationExtension, unavailable) +@MainActor +@objc extension IQKeyboardReturnManager: UITextViewDelegate { +} + +@objc public extension IQKeyboardReturnManager { + + func textViewShouldBeginEditing(_ textView: UITextView) -> Bool { + + var returnValue: Bool = true + + if delegate == nil, + let textViewDelegate: any UITextViewDelegate = textInputViewCachedInfo(textView)?.textViewDelegate { + if textViewDelegate.responds(to: #selector((any UITextViewDelegate).textViewShouldBeginEditing(_:))) { + returnValue = textViewDelegate.textViewShouldBeginEditing?(textView) ?? false + } + } + + if returnValue { + updateReturnKey(textInputView: textView) + } + + return returnValue + } + + func textViewShouldEndEditing(_ textView: UITextView) -> Bool { + + guard delegate == nil else { return true } + + if let textViewDelegate: any UITextViewDelegate = textInputViewCachedInfo(textView)?.textViewDelegate { + if textViewDelegate.responds(to: #selector((any UITextViewDelegate).textViewShouldEndEditing(_:))) { + return textViewDelegate.textViewShouldEndEditing?(textView) ?? false + } + } + + return true + } + + func textViewDidBeginEditing(_ textView: UITextView) { + + var aDelegate: (any UITextViewDelegate)? = delegate + + if aDelegate == nil { + + if let model: IQTextInputViewInfoModel = textInputViewCachedInfo(textView) { + aDelegate = model.textViewDelegate + } + } + + aDelegate?.textViewDidBeginEditing?(textView) + } + + func textViewDidEndEditing(_ textView: UITextView) { + + var aDelegate: (any UITextViewDelegate)? = delegate + + if aDelegate == nil { + + if let model: IQTextInputViewInfoModel = textInputViewCachedInfo(textView) { + aDelegate = model.textViewDelegate + } + } + + aDelegate?.textViewDidEndEditing?(textView) + } + + func textView(_ textView: UITextView, + shouldChangeTextIn range: NSRange, + replacementText text: String) -> Bool { + + var shouldChange = true + + if delegate == nil { + + if let textViewDelegate: any UITextViewDelegate = textInputViewCachedInfo(textView)?.textViewDelegate { + let selector = #selector((any UITextViewDelegate).textView(_:shouldChangeTextIn:replacementText:)) + if textViewDelegate.responds(to: selector) { + shouldChange = (textViewDelegate.textView?(textView, + shouldChangeTextIn: range, + replacementText: text)) ?? true + } + } + } + + if self.dismissTextViewOnReturn, text == "\n" { + goToNextResponderOrResign(from: textView) + return false + } + + return shouldChange + } + + func textViewDidChange(_ textView: UITextView) { + + var aDelegate: (any UITextViewDelegate)? = delegate + + if aDelegate == nil { + + if let model: IQTextInputViewInfoModel = textInputViewCachedInfo(textView) { + aDelegate = model.textViewDelegate + } + } + + aDelegate?.textViewDidChange?(textView) + } + + func textViewDidChangeSelection(_ textView: UITextView) { + + var aDelegate: (any UITextViewDelegate)? = delegate + + if aDelegate == nil { + + if let model: IQTextInputViewInfoModel = textInputViewCachedInfo(textView) { + aDelegate = model.textViewDelegate + } + } + + aDelegate?.textViewDidChangeSelection?(textView) + } + + @available(iOS, deprecated: 17.0) + func textView(_ aTextView: UITextView, + shouldInteractWith URL: URL, + in characterRange: NSRange, + interaction: UITextItemInteraction) -> Bool { + + guard delegate == nil else { return true } + + if let textViewDelegate: any UITextViewDelegate = textInputViewCachedInfo(aTextView)?.textViewDelegate { + + let selector: Selector = #selector(textView as (UITextView, URL, NSRange, UITextItemInteraction) -> Bool) + if textViewDelegate.responds(to: selector) { + return textViewDelegate.textView?(aTextView, + shouldInteractWith: URL, + in: characterRange, + interaction: interaction) ?? false + } + } + + return true + } + + @available(iOS, deprecated: 17.0) + func textView(_ aTextView: UITextView, + shouldInteractWith textAttachment: NSTextAttachment, + in characterRange: NSRange, + interaction: UITextItemInteraction) -> Bool { + + guard delegate == nil else { return true } + + if let textViewDelegate: any UITextViewDelegate = textInputViewCachedInfo(aTextView)?.textViewDelegate { + let selector: Selector = #selector(textView as + (UITextView, NSTextAttachment, NSRange, UITextItemInteraction) + -> Bool) + if textViewDelegate.responds(to: selector) { + return textViewDelegate.textView?(aTextView, + shouldInteractWith: textAttachment, + in: characterRange, + interaction: interaction) ?? false + } + } + + return true + } + + @available(iOS, deprecated: 10.0) + func textView(_ aTextView: UITextView, + shouldInteractWith URL: URL, + in characterRange: NSRange) -> Bool { + + guard delegate == nil else { return true } + + if let textViewDelegate: any UITextViewDelegate = textInputViewCachedInfo(aTextView)?.textViewDelegate { + + let selector: Selector = #selector(textView as (UITextView, URL, NSRange) -> Bool) + + if textViewDelegate.responds(to: selector) { + return textViewDelegate.textView?(aTextView, + shouldInteractWith: URL, + in: characterRange) ?? false + } + } + + return true + } + + @available(iOS, deprecated: 10.0) + func textView(_ aTextView: UITextView, + shouldInteractWith textAttachment: NSTextAttachment, + in characterRange: NSRange) -> Bool { + + guard delegate == nil else { return true } + + if let textViewDelegate: any UITextViewDelegate = textInputViewCachedInfo(aTextView)?.textViewDelegate { + + let selector: Selector = #selector(textView as (UITextView, NSTextAttachment, NSRange) -> Bool) + + if textViewDelegate.responds(to: selector) { + return textViewDelegate.textView?(aTextView, + shouldInteractWith: textAttachment, + in: characterRange) ?? false + } + } + + return true + } +} + +#if compiler(>=5.7) // Xcode 14 +@available(iOS 16.0, *) +@available(iOSApplicationExtension, unavailable) +@MainActor +@objc public extension IQKeyboardReturnManager { + func textView(_ aTextView: UITextView, + editMenuForTextIn range: NSRange, + suggestedActions: [UIMenuElement]) -> UIMenu? { + + guard delegate == nil else { return nil } + + if let textViewDelegate: any UITextViewDelegate = textInputViewCachedInfo(aTextView)?.textViewDelegate { + + let selector = #selector((any UITextViewDelegate).textView(_:editMenuForTextIn:suggestedActions:)) + if textViewDelegate.responds(to: selector) { + return textViewDelegate.textView?(aTextView, + editMenuForTextIn: range, + suggestedActions: suggestedActions) + } + } + + return nil + } + + func textView(_ aTextView: UITextView, + willPresentEditMenuWith animator: any UIEditMenuInteractionAnimating) { + var aDelegate: (any UITextViewDelegate)? = delegate + + if aDelegate == nil { + + if let model: IQTextInputViewInfoModel = textInputViewCachedInfo(aTextView) { + aDelegate = model.textViewDelegate + } + } + + aDelegate?.textView?(aTextView, willPresentEditMenuWith: animator) + } + + func textView(_ aTextView: UITextView, + willDismissEditMenuWith animator: any UIEditMenuInteractionAnimating) { + var aDelegate: (any UITextViewDelegate)? = delegate + + if aDelegate == nil { + + if let model: IQTextInputViewInfoModel = textInputViewCachedInfo(aTextView) { + aDelegate = model.textViewDelegate + } + } + + aDelegate?.textView?(aTextView, willDismissEditMenuWith: animator) + } +} +#endif + +#if compiler(>=5.9) // Xcode 15 +@available(iOS 17.0, *) +@available(iOSApplicationExtension, unavailable) +@MainActor +@objc public extension IQKeyboardReturnManager { + + func textView(_ aTextView: UITextView, + primaryActionFor textItem: UITextItem, + defaultAction: UIAction) -> UIAction? { + guard delegate == nil else { return nil } + + if let textViewDelegate = textInputViewCachedInfo(aTextView)?.textViewDelegate { + let selector = #selector((any UITextViewDelegate).textView(_:primaryActionFor:defaultAction:)) + + if textViewDelegate.responds(to: selector) { + return textViewDelegate.textView?(aTextView, + primaryActionFor: textItem, + defaultAction: defaultAction) + } + } + + return nil + } + + func textView(_ aTextView: UITextView, + menuConfigurationFor textItem: UITextItem, + defaultMenu: UIMenu) -> UITextItem.MenuConfiguration? { + guard delegate == nil else { return nil } + + if let textViewDelegate = textInputViewCachedInfo(aTextView)?.textViewDelegate { + let selector = #selector((any UITextViewDelegate).textView(_:menuConfigurationFor:defaultMenu:)) + if textViewDelegate.responds(to: selector) { + return textViewDelegate.textView?(aTextView, + menuConfigurationFor: textItem, + defaultMenu: defaultMenu) + } + } + + return nil + } + + func textView(_ textView: UITextView, + textItemMenuWillDisplayFor textItem: UITextItem, + animator: any UIContextMenuInteractionAnimating) { + var aDelegate: (any UITextViewDelegate)? = delegate + + if aDelegate == nil { + + if let model = textInputViewCachedInfo(textView) { + aDelegate = model.textViewDelegate + } + } + + aDelegate?.textView?(textView, textItemMenuWillDisplayFor: textItem, animator: animator) + } + + func textView(_ textView: UITextView, + textItemMenuWillEndFor textItem: UITextItem, + animator: any UIContextMenuInteractionAnimating) { + var aDelegate: (any UITextViewDelegate)? = delegate + + if aDelegate == nil { + + if let model = textInputViewCachedInfo(textView) { + aDelegate = model.textViewDelegate + } + } + + aDelegate?.textView?(textView, textItemMenuWillEndFor: textItem, animator: animator) + } +} +#endif + +#if compiler(>=6.0) // Xcode 16 +@available(iOS 18.0, *) +@available(iOSApplicationExtension, unavailable) +@MainActor +@objc public extension IQKeyboardReturnManager { + + func textViewWritingToolsWillBegin(_ textView: UITextView) { + + var aDelegate: (any UITextViewDelegate)? = delegate + + if aDelegate == nil { + + if let model: IQTextInputViewInfoModel = textInputViewCachedInfo(textView) { + aDelegate = model.textViewDelegate + } + } + + aDelegate?.textViewWritingToolsWillBegin?(textView) + } + + func textViewWritingToolsDidEnd(_ textView: UITextView) { + + var aDelegate: (any UITextViewDelegate)? = delegate + + if aDelegate == nil { + + if let model: IQTextInputViewInfoModel = textInputViewCachedInfo(textView) { + aDelegate = model.textViewDelegate + } + } + + aDelegate?.textViewWritingToolsDidEnd?(textView) + } + + func textView(_ textView: UITextView, + writingToolsIgnoredRangesInEnclosingRange enclosingRange: NSRange) -> [NSValue] { + guard delegate == nil else { return [] } + + if let textViewDelegate = textInputViewCachedInfo(textView)?.textViewDelegate { + let selector = #selector((any UITextViewDelegate).textView(_:writingToolsIgnoredRangesInEnclosingRange:)) + if textViewDelegate.responds(to: selector) { + return textViewDelegate.textView?(textView, + writingToolsIgnoredRangesInEnclosingRange: enclosingRange) ?? [] + } + } + return [] + } + + func textView(_ textView: UITextView, willBeginFormattingWith viewController: UITextFormattingViewController) { + + var aDelegate: (any UITextViewDelegate)? = delegate + + if aDelegate == nil { + + if let model: IQTextInputViewInfoModel = textInputViewCachedInfo(textView) { + aDelegate = model.textViewDelegate + } + } + + aDelegate?.textView?(textView, willBeginFormattingWith: viewController) + } + + func textView(_ textView: UITextView, didBeginFormattingWith viewController: UITextFormattingViewController) { + + var aDelegate: (any UITextViewDelegate)? = delegate + + if aDelegate == nil { + + if let model: IQTextInputViewInfoModel = textInputViewCachedInfo(textView) { + aDelegate = model.textViewDelegate + } + } + + aDelegate?.textView?(textView, didBeginFormattingWith: viewController) + } + + func textView(_ textView: UITextView, willEndFormattingWith viewController: UITextFormattingViewController) { + + var aDelegate: (any UITextViewDelegate)? = delegate + + if aDelegate == nil { + + if let model: IQTextInputViewInfoModel = textInputViewCachedInfo(textView) { + aDelegate = model.textViewDelegate + } + } + + aDelegate?.textView?(textView, willEndFormattingWith: viewController) + } + + func textView(_ textView: UITextView, didEndFormattingWith viewController: UITextFormattingViewController) { + + var aDelegate: (any UITextViewDelegate)? = delegate + + if aDelegate == nil { + + if let model: IQTextInputViewInfoModel = textInputViewCachedInfo(textView) { + aDelegate = model.textViewDelegate + } + } + + aDelegate?.textView?(textView, didEndFormattingWith: viewController) + } + +#if compiler(>=6.1) // Xcode 16.3 + @available(iOS 18.4, *) + func textView(_ textView: UITextView, insertInputSuggestion inputSuggestion: UIInputSuggestion) { + + var aDelegate: (any UITextViewDelegate)? = delegate + + if aDelegate == nil { + + if let model: IQTextInputViewInfoModel = textInputViewCachedInfo(textView) { + aDelegate = model.textViewDelegate + } + } + + aDelegate?.textView?(textView, insertInputSuggestion: inputSuggestion) + } +#endif +} +#endif + +#if compiler(>=6.2) // Xcode 26 +@available(iOS 26.0, *) +@available(iOSApplicationExtension, unavailable) +@MainActor +@objc public extension IQKeyboardReturnManager { + + func textView(_ textView: UITextView, shouldChangeTextInRanges ranges: [NSValue], replacementText text: String) -> Bool { + + var shouldChange = true + + if delegate == nil { + + if let textViewDelegate: any UITextViewDelegate = textInputViewCachedInfo(textView)?.textViewDelegate { + let selector = #selector((any UITextViewDelegate).textView(_:shouldChangeTextInRanges:replacementText:)) + if textViewDelegate.responds(to: selector) { + shouldChange = (textViewDelegate.textView?(textView, + shouldChangeTextInRanges: ranges, + replacementText: text)) ?? true + } + } + } + + if self.dismissTextViewOnReturn, text == "\n" { + goToNextResponderOrResign(from: textView) + return false + } + + return shouldChange + } + + func textView(_ textView: UITextView, editMenuForTextInRanges ranges: [NSValue], suggestedActions: [UIMenuElement]) -> UIMenu? { + + guard delegate == nil else { return nil } + + if let textViewDelegate: any UITextViewDelegate = textInputViewCachedInfo(textView)?.textViewDelegate { + + let selector = #selector((any UITextViewDelegate).textView(_:editMenuForTextInRanges:suggestedActions:)) + if textViewDelegate.responds(to: selector) { + return textViewDelegate.textView?(textView, + editMenuForTextInRanges: ranges, + suggestedActions: suggestedActions) + } + } + + return nil + } +} +#endif diff --git a/Pods/IQKeyboardReturnManager/IQKeyboardReturnManager/Classes/IQKeyboardReturnManager.swift b/Pods/IQKeyboardReturnManager/IQKeyboardReturnManager/Classes/IQKeyboardReturnManager.swift new file mode 100644 index 0000000..897b0aa --- /dev/null +++ b/Pods/IQKeyboardReturnManager/IQKeyboardReturnManager/Classes/IQKeyboardReturnManager.swift @@ -0,0 +1,278 @@ +// +// IQKeyboardReturnManager.swift +// https://github.com/hackiftekhar/IQKeyboardReturnManager +// 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: +// +// 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. + +import UIKit +import IQKeyboardCore + +/** +Manages the return key to work like next/done in a view hierarchy. +*/ +@available(iOSApplicationExtension, unavailable) +@MainActor +@objcMembers public final class IQKeyboardReturnManager: NSObject { + + // MARK: Private variables + private var textInputViewInfoCache: [IQTextInputViewInfoModel] = [] + + // MARK: Settings + + /** + Delegate of textInputView + */ + public weak var delegate: (any UITextFieldDelegate & UITextViewDelegate)? + + /** + Set the last textInputView return key type. Default is UIReturnKeyDefault. + */ + public var lastTextInputViewReturnKeyType: UIReturnKeyType = .default { + + didSet { + if let activeModel = textInputViewInfoCache.first(where: { + guard let textInputView = $0.textInputView else { + return false + } + return textInputView.isFirstResponder + }), let view: any IQTextInputView = activeModel.textInputView { + updateReturnKey(textInputView: view) + } + } + } + + public var dismissTextViewOnReturn: Bool = false + + // MARK: Initialization/De-initialization + + public override init() { + super.init() + } + + @available(*, unavailable, message: "Please use addResponderSubviews(of:recursive:)") + public init(controller: UIViewController) { + super.init() + addResponderSubviews(of: controller.view, recursive: true) + } + + deinit { + + // for model in textInputViewInfoCache { + // model.restore() + // } + + textInputViewInfoCache.removeAll() + } +} + +// MARK: Registering/Unregistering textInputView + +@available(iOSApplicationExtension, unavailable) +@MainActor +@objc public extension IQKeyboardReturnManager { + + /** + Should pass TextInputView instance. Assign textInputView delegate to self, change it's returnKeyType. + + @param textInputView TextInputView object to register. + */ + func add(textInputView: any IQTextInputView) { + + let model = IQTextInputViewInfoModel(textInputView: textInputView) + textInputViewInfoCache.append(model) + + if let view: UITextField = textInputView as? UITextField { + view.delegate = self + } else if let view: UITextView = textInputView as? UITextView { + view.delegate = self + } + } + + /** + Should pass TextInputView instance. Restore it's textInputView delegate and it's returnKeyType. + + @param textInputView TextInputView object to unregister. + */ + func remove(textInputView: any IQTextInputView) { + + guard let index: Int = textInputViewCachedInfoIndex(textInputView) else { return } + + let model = textInputViewInfoCache.remove(at: index) + model.restore() + } + + /** + Add all the TextInputView responderView's. + + @param view object to register all it's responder subviews. + */ + func addResponderSubviews(of view: UIView, recursive: Bool) { + + let textInputViews: [any IQTextInputView] = view.responderSubviews(recursive: recursive) + + for view in textInputViews { + add(textInputView: view) + } + } + + /** + Remove all the TextInputView responderView's. + + @param view object to unregister all it's responder subviews. + */ + func removeResponderSubviews(of view: UIView, recursive: Bool) { + + let textInputViews: [any IQTextInputView] = view.responderSubviews(recursive: recursive) + + for view in textInputViews { + remove(textInputView: view) + } + } +} + +@available(iOSApplicationExtension, unavailable) +@MainActor +@objc public extension IQKeyboardReturnManager { + @discardableResult + func goToNextResponderOrResign(from textInputView: any IQTextInputView) -> Bool { + + guard let textInfoCache: IQTextInputViewInfoModel = nextResponderFromTextInputView(textInputView), + let textInputView = textInfoCache.textInputView else { + textInputView.resignFirstResponder() + return true + } + + textInputView.becomeFirstResponder() + return false + } +} + +// MARK: Internal Functions +@available(iOSApplicationExtension, unavailable) +@MainActor +internal extension IQKeyboardReturnManager { + + func nextResponderFromTextInputView(_ textInputView: some IQTextInputView) -> IQTextInputViewInfoModel? { + guard let currentIndex: Int = textInputViewCachedInfoIndex(textInputView), + currentIndex < textInputViewInfoCache.count - 1 else { return nil } + + let candidates = Array(textInputViewInfoCache[currentIndex+1.. Int? { + return textInputViewInfoCache.firstIndex { + guard let inputView = $0.textInputView else { return false } + return inputView == textInputView + } + } + + func textInputViewCachedInfo(_ textInputView: some IQTextInputView) -> IQTextInputViewInfoModel? { + guard let index: Int = textInputViewCachedInfoIndex(textInputView) else { return nil } + return textInputViewInfoCache[index] + } + + func updateReturnKey(textInputView: some IQTextInputView) { + + let returnKey: UIReturnKeyType + if nextResponderFromTextInputView(textInputView) != nil { + returnKey = .next + } else { + returnKey = lastTextInputViewReturnKeyType + } + + if textInputView.returnKeyType != returnKey { + // If it's the last textInputView in responder view, else next + textInputView.returnKeyType = returnKey + textInputView.reloadInputViews() + } + } +} + +// MARK: Deprecated +// swiftlint:disable unused_setter_value +@available(iOSApplicationExtension, unavailable) +@MainActor +@objc public extension IQKeyboardReturnManager { + + @available(*, unavailable, renamed: "lastTextInputViewReturnKeyType") + var lastTextFieldReturnKeyType: UIReturnKeyType { + get { .default } + set { } + } + + @available(*, unavailable, renamed: "add(textInputView:)") + func addTextFieldView(_ textInputView: any IQTextInputView) { } + + @available(*, unavailable, renamed: "remove(textInputView:)") + func removeTextFieldView(_ textInputView: any IQTextInputView) { } + + @available(*, unavailable, renamed: "addResponderSubviews(of:recursive:)") + func addResponderFromView(_ view: UIView, recursive: Bool) { } + + @available(*, unavailable, renamed: "removeResponderSubviews(of:recursive:)") + func removeResponderFromView(_ view: UIView, recursive: Bool = true) { } +} +// swiftlint:enable unused_setter_value + +@available(iOSApplicationExtension, unavailable) +@MainActor +fileprivate extension UIView { + + func responderSubviews(recursive: Bool) -> [any IQTextInputView] { + + // Array of TextInputViews. + var textInputViews: [any IQTextInputView] = [] + for view in subviews { + + if let view = view as? IQTextInputView { + textInputViews.append(view) + } + // Sometimes there are hidden or disabled views and textInputView inside them still recorded, + // so we added some more validations here (Bug ID: #458) + // Uncommented else (Bug ID: #625) + else if recursive, !view.subviews.isEmpty { + let deepResponders = view.responderSubviews(recursive: recursive) + textInputViews.append(contentsOf: deepResponders) + } + } + + // subviews are returning in opposite order. Sorting according the frames 'y'. + return textInputViews.sorted(by: { (view1: any IQTextInputView, view2: any IQTextInputView) -> Bool in + + let frame1: CGRect = view1.convert(view1.bounds, to: self) + let frame2: CGRect = view2.convert(view2.bounds, to: self) + + if frame1.minY != frame2.minY { + return frame1.minY < frame2.minY + } else { + return frame1.minX < frame2.minX + } + }) + } +} diff --git a/Pods/IQKeyboardReturnManager/IQKeyboardReturnManager/Classes/IQTextInputViewInfoModel.swift b/Pods/IQKeyboardReturnManager/IQKeyboardReturnManager/Classes/IQTextInputViewInfoModel.swift new file mode 100644 index 0000000..c7b9099 --- /dev/null +++ b/Pods/IQKeyboardReturnManager/IQKeyboardReturnManager/Classes/IQTextInputViewInfoModel.swift @@ -0,0 +1,56 @@ +// +// IQTextInputViewInfoModel.swift +// https://github.com/hackiftekhar/IQKeyboardReturnManager +// 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: +// +// 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. + +import UIKit +import IQKeyboardCore + +@available(iOSApplicationExtension, unavailable) +@MainActor +internal final class IQTextInputViewInfoModel: NSObject { + + weak var textFieldDelegate: (any UITextFieldDelegate)? + weak var textViewDelegate: (any UITextViewDelegate)? + weak var textInputView: (any IQTextInputView)? + let originalReturnKeyType: UIReturnKeyType + + init(textInputView: any IQTextInputView) { + self.textInputView = textInputView + self.originalReturnKeyType = textInputView.returnKeyType + if let textInputView = textInputView as? UITextField { + self.textFieldDelegate = textInputView.delegate + } else if let textInputView = textInputView as? UITextView { + self.textViewDelegate = textInputView.delegate + } + + super.init() + } + + func restore() { + textInputView?.returnKeyType = originalReturnKeyType + if let textInputView = textInputView as? UITextField { + textInputView.delegate = textFieldDelegate + } else if let textInputView = textInputView as? UITextView { + textInputView.delegate = textViewDelegate + } + } +} diff --git a/Pods/IQKeyboardReturnManager/LICENSE b/Pods/IQKeyboardReturnManager/LICENSE new file mode 100644 index 0000000..5d8eb96 --- /dev/null +++ b/Pods/IQKeyboardReturnManager/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 Mohd 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: + +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. diff --git a/Pods/IQKeyboardReturnManager/README.md b/Pods/IQKeyboardReturnManager/README.md new file mode 100644 index 0000000..5524787 --- /dev/null +++ b/Pods/IQKeyboardReturnManager/README.md @@ -0,0 +1,68 @@ +# IQKeyboardReturnManager + +[![CI Status](https://img.shields.io/travis/hackiftekhar/IQKeyboardReturnManager.svg?style=flat)](https://travis-ci.org/hackiftekhar/IQKeyboardReturnManager) +[![Version](https://img.shields.io/cocoapods/v/IQKeyboardReturnManager.svg?style=flat)](https://cocoapods.org/pods/IQKeyboardReturnManager) +[![License](https://img.shields.io/cocoapods/l/IQKeyboardReturnManager.svg?style=flat)](https://cocoapods.org/pods/IQKeyboardReturnManager) +[![Platform](https://img.shields.io/cocoapods/p/IQKeyboardReturnManager.svg?style=flat)](https://cocoapods.org/pods/IQKeyboardReturnManager) + +![Screenshot](https://raw.githubusercontent.com/hackiftekhar/IQKeyboardReturnManager/master/Screenshot/IQKeyboardReturnManagerScreenshot.png) + +## Example + +To run the example project, clone the repo, and run `pod install` from the Example directory first. + +## Requirements + +## Installation + +IQKeyboardReturnManager is available through [CocoaPods](https://cocoapods.org). To install +it, simply add the following line to your Podfile: + +```ruby +pod 'IQKeyboardReturnManager' +``` + +## Usage + +To handle keyboard return key automatically:- + +```swift +import IQKeyboardReturnManager + +class ViewController: UIViewController { + + let returnManager: IQKeyboardReturnManager = .init() + + override func viewDidLoad() { + super.viewDidLoad() + + // This will add all textInputView of the controller and start observing for textFieldShouldReturn events + returnManager.addResponderSubviews(of: self.view, recursive: true) + + // If you would like to dismiss the UITextView on tapping on return then add this + returnManager.dismissTextViewOnReturn = true + + // If you would like to change last textInputView return key type to done or something else, then add this + returnManager.lastTextInputViewReturnKeyType = .done + + // If you would like to customize the navigation between textField by your own order then add them manually + returnManager.add(textInputView: textField1) + returnManager.add(textInputView: textField2) + returnManager.add(textInputView: textField3) + returnManager.add(textInputView: textField4) + } +} + +// IQKeyboardReturnManager will forward all delegate callbacks to you, so you can customize the decisions +extension ViewController: UITextFieldDelegate { + @objc public func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {...} +} +``` + +## Author + +Iftekhar Qurashi hack.iftekhar@gmail.com + +## License + +IQKeyboardReturnManager is available under the MIT license. See the LICENSE file for more info. diff --git a/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Assets/PrivacyInfo.xcprivacy b/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Assets/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..9021190 --- /dev/null +++ b/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Assets/PrivacyInfo.xcprivacy @@ -0,0 +1,14 @@ + + + + + NSPrivacyAccessedAPITypes + + NSPrivacyTrackingDomains + + NSPrivacyCollectedDataTypes + + NSPrivacyTracking + + + diff --git a/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQBarButtonItem/IQBarButtonItem.swift b/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQBarButtonItem/IQBarButtonItem.swift new file mode 100644 index 0000000..42317e8 --- /dev/null +++ b/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQBarButtonItem/IQBarButtonItem.swift @@ -0,0 +1,150 @@ +// +// IQBarButtonItem.swift +// https://github.com/hackiftekhar/IQKeyboardToolbar +// 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: +// +// 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. + +import UIKit + +@available(iOSApplicationExtension, unavailable) +@MainActor +@objcMembers open class IQBarButtonItem: UIBarButtonItem { + + internal static let flexibleBarButtonItem: IQBarButtonItem = { + let barButton = IQBarButtonItem(barButtonSystemItem: .flexibleSpace, + target: nil, action: nil) +#if compiler(>=6.2) // Xcode 26 + let requiresCompatibility: Bool = Bundle.main.object(forInfoDictionaryKey: "UIDesignRequiresCompatibility") as? Bool ?? false + if #available(iOS 26.0, *), !requiresCompatibility { + barButton.hidesSharedBackground = false + } +#endif + return barButton + }() + + /** + Fixed space bar button of toolbar. + */ + internal static let fixedSpaceBarButton: IQBarButtonItem = { + let barButton = IQBarButtonItem(barButtonSystemItem: .fixedSpace, + target: nil, action: nil) + barButton.isSystemItem = true +#if compiler(>=6.2) // Xcode 26 + let requiresCompatibility: Bool = Bundle.main.object(forInfoDictionaryKey: "UIDesignRequiresCompatibility") as? Bool ?? false + if #available(iOS 26.0, *), !requiresCompatibility { + barButton.hidesSharedBackground = false + } else { + barButton.width = 6 + } +#else + barButton.width = 6 +#endif + return barButton + }() + + + public override init() { + super.init() + initialize() + } + + public required init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + initialize() + } + + private func initialize() { + + let states: [UIControl.State] = [.normal, .highlighted, .disabled, .focused] + + for state in states { + + setBackgroundImage(UIImage(), for: state, barMetrics: .default) + setBackgroundImage(UIImage(), for: state, style: .plain, barMetrics: .default) + setBackButtonBackgroundImage(UIImage(), for: state, barMetrics: .default) + } + + setTitlePositionAdjustment(UIOffset(), for: .default) + setBackgroundVerticalPositionAdjustment(0, for: .default) + setBackButtonBackgroundVerticalPositionAdjustment(0, for: .default) + } + + override open var tintColor: UIColor? { + didSet { + + var textAttributes: [NSAttributedString.Key: Any] = [:] + textAttributes[.foregroundColor] = tintColor + + if let attributes: [NSAttributedString.Key: Any] = titleTextAttributes(for: .normal) { + for (key, value) in attributes { + textAttributes[key] = value + } + } + + setTitleTextAttributes(textAttributes, for: .normal) + } + } + + /** + Boolean to know if it's a system item or custom item, + we are having a limitation that we cannot override a designated initializer, + so we are manually setting this property once in initialization + */ + internal var isSystemItem: Bool = false + + /** + Additional target & action to do get callback action. + Note that setting custom target & selector doesn't affect native functionality, + this is just an additional target to get a callback. + + @param target Target object. + @param action Target Selector. + */ + open func setTarget(_ target: AnyObject?, action: Selector?) { + if let target: AnyObject = target, let action: Selector = action { + invocation = IQInvocation(target: target, action: action) + } else { + invocation = nil + } + } + + /** + Customized Invocation to be called when button is pressed. + invocation is internally created using setTarget:action: method. + */ + open var invocation: IQInvocation? { + didSet { + // We have to put this condition here because if we override this function then + // We were getting "Cannot override '_' which has been marked unavailable" in Xcode 15 + if let titleBarButton = self as? IQTitleBarButtonItem { + + if let target = invocation?.target, let action = invocation?.action { + titleBarButton.isEnabled = true + titleBarButton.titleButton.isEnabled = true + titleBarButton.titleButton.addTarget(target, action: action, for: .touchUpInside) + } else { + titleBarButton.isEnabled = false + titleBarButton.titleButton.isEnabled = false + titleBarButton.titleButton.removeTarget(nil, action: nil, for: .touchUpInside) + } + } + } + } +} diff --git a/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQBarButtonItem/IQBarButtonItemConfiguration.swift b/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQBarButtonItem/IQBarButtonItemConfiguration.swift new file mode 100644 index 0000000..4bb9e4f --- /dev/null +++ b/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQBarButtonItem/IQBarButtonItemConfiguration.swift @@ -0,0 +1,102 @@ +// +// IQBarButtonItemConfiguration.swift +// https://github.com/hackiftekhar/IQKeyboardToolbar +// 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: +// +// 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. + +import UIKit + +/** + IQBarButtonItemConfiguration for creating toolbar with bar button items + */ +@available(iOSApplicationExtension, unavailable) +@MainActor +@objcMembers public final class IQBarButtonItemConfiguration: NSObject { + + public init(systemItem: UIBarButtonItem.SystemItem, action: Selector? = nil) { + self.systemItem = systemItem + self.image = nil + self.title = nil + self.action = action + super.init() + } + + public init(image: UIImage, action: Selector? = nil) { + self.systemItem = nil + self.image = image + self.title = nil + self.action = action + super.init() + } + + public init(title: String, action: Selector? = nil) { + self.systemItem = nil + self.image = nil + self.title = title + self.action = action + super.init() + } + + public let systemItem: UIBarButtonItem.SystemItem? // System Item to be used to instantiate bar button. + + public let image: UIImage? // Image to show on bar button item if it's not a system item. + + public let title: String? // Title to show on bar button item if it's not a system item. + + public var action: Selector? // action for bar button item. Usually 'doneAction:(IQBarButtonItem*)item'. + + public override var accessibilityLabel: String? { didSet { } } // Accessibility related labels + + public func apply(on oldBarButtonItem: IQBarButtonItem, target: AnyObject?) -> IQBarButtonItem { + + var newBarButtonItem: IQBarButtonItem = oldBarButtonItem + + if systemItem == nil, !oldBarButtonItem.isSystemItem { + newBarButtonItem.title = title + newBarButtonItem.image = image + newBarButtonItem.target = target + newBarButtonItem.action = action + } else { + if let systemItem: UIBarButtonItem.SystemItem = systemItem { + newBarButtonItem = IQBarButtonItem(barButtonSystemItem: systemItem, target: target, action: action) + newBarButtonItem.isSystemItem = true +#if compiler(>=6.2) // Xcode 26 + let requiresCompatibility: Bool = Bundle.main.object(forInfoDictionaryKey: "UIDesignRequiresCompatibility") as? Bool ?? false + if #available(iOS 26.0, *), !requiresCompatibility { + newBarButtonItem.style = .plain + } +#endif + } else if let image: UIImage = image { + newBarButtonItem = IQBarButtonItem(image: image, style: .plain, target: target, action: action) + } else { + newBarButtonItem = IQBarButtonItem(title: title, style: .plain, target: target, action: action) + } + + newBarButtonItem.invocation = oldBarButtonItem.invocation + newBarButtonItem.isEnabled = oldBarButtonItem.isEnabled + newBarButtonItem.tag = oldBarButtonItem.tag + } + + newBarButtonItem.accessibilityLabel = accessibilityLabel + newBarButtonItem.accessibilityIdentifier = oldBarButtonItem.accessibilityLabel + + return newBarButtonItem + } +} diff --git a/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQBarButtonItem/IQInvocation.swift b/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQBarButtonItem/IQInvocation.swift new file mode 100644 index 0000000..95afb9f --- /dev/null +++ b/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQBarButtonItem/IQInvocation.swift @@ -0,0 +1,42 @@ +// +// IQInvocation.swift +// https://github.com/hackiftekhar/IQKeyboardToolbar +// 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: +// +// 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. + +import UIKit + +@available(iOSApplicationExtension, unavailable) +@MainActor +@objcMembers public final class IQInvocation: NSObject { + public weak var target: AnyObject? + public let action: Selector + + public init(target: AnyObject, action: Selector) { + self.target = target + self.action = action + } + + public func invoke(from: Any) { + + guard let target: AnyObject = target else { return } + UIApplication.shared.sendAction(action, to: target, from: from, for: UIEvent()) + } +} diff --git a/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQBarButtonItem/IQTitleBarButtonItem.swift b/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQBarButtonItem/IQTitleBarButtonItem.swift new file mode 100644 index 0000000..0ff193d --- /dev/null +++ b/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQBarButtonItem/IQTitleBarButtonItem.swift @@ -0,0 +1,166 @@ +// +// IQTitleBarButtonItem.swift +// https://github.com/hackiftekhar/IQKeyboardToolbar +// 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: +// +// 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. + +import UIKit + +@available(iOSApplicationExtension, unavailable) +@MainActor +@objcMembers open class IQTitleBarButtonItem: IQBarButtonItem { + + open var titleFont: UIFont? { + + didSet { + if let titleFont: UIFont = titleFont { + titleButton.titleLabel?.font = titleFont + } else { + titleButton.titleLabel?.font = UIFont.systemFont(ofSize: 13) + } + } + } + + override open var title: String? { + didSet { + titleButton.setTitle(title, for: .normal) + updateAccessibility() + } + } + + /** + titleColor to be used for displaying button text when displaying title (disabled state). + */ + open var titleColor: UIColor? { + + didSet { + + if let titleColor: UIColor = titleColor { + titleButton.setTitleColor(titleColor, for: .disabled) + } else { + titleButton.setTitleColor(UIColor.lightGray, for: .disabled) + } + } + } + + /** + selectableTitleColor to be used for displaying button text when button is enabled. + */ + open var selectableTitleColor: UIColor? { + + didSet { + + if let selectableTitleColor: UIColor = selectableTitleColor { + titleButton.setTitleColor(selectableTitleColor, for: .normal) + } else { + titleButton.setTitleColor(UIColor.systemBlue, for: .normal) + } + } + } + + internal let titleButton: UIButton = UIButton(type: .system) + private let _titleView: UIView = UIView() + + private override init() { + super.init() + } + + public convenience init(title: String?) { + + self.init(title: nil, style: .plain, target: nil, action: nil) + + _titleView.backgroundColor = UIColor.clear + + titleButton.isAccessibilityElement = false + titleButton.isEnabled = false + titleButton.titleLabel?.numberOfLines = 3 + titleButton.setTitleColor(UIColor.lightGray, for: .disabled) + titleButton.setTitleColor(UIColor.systemBlue, for: .normal) + titleButton.backgroundColor = UIColor.clear + titleButton.titleLabel?.textAlignment = .center + titleButton.setTitle(title, for: .normal) + titleFont = UIFont.systemFont(ofSize: 13.0) + titleButton.titleLabel?.font = self.titleFont + _titleView.addSubview(titleButton) + + let lowPriority: UILayoutPriority = UILayoutPriority(rawValue: UILayoutPriority.defaultLow.rawValue-1) + let highPriority: UILayoutPriority = UILayoutPriority(rawValue: UILayoutPriority.defaultHigh.rawValue-1) + + _titleView.translatesAutoresizingMaskIntoConstraints = false + _titleView.setContentHuggingPriority(lowPriority, for: .vertical) + _titleView.setContentHuggingPriority(lowPriority, for: .horizontal) + _titleView.setContentCompressionResistancePriority(highPriority, for: .vertical) + _titleView.setContentCompressionResistancePriority(highPriority, for: .horizontal) + + titleButton.translatesAutoresizingMaskIntoConstraints = false + titleButton.setContentHuggingPriority(lowPriority, for: .vertical) + titleButton.setContentHuggingPriority(lowPriority, for: .horizontal) + titleButton.setContentCompressionResistancePriority(highPriority, for: .vertical) + titleButton.setContentCompressionResistancePriority(highPriority, for: .horizontal) + + let top: NSLayoutConstraint = NSLayoutConstraint(item: titleButton, attribute: .top, + relatedBy: .equal, + toItem: _titleView, attribute: .top, + multiplier: 1, constant: 0) + let bottom: NSLayoutConstraint = NSLayoutConstraint(item: titleButton, attribute: .bottom, + relatedBy: .equal, + toItem: _titleView, attribute: .bottom, + multiplier: 1, constant: 0) + let leading: NSLayoutConstraint = NSLayoutConstraint(item: titleButton, attribute: .leading, + relatedBy: .equal, + toItem: _titleView, attribute: .leading, + multiplier: 1, constant: 0) + let trailing: NSLayoutConstraint = NSLayoutConstraint(item: titleButton, attribute: .trailing, + relatedBy: .equal, + toItem: _titleView, attribute: .trailing, + multiplier: 1, constant: 0) + + _titleView.addConstraints([top, bottom, leading, trailing]) + + customView = _titleView + } + + required public init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + } + + private func updateAccessibility() { + if title == nil || title?.isEmpty == true { + isAccessibilityElement = false + // Swift 6: Reference to static property 'none' + // is not concurrency-safe because it involves shared mutable state +// accessibilityTraits = .none + accessibilityTraits = .init(rawValue: 0) + } else if titleButton.isEnabled == true { + isAccessibilityElement = true + // Swift 6: Reference to static property 'button' + // is not concurrency-safe because it involves shared mutable state +// accessibilityTraits = .button + accessibilityTraits = .init(rawValue: 1) + } else { + isAccessibilityElement = true + + // Swift 6: Reference to static property 'staticText' + // is not concurrency-safe because it involves shared mutable state +// accessibilityTraits = .staticText + accessibilityTraits = .init(rawValue: 64) + } + } +} diff --git a/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQKeyboardExtension/UIView+IQKeyboardExtension.swift b/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQKeyboardExtension/UIView+IQKeyboardExtension.swift new file mode 100644 index 0000000..01a882d --- /dev/null +++ b/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQKeyboardExtension/UIView+IQKeyboardExtension.swift @@ -0,0 +1,389 @@ +// +// UIView+IQKeyboardExtension.swift +// https://github.com/hackiftekhar/IQKeyboardToolbar +// 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: +// +// 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. + +import UIKit +import IQKeyboardCore + +@available(iOSApplicationExtension, unavailable) +@MainActor +private struct AssociatedKeys { + static var toolbar: Int = 0 + static var hidePlaceholder: Int = 0 + static var placeholder: Int = 0 +} + +@available(iOSApplicationExtension, unavailable) +@MainActor +public extension IQKeyboardExtension where Base: IQTextInputView { + + // MARK: Toolbar + + /** + Toolbar references for better customization control. + */ + var toolbar: IQKeyboardToolbar { + var toolbar: IQKeyboardToolbar? = base?.inputAccessoryView as? IQKeyboardToolbar + + if toolbar == nil, let base = base { + toolbar = objc_getAssociatedObject(base, &AssociatedKeys.toolbar) as? IQKeyboardToolbar + } + + if let toolbar: IQKeyboardToolbar = toolbar { + return toolbar + } else { + + let width: CGFloat = base?.window?.windowScene?.screen.bounds.width ?? 0 + let height: CGFloat +#if compiler(>=6.2) // Xcode 26 + let requiresCompatibility: Bool = Bundle.main.object(forInfoDictionaryKey: "UIDesignRequiresCompatibility") as? Bool ?? false + if #available(iOS 26.0, *), !requiresCompatibility { + height = 58 + } else { + height = 44 + } +#else + height = 44 +#endif + + let frame = CGRect(origin: .zero, size: .init(width: width, height: height)) + let newToolbar = IQKeyboardToolbar(frame: frame) + + if let base = base { + objc_setAssociatedObject(base, &AssociatedKeys.toolbar, newToolbar, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + } + + return newToolbar + } + } + + // MARK: Toolbar title + + /** + If `hideToolbarPlaceholder` is YES, then title will not be added to the toolbar. Default to NO. + */ + var hidePlaceholder: Bool { + get { + if let base = base { + return objc_getAssociatedObject(base, &AssociatedKeys.hidePlaceholder) as? Bool ?? false + } + return false + } + set(newValue) { + if let base = base { + objc_setAssociatedObject(base, &AssociatedKeys.hidePlaceholder, + newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + toolbar.titleBarButton.title = drawingPlaceholder + } + } + } + + /** + `toolbarPlaceholder` to override default `placeholder` text when drawing text on toolbar. + */ + var placeholder: String? { + get { + if let base = base { + return objc_getAssociatedObject(base, &AssociatedKeys.placeholder) as? String + } + return nil + } + set(newValue) { + if let base = base { + // swiftlint:disable line_length + objc_setAssociatedObject(base, &AssociatedKeys.placeholder, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + toolbar.titleBarButton.title = drawingPlaceholder + // swiftlint:enable line_length + } + } + } + + /** + `drawingToolbarPlaceholder` will be actual text used to draw on toolbar. + This would either `placeholder` or `toolbarPlaceholder`. + */ + var drawingPlaceholder: String? { + + guard !hidePlaceholder else { return nil } + + if let placeholder = placeholder, + !placeholder.isEmpty { + return placeholder + } + + guard let placeholderable: any IQPlaceholderable = base as? (any IQPlaceholderable) else { return nil } + + if let placeholder = placeholderable.attributedPlaceholder?.string, + !placeholder.isEmpty { + return placeholder + } else if let placeholder = placeholderable.placeholder { + return placeholder + } else { + return nil + } + } + + // MARK: Common + + func addToolbar(target: AnyObject?, + previousConfiguration: IQBarButtonItemConfiguration? = nil, + nextConfiguration: IQBarButtonItemConfiguration? = nil, + rightConfiguration: IQBarButtonItemConfiguration? = nil, + title: String?, + titleAccessibilityLabel: String? = nil) { + guard let base = base else { return } + // Creating a toolBar for phoneNumber keyboard + let toolbar: IQKeyboardToolbar = toolbar + + let items: [UIBarButtonItem] = Self.constructBarButtonItems(target: target, toolbar: toolbar, + previousConfiguration: previousConfiguration, + nextConfiguration: nextConfiguration, + rightConfiguration: rightConfiguration, + title: title, + titleAccessibilityLabel: titleAccessibilityLabel) + + // Adding button to toolBar. + toolbar.items = items + + switch base.keyboardAppearance { + case .dark: + toolbar.barStyle = .black + default: + toolbar.barStyle = .default + } + + // Setting toolbar to keyboard. + let reloadInputViews: Bool = base.inputAccessoryView != toolbar + guard reloadInputViews else { return } + + base.inputAccessoryView = toolbar + + base.reloadInputViews() + } + + // MARK: Right + func addDone(target: AnyObject?, + action: Selector, + showPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) { + + let title: String? = showPlaceholder ? drawingPlaceholder : nil + + addDone(target: target, action: action, + title: title, titleAccessibilityLabel: titleAccessibilityLabel) + } + + func addDone(target: AnyObject?, + action: Selector, + title: String?, titleAccessibilityLabel: String? = nil) { + + let rightConfiguration: IQBarButtonItemConfiguration +#if compiler(>=6.2) // Xcode 26 + let requiresCompatibility: Bool = Bundle.main.object(forInfoDictionaryKey: "UIDesignRequiresCompatibility") as? Bool ?? false + if #available(iOS 26.0, *), !requiresCompatibility { + rightConfiguration = IQBarButtonItemConfiguration(image: UIImage(systemName: "checkmark")!, action: action) + } else { + rightConfiguration = IQBarButtonItemConfiguration(systemItem: .done, action: action) + } +#else + rightConfiguration = IQBarButtonItemConfiguration(systemItem: .done, action: action) +#endif + + addToolbar(target: target, rightConfiguration: rightConfiguration, + title: title, titleAccessibilityLabel: titleAccessibilityLabel) + } + + func addRightButton(target: AnyObject?, + configuration: IQBarButtonItemConfiguration, + showPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) { + let title: String? = showPlaceholder ? drawingPlaceholder : nil + addRightButton(target: target, configuration: configuration, title: title, + titleAccessibilityLabel: titleAccessibilityLabel) + } + + func addRightButton(target: AnyObject?, + configuration: IQBarButtonItemConfiguration, + title: String?, titleAccessibilityLabel: String? = nil) { + addToolbar(target: target, rightConfiguration: configuration, title: title, + titleAccessibilityLabel: titleAccessibilityLabel) + } + + // MARK: Right/Left + func addRightLeft(target: AnyObject?, + rightConfiguration: IQBarButtonItemConfiguration, leftConfiguration: IQBarButtonItemConfiguration, + showPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) { + let title: String? = showPlaceholder ? drawingPlaceholder : nil + addRightLeft(target: target, + rightConfiguration: rightConfiguration, leftConfiguration: leftConfiguration, + title: title, titleAccessibilityLabel: titleAccessibilityLabel) + } + + func addRightLeft(target: AnyObject?, + rightConfiguration: IQBarButtonItemConfiguration, leftConfiguration: IQBarButtonItemConfiguration, + title: String?, titleAccessibilityLabel: String? = nil) { + addToolbar(target: target, + previousConfiguration: leftConfiguration, rightConfiguration: rightConfiguration, + title: title, titleAccessibilityLabel: titleAccessibilityLabel) + } + + // MARK: Previous/Next/Right + + func addPreviousNextRight(target: AnyObject?, + previousConfiguration: IQBarButtonItemConfiguration? = nil, + nextConfiguration: IQBarButtonItemConfiguration? = nil, + rightConfiguration: IQBarButtonItemConfiguration?, + showPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) { + + let title: String? = showPlaceholder ? drawingPlaceholder : nil + addPreviousNextRight(target: target, + previousConfiguration: previousConfiguration, nextConfiguration: nextConfiguration, + rightConfiguration: rightConfiguration, + title: title, titleAccessibilityLabel: titleAccessibilityLabel) + } + + func addPreviousNextRight(target: AnyObject?, + previousConfiguration: IQBarButtonItemConfiguration? = nil, + nextConfiguration: IQBarButtonItemConfiguration? = nil, + rightConfiguration: IQBarButtonItemConfiguration?, + title: String?, titleAccessibilityLabel: String? = nil) { + + addToolbar(target: target, + previousConfiguration: previousConfiguration, nextConfiguration: nextConfiguration, + rightConfiguration: rightConfiguration, + title: title, titleAccessibilityLabel: titleAccessibilityLabel) + } + + func addPreviousNextDone(target: AnyObject?, previousAction: Selector, nextAction: Selector, doneAction: Selector, + showPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) { + let title: String? = showPlaceholder ? drawingPlaceholder : nil + addPreviousNextDone(target: target, previousAction: previousAction, nextAction: nextAction, + doneAction: doneAction, + title: title, titleAccessibilityLabel: titleAccessibilityLabel) + } + + func addPreviousNextDone(target: AnyObject?, + previousAction: Selector, nextAction: Selector, doneAction: Selector, + title: String?, titleAccessibilityLabel: String? = nil) { + + let chevronUp: UIImage = UIImage(systemName: "chevron.up") ?? UIImage() + let chevronDown: UIImage = UIImage(systemName: "chevron.down") ?? UIImage() + + let previousConfiguration = IQBarButtonItemConfiguration(image: chevronUp, + action: previousAction) + let nextConfiguration = IQBarButtonItemConfiguration(image: chevronDown, + action: nextAction) + let rightConfiguration: IQBarButtonItemConfiguration +#if compiler(>=6.2) // Xcode 26 + let requiresCompatibility: Bool = Bundle.main.object(forInfoDictionaryKey: "UIDesignRequiresCompatibility") as? Bool ?? false + if #available(iOS 26.0, *), !requiresCompatibility { + rightConfiguration = IQBarButtonItemConfiguration(image: UIImage(systemName: "checkmark")!, action: doneAction) + } else { + rightConfiguration = IQBarButtonItemConfiguration(systemItem: .done, action: doneAction) + } +#else + rightConfiguration = IQBarButtonItemConfiguration(systemItem: .done, action: doneAction) +#endif + + addToolbar(target: target, previousConfiguration: previousConfiguration, + nextConfiguration: nextConfiguration, rightConfiguration: rightConfiguration, + title: title, titleAccessibilityLabel: titleAccessibilityLabel) + } +} + +@available(iOSApplicationExtension, unavailable) +@MainActor +private extension IQKeyboardExtension where Base: IQTextInputView { + + private static func constructBarButtonItems(target: AnyObject?, + toolbar: IQKeyboardToolbar, + previousConfiguration: IQBarButtonItemConfiguration? = nil, + nextConfiguration: IQBarButtonItemConfiguration? = nil, + rightConfiguration: IQBarButtonItemConfiguration? = nil, + title: String?, + titleAccessibilityLabel: String? = nil) -> [UIBarButtonItem] { + var items: [UIBarButtonItem] = [] + + // Leading group + do { + if let previousConfiguration: IQBarButtonItemConfiguration = previousConfiguration { + let prev: IQBarButtonItem = previousConfiguration.apply(on: toolbar.previousBarButton, target: target) + toolbar.previousBarButton = prev + items.append(prev) + } + + if previousConfiguration != nil, nextConfiguration != nil { + items.append(IQBarButtonItem.fixedSpaceBarButton) + } + + if let nextConfiguration: IQBarButtonItemConfiguration = nextConfiguration { + let next: IQBarButtonItem = nextConfiguration.apply(on: toolbar.nextBarButton, target: target) + toolbar.nextBarButton = next + items.append(next) + } + + if !toolbar.additionalLeadingItems.isEmpty { + items.append(contentsOf: toolbar.additionalLeadingItems) + } + } + + // Center Title bar button item + if let title = title, !title.isEmpty { + // Title button + toolbar.titleBarButton.title = title + toolbar.titleBarButton.accessibilityLabel = titleAccessibilityLabel + toolbar.titleBarButton.accessibilityIdentifier = titleAccessibilityLabel + toolbar.titleBarButton.customView?.frame = .zero + +#if compiler(>=6.2) // Xcode 26 + let requiresCompatibility: Bool = Bundle.main.object(forInfoDictionaryKey: "UIDesignRequiresCompatibility") as? Bool ?? false + if #available(iOS 26.0, *), !requiresCompatibility { + if !items.isEmpty { + items.append(IQBarButtonItem.flexibleBarButtonItem) + } + } else { + items.append(IQBarButtonItem.flexibleBarButtonItem) + } +#else + items.append(IQBarButtonItem.flexibleBarButtonItem) +#endif + items.append(toolbar.titleBarButton) + } + + // Flexible space + items.append(IQBarButtonItem.flexibleBarButtonItem) + + // Trailing group + do { + if !toolbar.additionalTrailingItems.isEmpty { + items.append(contentsOf: toolbar.additionalTrailingItems) + } + + if let rightConfiguration: IQBarButtonItemConfiguration = rightConfiguration { + + let done: IQBarButtonItem = rightConfiguration.apply(on: toolbar.doneBarButton, target: target) + toolbar.doneBarButton = done + items.append(done) + } + } + + return items + } +} diff --git a/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQKeyboardExtension/UIView+IQKeyboardExtensionDeprecated.swift b/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQKeyboardExtension/UIView+IQKeyboardExtensionDeprecated.swift new file mode 100644 index 0000000..c3be1a4 --- /dev/null +++ b/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQKeyboardExtension/UIView+IQKeyboardExtensionDeprecated.swift @@ -0,0 +1,228 @@ +// +// UIView+IQKeyboardExtensionDeprecated.swift +// https://github.com/hackiftekhar/IQKeyboardToolbar +// 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: +// +// 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. + +import UIKit + +// swiftlint:disable unused_setter_value +// swiftlint:disable line_length +// swiftlint:disable function_parameter_count +@available(iOSApplicationExtension, unavailable) +@MainActor +@objc public extension UIView { + + @available(*, unavailable, renamed: "iq.toolbar") + var keyboardToolbar: IQKeyboardToolbar { + get { fatalError() } + set {} + } + + @available(*, unavailable, renamed: "iq.hidePlaceholder") + var shouldHideToolbarPlaceholder: Bool { + get { false } + set {} + } + + @available(*, unavailable, renamed: "iq.placeholder") + var toolbarPlaceholder: String? { + get { nil } + set {} + } + + @available(*, unavailable, renamed: "iq.drawingPlaceholder") + var drawingToolbarPlaceholder: String? { + get { nil } + set {} + } + + @available(*, unavailable, renamed: "iq.addToolbar(target:previousConfiguration:nextConfiguration:rightConfiguration:title:titleAccessibilityLabel:)") + func addKeyboardToolbarWithTarget(target: AnyObject?, + titleText: String?, + titleAccessibilityLabel: String? = nil, + rightBarButtonConfiguration: IQBarButtonItemConfiguration?, + previousBarButtonConfiguration: IQBarButtonItemConfiguration? = nil, + nextBarButtonConfiguration: IQBarButtonItemConfiguration? = nil) { + } + + @available(*, unavailable, renamed: "iq.addDone(target:action:showPlaceholder:titleAccessibilityLabel:)") + func addDoneOnKeyboardWithTarget(_ target: AnyObject?, + action: Selector, + shouldShowPlaceholder: Bool = false, + titleAccessibilityLabel: String? = nil) { + } + + @available(*, unavailable, renamed: "iq.addDone(target:action:title:titleAccessibilityLabel:)") + func addDoneOnKeyboardWithTarget(_ target: AnyObject?, + action: Selector, + titleText: String?, + titleAccessibilityLabel: String? = nil) { + } + + @available(*, unavailable, renamed: "iq.addRightButton(target:configuration:showPlaceholder:titleAccessibilityLabel:)") + func addRightButtonOnKeyboardWithImage(_ image: UIImage, + target: AnyObject?, + action: Selector, + shouldShowPlaceholder: Bool = false, + titleAccessibilityLabel: String? = nil) { + } + + @available(*, unavailable, renamed: "iq.addRightButton(target:configuration:title:titleAccessibilityLabel:)") + func addRightButtonOnKeyboardWithImage(_ image: UIImage, + target: AnyObject?, + action: Selector, + titleText: String?, + titleAccessibilityLabel: String? = nil) { + } + + @available(*, unavailable, renamed: "iq.addRightButton(target:configuration:showPlaceholder:titleAccessibilityLabel:)") + func addRightButtonOnKeyboardWithText(_ text: String, + target: AnyObject?, + action: Selector, + shouldShowPlaceholder: Bool = false, + titleAccessibilityLabel: String? = nil) { + } + + @available(*, unavailable, renamed: "iq.addRightButton(target:configuration:title:titleAccessibilityLabel:)") + func addRightButtonOnKeyboardWithText(_ text: String, + target: AnyObject?, + action: Selector, + titleText: String?, + titleAccessibilityLabel: String? = nil) { + } + + @available(*, unavailable, renamed: "iq.addRightLeft(target:rightConfiguration:leftConfiguration:showPlaceholder:titleAccessibilityLabel:)") + func addCancelDoneOnKeyboardWithTarget(_ target: AnyObject?, + cancelAction: Selector, + doneAction: Selector, + shouldShowPlaceholder: Bool = false, + titleAccessibilityLabel: String? = nil) { + } + + @available(*, unavailable, renamed: "iq.addRightLeft(target:rightConfiguration:leftConfiguration:showPlaceholder:titleAccessibilityLabel:)") + func addRightLeftOnKeyboardWithTarget(_ target: AnyObject?, + leftButtonTitle: String, + rightButtonTitle: String, + leftButtonAction: Selector, + rightButtonAction: Selector, + shouldShowPlaceholder: Bool = false, + titleAccessibilityLabel: String? = nil) { + } + + @available(*, unavailable, renamed: "iq.addRightLeft(target:rightConfiguration:leftConfiguration:showPlaceholder:titleAccessibilityLabel:)") + func addRightLeftOnKeyboardWithTarget(_ target: AnyObject?, + leftButtonImage: UIImage, + rightButtonImage: UIImage, + leftButtonAction: Selector, + rightButtonAction: Selector, + shouldShowPlaceholder: Bool = false, + titleAccessibilityLabel: String? = nil) { + } + + @available(*, unavailable, renamed: "iq.addRightLeft(target:rightConfiguration:leftConfiguration:title:titleAccessibilityLabel:)") + func addCancelDoneOnKeyboardWithTarget(_ target: AnyObject?, + cancelAction: Selector, + doneAction: Selector, + titleText: String?, + titleAccessibilityLabel: String? = nil) { + } + + @available(*, unavailable, renamed: "iq.addRightLeft(target:rightConfiguration:leftConfiguration:title:titleAccessibilityLabel:)") + func addRightLeftOnKeyboardWithTarget(_ target: AnyObject?, + leftButtonTitle: String, + rightButtonTitle: String, + leftButtonAction: Selector, + rightButtonAction: Selector, + titleText: String?, + titleAccessibilityLabel: String? = nil) { + } + + @available(*, unavailable, renamed: "iq.addRightLeft(target:rightConfiguration:leftConfiguration:title:titleAccessibilityLabel:)") + func addRightLeftOnKeyboardWithTarget(_ target: AnyObject?, + leftButtonImage: UIImage, + rightButtonImage: UIImage, + leftButtonAction: Selector, + rightButtonAction: Selector, + titleText: String?, + titleAccessibilityLabel: String? = nil) { + } + + @available(*, unavailable, renamed: "iq.addPreviousNextDone(target:previousAction:nextAction:doneAction:showPlaceholder:titleAccessibilityLabel:)") + func addPreviousNextDone(_ target: AnyObject?, + previousAction: Selector, + nextAction: Selector, + doneAction: Selector, + shouldShowPlaceholder: Bool = false, + titleAccessibilityLabel: String? = nil) { + } + + @available(*, unavailable, renamed: "iq.addPreviousNextDone(target:previousAction:nextAction:doneAction:title:titleAccessibilityLabel:)") + func addPreviousNextDoneOnKeyboardWithTarget(_ target: AnyObject?, + previousAction: Selector, + nextAction: Selector, + doneAction: Selector, + titleText: String?, + titleAccessibilityLabel: String? = nil) { + } + + @available(*, unavailable, renamed: "iq.addPreviousNextRight(target:previousConfiguration:nextConfiguration:rightConfiguration:showPlaceholder:titleAccessibilityLabel:)") + func addPreviousNextRightOnKeyboardWithTarget(_ target: AnyObject?, + rightButtonImage: UIImage, + previousAction: Selector, + nextAction: Selector, + rightButtonAction: Selector, + shouldShowPlaceholder: Bool = false, + titleAccessibilityLabel: String? = nil) { + } + + @available(*, unavailable, renamed: "iq.addPreviousNextRight(target:previousConfiguration:nextConfiguration:rightConfiguration:showPlaceholder:titleAccessibilityLabel:)") + func addPreviousNextRightOnKeyboardWithTarget(_ target: AnyObject?, + rightButtonTitle: String, + previousAction: Selector, + nextAction: Selector, + rightButtonAction: Selector, + shouldShowPlaceholder: Bool = false, + titleAccessibilityLabel: String? = nil) { + } + + @available(*, unavailable, renamed: "iq.addPreviousNextRight(target:previousConfiguration:nextConfiguration:rightConfiguration:title:titleAccessibilityLabel:)") + func addPreviousNextRightOnKeyboardWithTarget(_ target: AnyObject?, + rightButtonImage: UIImage, + previousAction: Selector, + nextAction: Selector, + rightButtonAction: Selector, + titleText: String?, + titleAccessibilityLabel: String? = nil) { + } + + @available(*, unavailable, renamed: "iq.addPreviousNextRight(target:previousConfiguration:nextConfiguration:rightConfiguration:title:titleAccessibilityLabel:)") + func addPreviousNextRightOnKeyboardWithTarget(_ target: AnyObject?, + rightButtonTitle: String, + previousAction: Selector, + nextAction: Selector, + rightButtonAction: Selector, + titleText: String?, + titleAccessibilityLabel: String? = nil) { + } +} +// swiftlint:enable unused_setter_value +// swiftlint:enable line_length +// swiftlint:enable function_parameter_count diff --git a/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQKeyboardExtension/UIView+IQKeyboardExtensionObjc.swift b/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQKeyboardExtension/UIView+IQKeyboardExtensionObjc.swift new file mode 100644 index 0000000..2dbcdbe --- /dev/null +++ b/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQKeyboardExtension/UIView+IQKeyboardExtensionObjc.swift @@ -0,0 +1,254 @@ +// +// UIView+IQKeyboardExtensionObjc.swift +// https://github.com/hackiftekhar/IQKeyboardToolbar +// 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: +// +// 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. + +import UIKit + +// MARK: For ObjectiveC Compatibility + +// swiftlint:disable identifier_name +@objc public extension UITextField { + + var iq_toolbar: IQKeyboardToolbar { iq.toolbar } + + var iq_hidePlaceholder: Bool { + get { iq.hidePlaceholder } + set(newValue) { iq.hidePlaceholder = newValue } + } + + var iq_placeholder: String? { + get { iq.placeholder } + set(newValue) { iq.placeholder = newValue } + } + + var iq_drawingPlaceholder: String? { iq.drawingPlaceholder } + + func iq_addToolbar(target: AnyObject?, + previousConfiguration: IQBarButtonItemConfiguration? = nil, + nextConfiguration: IQBarButtonItemConfiguration? = nil, + rightConfiguration: IQBarButtonItemConfiguration? = nil, + title: String?, + titleAccessibilityLabel: String? = nil) { + iq.addToolbar(target: target, previousConfiguration: previousConfiguration, + nextConfiguration: nextConfiguration, + rightConfiguration: rightConfiguration, + title: title, titleAccessibilityLabel: titleAccessibilityLabel) + } + + func iq_addDone(target: AnyObject?, + action: Selector, + showPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) { + iq.addDone(target: target, action: action, showPlaceholder: showPlaceholder, + titleAccessibilityLabel: titleAccessibilityLabel) + } + + func iq_addDone(target: AnyObject?, + action: Selector, + title: String?, titleAccessibilityLabel: String? = nil) { + iq.addDone(target: target, action: action, title: title, titleAccessibilityLabel: titleAccessibilityLabel) + } + + func iq_addRightButton(target: AnyObject?, + configuration: IQBarButtonItemConfiguration, + showPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) { + iq.addRightButton(target: target, configuration: configuration, showPlaceholder: showPlaceholder, + titleAccessibilityLabel: titleAccessibilityLabel) + } + + func iq_addRightButton(target: AnyObject?, + configuration: IQBarButtonItemConfiguration, + title: String?, titleAccessibilityLabel: String? = nil) { + iq.addRightButton(target: target, configuration: configuration, title: title, + titleAccessibilityLabel: titleAccessibilityLabel) + } + + func iq_addRightLeft(target: AnyObject?, + rightConfiguration: IQBarButtonItemConfiguration, + leftConfiguration: IQBarButtonItemConfiguration, + showPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) { + iq.addRightLeft(target: target, rightConfiguration: rightConfiguration, + leftConfiguration: leftConfiguration, showPlaceholder: showPlaceholder, + titleAccessibilityLabel: titleAccessibilityLabel) + } + + func iq_addRightLeft(target: AnyObject?, + rightConfiguration: IQBarButtonItemConfiguration, + leftConfiguration: IQBarButtonItemConfiguration, + title: String?, titleAccessibilityLabel: String? = nil) { + iq.addRightLeft(target: target, rightConfiguration: rightConfiguration, + leftConfiguration: leftConfiguration, title: title, + titleAccessibilityLabel: titleAccessibilityLabel) + } + + func iq_addPreviousNextRight(target: AnyObject?, + previousConfiguration: IQBarButtonItemConfiguration? = nil, + nextConfiguration: IQBarButtonItemConfiguration? = nil, + rightConfiguration: IQBarButtonItemConfiguration?, + showPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) { + iq.addPreviousNextRight(target: target, previousConfiguration: previousConfiguration, + nextConfiguration: nextConfiguration, rightConfiguration: rightConfiguration, + showPlaceholder: showPlaceholder, titleAccessibilityLabel: titleAccessibilityLabel) + } + + func iq_addPreviousNextRight(target: AnyObject?, + previousConfiguration: IQBarButtonItemConfiguration? = nil, + nextConfiguration: IQBarButtonItemConfiguration? = nil, + rightConfiguration: IQBarButtonItemConfiguration?, + title: String?, titleAccessibilityLabel: String? = nil) { + iq.addPreviousNextRight(target: target, previousConfiguration: previousConfiguration, + nextConfiguration: nextConfiguration, + rightConfiguration: rightConfiguration, + title: title, titleAccessibilityLabel: titleAccessibilityLabel) + } + + func iq_addPreviousNextDone(target: AnyObject?, previousAction: Selector, + nextAction: Selector, doneAction: Selector, + showPlaceholder: Bool = false, + titleAccessibilityLabel: String? = nil) { + iq.addPreviousNextDone(target: target, previousAction: previousAction, + nextAction: nextAction, doneAction: doneAction, + showPlaceholder: showPlaceholder, + titleAccessibilityLabel: titleAccessibilityLabel) + } + + func iq_addPreviousNextDone(target: AnyObject?, + previousAction: Selector, nextAction: Selector, doneAction: Selector, + title: String?, titleAccessibilityLabel: String? = nil) { + iq.addPreviousNextDone(target: target, previousAction: previousAction, + nextAction: nextAction, doneAction: doneAction, + title: title, titleAccessibilityLabel: titleAccessibilityLabel) + } +} + +@objc public extension UITextView { + + var iq_toolbar: IQKeyboardToolbar { iq.toolbar } + + var iq_hidePlaceholder: Bool { + get { iq.hidePlaceholder } + set(newValue) { iq.hidePlaceholder = newValue } + } + + var iq_placeholder: String? { + get { iq.placeholder } + set(newValue) { iq.placeholder = newValue } + } + + var iq_drawingPlaceholder: String? { iq.drawingPlaceholder } + + func iq_addToolbar(target: AnyObject?, + previousConfiguration: IQBarButtonItemConfiguration? = nil, + nextConfiguration: IQBarButtonItemConfiguration? = nil, + rightConfiguration: IQBarButtonItemConfiguration? = nil, + title: String?, + titleAccessibilityLabel: String? = nil) { + iq.addToolbar(target: target, previousConfiguration: previousConfiguration, + nextConfiguration: nextConfiguration, rightConfiguration: rightConfiguration, + title: title, titleAccessibilityLabel: titleAccessibilityLabel) + } + + func iq_addDone(target: AnyObject?, + action: Selector, + showPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) { + iq.addDone(target: target, action: action, showPlaceholder: showPlaceholder, + titleAccessibilityLabel: titleAccessibilityLabel) + } + + func iq_addDone(target: AnyObject?, + action: Selector, + title: String?, titleAccessibilityLabel: String? = nil) { + iq.addDone(target: target, action: action, title: title, + titleAccessibilityLabel: titleAccessibilityLabel) + } + + func iq_addRightButton(target: AnyObject?, + configuration: IQBarButtonItemConfiguration, + showPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) { + iq.addRightButton(target: target, configuration: configuration, + showPlaceholder: showPlaceholder, titleAccessibilityLabel: titleAccessibilityLabel) + } + + func iq_addRightButton(target: AnyObject?, + configuration: IQBarButtonItemConfiguration, + title: String?, titleAccessibilityLabel: String? = nil) { + iq.addRightButton(target: target, configuration: configuration, + title: title, titleAccessibilityLabel: titleAccessibilityLabel) + } + + func iq_addRightLeft(target: AnyObject?, + rightConfiguration: IQBarButtonItemConfiguration, + leftConfiguration: IQBarButtonItemConfiguration, + showPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) { + iq.addRightLeft(target: target, rightConfiguration: rightConfiguration, + leftConfiguration: leftConfiguration, showPlaceholder: showPlaceholder, + titleAccessibilityLabel: titleAccessibilityLabel) + } + + func iq_addRightLeft(target: AnyObject?, + rightConfiguration: IQBarButtonItemConfiguration, + leftConfiguration: IQBarButtonItemConfiguration, + title: String?, titleAccessibilityLabel: String? = nil) { + iq.addRightLeft(target: target, rightConfiguration: rightConfiguration, + leftConfiguration: leftConfiguration, title: title, + titleAccessibilityLabel: titleAccessibilityLabel) + } + + func iq_addPreviousNextRight(target: AnyObject?, + previousConfiguration: IQBarButtonItemConfiguration? = nil, + nextConfiguration: IQBarButtonItemConfiguration? = nil, + rightConfiguration: IQBarButtonItemConfiguration?, + showPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) { + iq.addPreviousNextRight(target: target, previousConfiguration: previousConfiguration, + nextConfiguration: nextConfiguration, rightConfiguration: rightConfiguration, + showPlaceholder: showPlaceholder, titleAccessibilityLabel: titleAccessibilityLabel) + } + + func iq_addPreviousNextRight(target: AnyObject?, + previousConfiguration: IQBarButtonItemConfiguration? = nil, + nextConfiguration: IQBarButtonItemConfiguration? = nil, + rightConfiguration: IQBarButtonItemConfiguration?, + title: String?, titleAccessibilityLabel: String? = nil) { + iq.addPreviousNextRight(target: target, previousConfiguration: previousConfiguration, + nextConfiguration: nextConfiguration, + rightConfiguration: rightConfiguration, + title: title, titleAccessibilityLabel: titleAccessibilityLabel) + } + + func iq_addPreviousNextDone(target: AnyObject?, previousAction: Selector, nextAction: Selector, + doneAction: Selector, showPlaceholder: Bool = false, + titleAccessibilityLabel: String? = nil) { + iq.addPreviousNextDone(target: target, previousAction: previousAction, + nextAction: nextAction, + doneAction: doneAction, showPlaceholder: showPlaceholder, + titleAccessibilityLabel: titleAccessibilityLabel) + } + + func iq_addPreviousNextDone(target: AnyObject?, + previousAction: Selector, nextAction: Selector, doneAction: Selector, + title: String?, titleAccessibilityLabel: String? = nil) { + iq.addPreviousNextDone(target: target, previousAction: previousAction, + nextAction: nextAction, + doneAction: doneAction, title: title, + titleAccessibilityLabel: titleAccessibilityLabel) + } +} +// swiftlint:enable identifier_name diff --git a/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQKeyboardToolbar.swift b/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQKeyboardToolbar.swift new file mode 100644 index 0000000..ff225bc --- /dev/null +++ b/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQKeyboardToolbar.swift @@ -0,0 +1,183 @@ +// +// IQKeyboardToolbar.swift +// https://github.com/hackiftekhar/IQKeyboardToolbar +// 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: +// +// 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. + +import UIKit + +/** @abstract IQKeyboardToolbar. */ +@available(iOSApplicationExtension, unavailable) +@MainActor +@objcMembers open class IQKeyboardToolbar: UIToolbar { + + override public init(frame: CGRect) { + super.init(frame: frame) + + initialize() + } + + required public init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + + initialize() + } + + private func initialize() { + + sizeToFit() + + autoresizingMask = .flexibleWidth + self.isTranslucent = true + self.barTintColor = nil + + let positions: [UIBarPosition] = [.any, .bottom, .top, .topAttached] + + for position in positions { + + self.setBackgroundImage(nil, forToolbarPosition: position, barMetrics: .default) + self.setShadowImage(nil, forToolbarPosition: .any) + } + + // Background color + self.backgroundColor = nil + } + + /** + Additional bar buttons to show at the leading side. + */ + open var additionalLeadingItems: [UIBarButtonItem] = [] + + /** + Additional bar buttons to show at the trailing side. + */ + open var additionalTrailingItems: [UIBarButtonItem] = [] + + /** + Previous bar button of toolbar. + */ + private var privatePreviousBarButton: IQBarButtonItem? + open var previousBarButton: IQBarButtonItem { + get { + if privatePreviousBarButton == nil { + privatePreviousBarButton = IQBarButtonItem(image: nil, style: .plain, target: nil, action: nil) + } + return privatePreviousBarButton! + } + + set (newValue) { + privatePreviousBarButton = newValue + } + } + + /** + Next bar button of toolbar. + */ + private var privateNextBarButton: IQBarButtonItem? + open var nextBarButton: IQBarButtonItem { + get { + if privateNextBarButton == nil { + privateNextBarButton = IQBarButtonItem(image: nil, style: .plain, target: nil, action: nil) + } + return privateNextBarButton! + } + + set (newValue) { + privateNextBarButton = newValue + } + } + + /** + Title bar button of toolbar. + */ + private var privateTitleBarButton: IQTitleBarButtonItem? + open var titleBarButton: IQTitleBarButtonItem { + get { + if privateTitleBarButton == nil { + privateTitleBarButton = IQTitleBarButtonItem(title: nil) + } + return privateTitleBarButton! + } + + set (newValue) { + privateTitleBarButton = newValue + } + } + + /** + Done bar button of toolbar. + */ + private var privateDoneBarButton: IQBarButtonItem? + open var doneBarButton: IQBarButtonItem { + get { + if privateDoneBarButton == nil { + privateDoneBarButton = IQBarButtonItem(title: nil, style: .done, target: nil, action: nil) +#if compiler(>=6.2) // Xcode 26 + let requiresCompatibility: Bool = Bundle.main.object(forInfoDictionaryKey: "UIDesignRequiresCompatibility") as? Bool ?? false + if #available(iOS 26.0, *), !requiresCompatibility { + privateDoneBarButton?.style = .plain + } +#endif + } + return privateDoneBarButton! + } + + set (newValue) { + privateDoneBarButton = newValue + } + } + + override open func sizeThatFits(_ size: CGSize) -> CGSize { + var sizeThatFit: CGSize = super.sizeThatFits(size) + let height: CGFloat +#if compiler(>=6.2) // Xcode 26 + let requiresCompatibility: Bool = Bundle.main.object(forInfoDictionaryKey: "UIDesignRequiresCompatibility") as? Bool ?? false + if #available(iOS 26.0, *), !requiresCompatibility { + height = 58 + } else { + height = 44 + } +#else + height = 44 +#endif + sizeThatFit.height = height + + return sizeThatFit + } + + override open var tintColor: UIColor! { + + didSet { + guard let items: [UIBarButtonItem] = items else { return } + for item in items { + item.tintColor = tintColor + } + } + } +} + +@available(iOSApplicationExtension, unavailable) +@MainActor +@objc extension IQKeyboardToolbar: UIInputViewAudioFeedback { + + open var enableInputClicksWhenVisible: Bool { + return true + } +} diff --git a/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/Placeholder/IQKeyboardToolbarPlaceholderConfiguration.swift b/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/Placeholder/IQKeyboardToolbarPlaceholderConfiguration.swift new file mode 100644 index 0000000..9f543e5 --- /dev/null +++ b/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/Placeholder/IQKeyboardToolbarPlaceholderConfiguration.swift @@ -0,0 +1,60 @@ +// +// IQKeyboardToolbarPlaceholderConfiguration.swift +// https://github.com/hackiftekhar/IQKeyboardToolbar +// 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: +// +// 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. + +import UIKit + +// swiftlint:disable type_name +@available(iOSApplicationExtension, unavailable) +@MainActor +@objcMembers public final class IQKeyboardToolbarPlaceholderConfiguration: NSObject { + + /** + If YES, then it add the textInputView's placeholder text on toolbar. Default is YES. + */ + public var showPlaceholder: Bool = true + + /** + Placeholder Font. Default is nil. + */ + public var font: UIFont? + + /** + Placeholder Color. Default is nil. Which means lightGray + */ + public var color: UIColor? + + /** + Placeholder Button Color when it's treated as button. Default is nil. + */ + public var buttonColor: UIColor? + + /** + Placeholder accessibility Label + */ + public override var accessibilityLabel: String? { didSet { } } +} +// swiftlint:enable type_name + +@available(*, unavailable, renamed: "IQKeyboardToolbarPlaceholderConfiguration") +@MainActor +@objcMembers public final class IQToolbarPlaceholderConfiguration: NSObject {} diff --git a/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Placeholderable/IQPlaceholderable.swift b/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Placeholderable/IQPlaceholderable.swift new file mode 100644 index 0000000..f0ceea2 --- /dev/null +++ b/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Placeholderable/IQPlaceholderable.swift @@ -0,0 +1,37 @@ +// +// IQPlaceholderable.swift +// https://github.com/hackiftekhar/IQKeyboardToolbar +// 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: +// +// 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. + +import Foundation +import UIKit + +@available(iOSApplicationExtension, unavailable) +@MainActor +@objc public protocol IQPlaceholderable: AnyObject { + + var placeholder: String? { get set } + var attributedPlaceholder: NSAttributedString? { get set } +} + +@available(iOSApplicationExtension, unavailable) +@MainActor +@objc extension UITextField: IQPlaceholderable { } diff --git a/Pods/IQKeyboardToolbar/LICENSE b/Pods/IQKeyboardToolbar/LICENSE new file mode 100644 index 0000000..5d8eb96 --- /dev/null +++ b/Pods/IQKeyboardToolbar/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 Mohd 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: + +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. diff --git a/Pods/IQKeyboardToolbar/README.md b/Pods/IQKeyboardToolbar/README.md new file mode 100644 index 0000000..3b60eb8 --- /dev/null +++ b/Pods/IQKeyboardToolbar/README.md @@ -0,0 +1,85 @@ +# IQKeyboardToolbar + +[![CI Status](https://img.shields.io/travis/hackiftekhar/IQKeyboardToolbar.svg?style=flat)](https://travis-ci.org/hackiftekhar/IQKeyboardToolbar) +[![Version](https://img.shields.io/cocoapods/v/IQKeyboardToolbar.svg?style=flat)](https://cocoapods.org/pods/IQKeyboardToolbar) +[![License](https://img.shields.io/cocoapods/l/IQKeyboardToolbar.svg?style=flat)](https://cocoapods.org/pods/IQKeyboardToolbar) +[![Platform](https://img.shields.io/cocoapods/p/IQKeyboardToolbar.svg?style=flat)](https://cocoapods.org/pods/IQKeyboardToolbar) + +![Screenshot1](https://raw.githubusercontent.com/hackiftekhar/IQKeyboardToolbar/master/Screenshot/IQKeyboardToolbarScreenshot.png) +![Screenshot2](https://raw.githubusercontent.com/hackiftekhar/IQKeyboardToolbar/master/Screenshot/IQKeyboardToolbarScreenshot2.png) +![Screenshot3](https://raw.githubusercontent.com/hackiftekhar/IQKeyboardToolbar/master/Screenshot/IQKeyboardToolbarScreenshot3.png) +![Screenshot4](https://raw.githubusercontent.com/hackiftekhar/IQKeyboardToolbar/master/Screenshot/IQKeyboardToolbarScreenshot4.png) + +## Example + +To run the example project, clone the repo, and run `pod install` from the Example directory first. + +## Requirements + +## Installation + +IQKeyboardToolbar is available through [CocoaPods](https://cocoapods.org). To install +it, simply add the following line to your Podfile: + +```ruby +pod 'IQKeyboardToolbar' +``` + +## Usage + +This library can be used to add toolbar to the keyboard + +Previous Next and Done button +```swift + textField.iq.addPreviousNextDone(target: self, + previousAction: #selector(textField1PreviousAction), + nextAction: #selector(textField1NextAction), + doneAction: #selector(doneAction), showPlaceholder: true) +``` + +Previous Next and Right button with customized titles or images +```swift + textField.iq.addPreviousNextRight(target: self, + previousConfiguration: .init(title: "Prev", action: #selector(textView1PreviousAction)), + nextConfiguration: .init(title: "Next", action: #selector(textView1NextAction)), + rightConfiguration: .init(image: UIImage(systemName: "chevron.down")!, action: #selector(doneAction)), + title: "Text View 1") +``` + +Action button +```swift + textField.iq.addDone(target: self, + action: #selector(doneAction), + title: "Select Account") + textField.iq.toolbar.titleBarButton.setTarget(self, + action: #selector(selectAccount)) +``` + +Additional leading and trailing buttons +```swift + textField.iq.toolbar.additionalLeadingItems = [.init(barButtonSystemItem: .add, target: self, action: #selector(addAction))] + textField.iq.toolbar.additionalTrailingItems = [.init(barButtonSystemItem: .camera, target: self, action: #selector(cameraAction))] + textField.iq.addToolbar(target: self, + previousConfiguration: nil, + nextConfiguration: .init(title: "Next", action: #selector(doneAction)), + rightConfiguration: .init(title: "Finish", action: #selector(doneAction)), + title: "TextView 2") +``` + +Hide Placeholder +```swift + textField1.iq.hidePlaceholder = true +``` + +Customized Placeholder +```swift + textField1.iq.placeholder = "My Own Placeholder" +``` + +## Author + +Iftekhar Qurashi hack.iftekhar@gmail.com + +## License + +IQKeyboardToolbar is available under the MIT license. See the LICENSE file for more info. diff --git a/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Assets/PrivacyInfo.xcprivacy b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Assets/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..9021190 --- /dev/null +++ b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Assets/PrivacyInfo.xcprivacy @@ -0,0 +1,14 @@ + + + + + NSPrivacyAccessedAPITypes + + NSPrivacyTrackingDomains + + NSPrivacyCollectedDataTypes + + NSPrivacyTracking + + + diff --git a/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/Configuration/IQKeyboardToolbarConfiguration.swift b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/Configuration/IQKeyboardToolbarConfiguration.swift new file mode 100644 index 0000000..efebfb9 --- /dev/null +++ b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/Configuration/IQKeyboardToolbarConfiguration.swift @@ -0,0 +1,90 @@ +// +// IQKeyboardToolbarConfiguration.swift +// https://github.com/hackiftekhar/IQKeyboardToolbarManager +// 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: +// +// 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. + +import UIKit +import IQKeyboardToolbar + +@available(iOSApplicationExtension, unavailable) +@MainActor +@objcMembers public final class IQKeyboardToolbarConfiguration: NSObject { + + /** + If YES, then uses textInputView's tintColor property, + otherwise tint color is default. Default is NO. + */ + public var useTextInputViewTintColor: Bool = false + + /** + This is used for toolbar.tintColor when textInputView.keyboardAppearance is UIKeyboardAppearanceDefault. + If useTextInputViewTintColor is YES then this property is ignored. Default is nil and uses black color. + */ + public var tintColor: UIColor? + + /** + This is used for toolbar.barTintColor. Default is nil. + */ + public var barTintColor: UIColor? + + /** + IQPreviousNextDisplayModeDefault: Show NextPrevious when there are more than 1 textInputView otherwise hide. + IQPreviousNextDisplayModeAlwaysHide: Do not show NextPrevious buttons in any case. + IQPreviousNextDisplayModeAlwaysShow: Always show nextPrevious buttons, + if there are more than 1 textInputView then both buttons will be visible but will be shown as disabled. + */ + public var previousNextDisplayMode: IQPreviousNextDisplayMode = .default + + /** + /** + IQAutoToolbarBySubviews: Creates Toolbar according to subview's hierarchy of TextInputView's in view. + IQAutoToolbarByTag: Creates Toolbar according to tag property of TextInputView's. + IQAutoToolbarByPosition: Creates Toolbar according to the y,x position + of textInputView in it's superview coordinate. + + Default is IQAutoToolbarBySubviews. + */ + AutoToolbar managing behavior. Default is IQAutoToolbarBySubviews. + */ + public var manageBehavior: IQKeyboardToolbarManageBehavior = .bySubviews + + /** + Buttons configuration displayed on the toolbar, the selector parameter is ignored in below configuration + */ + public var previousBarButtonConfiguration: IQBarButtonItemConfiguration? + public var nextBarButtonConfiguration: IQBarButtonItemConfiguration? + public var doneBarButtonConfiguration: IQBarButtonItemConfiguration? + + public let placeholderConfiguration: IQKeyboardToolbarPlaceholderConfiguration = .init() +} + +// swiftlint:disable unused_setter_value +@available(iOSApplicationExtension, unavailable) +@MainActor +@objc public extension IQKeyboardToolbarConfiguration { + + @available(*, unavailable, renamed: "useTextInputViewTintColor") + var useTextFieldTintColor: Bool { + get { fatalError() } + set {} + } +} +// swiftlint:enable unused_setter_value diff --git a/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/Constants/IQKeyboardToolbarConstants.swift b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/Constants/IQKeyboardToolbarConstants.swift new file mode 100644 index 0000000..ee76ea3 --- /dev/null +++ b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/Constants/IQKeyboardToolbarConstants.swift @@ -0,0 +1,68 @@ +// +// IQKeyboardToolbarConstants.swift +// https://github.com/hackiftekhar/IQKeyboardToolbarManager +// 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: +// +// 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. + +import Foundation + +// MARK: IQKeyboardToolbarManageBehavior + +/** +`IQAutoToolbarBySubviews` +Creates Toolbar according to subview's hierarchy of textInputView's in view. + +`IQAutoToolbarByTag` +Creates Toolbar according to tag property of textInputView's. + +`IQAutoToolbarByPosition` +Creates Toolbar according to the y,x position of textInputView in it's superview coordinate. +*/ +@available(iOSApplicationExtension, unavailable) +@objc public enum IQKeyboardToolbarManageBehavior: Int { + case bySubviews + case byTag + case byPosition +} + +@available(*, unavailable, renamed: "IQKeyboardToolbarManageBehavior") +@objc public enum IQAutoToolbarManageBehavior: Int { + case bySubviews + case byTag + case byPosition +} + +/** + `IQPreviousNextDisplayModeDefault` + Show NextPrevious when there are more than 1 textInputView otherwise hide. + + `IQPreviousNextDisplayModeAlwaysHide` + Do not show NextPrevious buttons in any case. + + `IQPreviousNextDisplayModeAlwaysShow` + Always show nextPrevious buttons, + if there are more than 1 textInputView then both buttons will be visible but will be shown as disabled. + */ +@available(iOSApplicationExtension, unavailable) +@objc public enum IQPreviousNextDisplayMode: Int { + case `default` + case alwaysHide + case alwaysShow +} diff --git a/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/Debug/IQKeyboardToolbarManager+Debug.swift b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/Debug/IQKeyboardToolbarManager+Debug.swift new file mode 100644 index 0000000..8953423 --- /dev/null +++ b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/Debug/IQKeyboardToolbarManager+Debug.swift @@ -0,0 +1,52 @@ +// +// IQKeyboardToolbarManager+Debug +// https://github.com/hackiftekhar/IQKeyboardToolbarManager +// 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: +// +// 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. + +import Foundation + +// MARK: Debugging & Developer options +@available(iOSApplicationExtension, unavailable) +@MainActor +internal extension IQKeyboardToolbarManager { + + func showLog(_ logString: String, indentation: Int = 0) { + + guard isDebuggingEnabled else { + return + } + + if indentation < 0 { + self.logIndentation = max(0, self.logIndentation + indentation) + } + + var preLog: String = "IQKeyboardToolbarManager" + for _ in 0 ... self.logIndentation { + preLog += "|\t" + } + + print(preLog + logString) + + if indentation > 0 { + self.logIndentation += indentation + } + } +} diff --git a/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/IQDeepResponderContainerView.swift b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/IQDeepResponderContainerView.swift new file mode 100644 index 0000000..abd7566 --- /dev/null +++ b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/IQDeepResponderContainerView.swift @@ -0,0 +1,29 @@ +// +// IQDeepResponderContainerView.swift +// https://github.com/hackiftekhar/IQKeyboardToolbarManager +// 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: +// +// 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. + +import UIKit + +@available(iOSApplicationExtension, unavailable) +@MainActor +@objcMembers open class IQDeepResponderContainerView: UIView { +} diff --git a/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/IQKeyboardToolbarManager+Deprecated.swift b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/IQKeyboardToolbarManager+Deprecated.swift new file mode 100644 index 0000000..fc34aa0 --- /dev/null +++ b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/IQKeyboardToolbarManager+Deprecated.swift @@ -0,0 +1,183 @@ +// +// IQKeyboardToolbarManager+Deprecated.swift +// https://github.com/hackiftekhar/IQKeyboardToolbarManager +// 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: +// +// 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. + +import UIKit +import IQKeyboardToolbar + +// swiftlint:disable unused_setter_value +// swiftlint:disable identifier_name +@available(iOSApplicationExtension, unavailable) +@MainActor +@objc public extension IQKeyboardToolbarManager { + + @available(*, unavailable, renamed: "isEnabled") + var enableAutoToolbar: Bool { + get { false } + set { } + } + + @available(*, unavailable, renamed: "playInputClicks") + var shouldPlayInputClicks: Bool { + get { false } + set { } + } +} + +@available(iOSApplicationExtension, unavailable) +@MainActor +@objc public extension IQKeyboardToolbarManager { + + @available(*, unavailable, renamed: "toolbarConfiguration.manageBehavior") + var toolbarManageBehaviour: IQAutoToolbarManageBehavior { + get { .bySubviews } + set { } + } + + @available(*, unavailable, renamed: "toolbarConfiguration.useTextInputViewTintColor") + var shouldToolbarUsesTextFieldTintColor: Bool { + get { false } + set { } + } + + @available(*, unavailable, renamed: "toolbarConfiguration.tintColor") + var toolbarTintColor: UIColor? { + get { nil } + set { } + } + + @available(*, unavailable, renamed: "toolbarConfiguration.barTintColor") + var toolbarBarTintColor: UIColor? { + get { nil } + set { } + } + + @available(*, unavailable, renamed: "toolbarConfiguration.previousNextDisplayMode") + var previousNextDisplayMode: IQPreviousNextDisplayMode { + get { .default } + set { } + } + + @available(*, unavailable, renamed: "deepResponderAllowedContainerClasses") + var toolbarPreviousNextAllowedClasses: [UIView.Type] { + get { [] } + set { } + } +} + +@available(iOSApplicationExtension, unavailable) +@MainActor +@objc public extension IQKeyboardToolbarManager { + @available(*, unavailable, renamed: "toolbarConfiguration.previousBarButtonConfiguration.image", + message: "To change, please assign a new toolbarConfiguration.previousBarButtonConfiguration") + var toolbarPreviousBarButtonItemImage: UIImage? { + get { nil } + set { } + } + @available(*, unavailable, renamed: "toolbarConfiguration.previousBarButtonConfiguration.title", + message: "To change, please assign a new toolbarConfiguration.previousBarButtonConfiguration") + var toolbarPreviousBarButtonItemText: String? { + get { nil } + set { } + } + @available(*, unavailable, renamed: "toolbarConfiguration.previousBarButtonConfiguration.accessibilityLabel", + message: "To change, please assign a new toolbarConfiguration.previousBarButtonConfiguration") + var toolbarPreviousBarButtonItemAccessibilityLabel: String? { + get { nil } + set { } + } + + @available(*, unavailable, renamed: "toolbarConfiguration.nextBarButtonConfiguration.image", + message: "To change, please assign a new toolbarConfiguration.nextBarButtonConfiguration") + var toolbarNextBarButtonItemImage: UIImage? { + get { nil } + set { } + } + @available(*, unavailable, renamed: "toolbarConfiguration.nextBarButtonConfiguration.title", + message: "To change, please assign a new toolbarConfiguration.nextBarButtonConfiguration") + var toolbarNextBarButtonItemText: String? { + get { nil } + set { } + } + @available(*, unavailable, renamed: "toolbarConfiguration.nextBarButtonConfiguration.accessibilityLabel", + message: "To change, please assign a new toolbarConfiguration.nextBarButtonConfiguration") + var toolbarNextBarButtonItemAccessibilityLabel: String? { + get { nil } + set { } + } + + @available(*, unavailable, renamed: "toolbarConfiguration.doneBarButtonConfiguration.image", + message: "To change, please assign a new toolbarConfiguration.doneBarButtonConfiguration") + var toolbarDoneBarButtonItemImage: UIImage? { + get { nil } + set { } + } + @available(*, unavailable, renamed: "toolbarConfiguration.doneBarButtonConfiguration.title", + message: "To change, please assign a new toolbarConfiguration.doneBarButtonConfiguration") + var toolbarDoneBarButtonItemText: String? { + get { nil } + set { } + } + @available(*, unavailable, renamed: "toolbarConfiguration.doneBarButtonConfiguration.accessibilityLabel", + message: "To change, please assign a new toolbarConfiguration.doneBarButtonConfiguration") + var toolbarDoneBarButtonItemAccessibilityLabel: String? { + get { nil } + set { } + } +} + +@available(iOSApplicationExtension, unavailable) +@MainActor +@objc public extension IQKeyboardToolbarManager { + + @available(*, unavailable, renamed: "toolbarConfiguration.placeholderConfiguration.accessibilityLabel") + var toolbarTitleBarButtonItemAccessibilityLabel: String? { + get { nil } + set { } + } + + @available(*, unavailable, renamed: "toolbarConfiguration.placeholderConfiguration.showPlaceholder") + var shouldShowToolbarPlaceholder: Bool { + get { false } + set { } + } + + @available(*, unavailable, renamed: "toolbarConfiguration.placeholderConfiguration.font") + var placeholderFont: UIFont? { + get { nil } + set { } + } + + @available(*, unavailable, renamed: "toolbarConfiguration.placeholderConfiguration.color") + var placeholderColor: UIColor? { + get { nil } + set { } + } + + @available(*, unavailable, renamed: "toolbarConfiguration.placeholderConfiguration.buttonColor") + var placeholderButtonColor: UIColor? { + get { nil } + set { } + } +} +// swiftlint:enable unused_setter_value +// swiftlint:enable identifier_name diff --git a/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/IQKeyboardToolbarManager+Internal.swift b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/IQKeyboardToolbarManager+Internal.swift new file mode 100644 index 0000000..256e8e3 --- /dev/null +++ b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/IQKeyboardToolbarManager+Internal.swift @@ -0,0 +1,148 @@ +// +// IQKeyboardToolbarManager+Internal.swift +// https://github.com/hackiftekhar/IQKeyboardToolbarManager +// 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: +// +// 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. + +import UIKit +import IQTextInputViewNotification +import IQKeyboardCore + +@available(iOSApplicationExtension, unavailable) +@MainActor +internal extension IQKeyboardToolbarManager { + + /** Get all textInputView siblings of textInputView. */ + func responderViews(of textInputView: some IQTextInputView) -> [any IQTextInputView]? { + + var superConsideredView: UIView? + + // If find any consider responderView in it's upper hierarchy then will get deepResponderView. + for allowedClass in deepResponderAllowedContainerClasses { + superConsideredView = (textInputView as UIView).iq.superviewOf(type: allowedClass) + if superConsideredView != nil { + break + } + } + + let swiftUIHostingView: UIView? = Self.getSwiftUIHostingView(textInputView: textInputView) + + // (Enhancement ID: #22) + // If there is a superConsideredView in view's hierarchy, + // then fetching all it's subview that responds. + // No sorting for superConsideredView, it's by subView position. + if let view: UIView = swiftUIHostingView { + return view.iq.deepResponderViews() + } else if let view: UIView = superConsideredView { + return view.iq.deepResponderViews() + } else { // Otherwise fetching all the siblings + + let textInputViews: [any IQTextInputView] = textInputView.iq.responderSiblings() + + // Sorting textInputViews according to behavior + switch toolbarConfiguration.manageBehavior { + // If autoToolbar behavior is bySubviews, then returning it. + case .bySubviews: return textInputViews + + // If autoToolbar behavior is by tag, then sorting it according to tag property. + case .byTag: return textInputViews.sortedByTag() + + // If autoToolbar behavior is by tag, then sorting it according to tag property. + case .byPosition: return textInputViews.sortedByPosition() + } + } + } + + func privateIsEnableAutoToolbar(of textInputView: some IQTextInputView) -> Bool { + + var isEnabled: Bool = isEnabled + + guard var textInputViewController = (textInputView as UIView).iq.viewContainingController() else { + return isEnabled + } + + if textInputView is UISearchTextField { + if let navController: UINavigationController = textInputViewController as? UINavigationController, + let topController: UIViewController = navController.topViewController { + textInputViewController = topController + } + + // Not adding toolbar for searchTextField inside searchController. + if textInputViewController.navigationItem.searchController?.searchBar.searchTextField == textInputView { + return false + } + } + + if !isEnabled, enabledToolbarClasses.contains(where: { textInputViewController.isKind(of: $0) }) { + isEnabled = true + } + + if isEnabled { + + // If found any toolbar disabled classes then return. + if disabledToolbarClasses.contains(where: { textInputViewController.isKind(of: $0) }) { + isEnabled = false + } + + // Special Controllers + if isEnabled { + + let classNameString: String = "\(type(of: textInputViewController.self))" + + // _UIAlertControllerTextFieldViewController + if classNameString.contains("UIAlertController"), + classNameString.hasSuffix("TextFieldViewController") { + isEnabled = false + } + } + } + + return isEnabled + } +} + +@available(iOSApplicationExtension, unavailable) +@MainActor +private extension IQKeyboardToolbarManager { + + private static func getSwiftUIHostingView(textInputView: some IQTextInputView) -> UIView? { + var swiftUIHostingView: UIView? + let swiftUIHostingViewName: String = "UIHostingView<" + var superView: UIView? = textInputView.superview + while let aSuperview: UIView = superView { + + let classNameString: String = { + var name: String = "\(type(of: aSuperview.self))" + if name.hasPrefix("_") { + name.removeFirst() + } + return name + }() + + if classNameString.hasPrefix(swiftUIHostingViewName) { + swiftUIHostingView = aSuperview + break + } + + superView = aSuperview.superview + } + return swiftUIHostingView + } +} diff --git a/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/IQKeyboardToolbarManager.swift b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/IQKeyboardToolbarManager.swift new file mode 100644 index 0000000..f831fe5 --- /dev/null +++ b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/IQKeyboardToolbarManager.swift @@ -0,0 +1,173 @@ +// +// IQKeyboardToolbarManager.swift +// https://github.com/hackiftekhar/IQKeyboardToolbarManager +// 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: +// +// 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. + +import UIKit +import IQTextInputViewNotification +import IQKeyboardCore +import IQKeyboardToolbar +import Combine + +@available(iOSApplicationExtension, unavailable) +@MainActor +@objcMembers public final class IQKeyboardToolbarManager: NSObject { + + private let textInputViewObserver: IQTextInputViewNotification = .init() + private var storage: Set = [] + + internal var textInputView: (some IQTextInputView)? { + textInputViewObserver.textInputView + } + + /** + Returns the default singleton instance. + */ + @MainActor + @objc public static let shared: IQKeyboardToolbarManager = .init() + + /** + Automatic add the toolbar functionality. Default is false. + */ + public var isEnabled: Bool = false { + didSet { + reloadInputViews() + showLog("isEnabled: \(isEnabled ? "Yes" : "NO")") + } + } + + public var isDebuggingEnabled: Bool = false + + /** + Configurations related to the toolbar display over the keyboard. + */ + public let toolbarConfiguration: IQKeyboardToolbarConfiguration = .init() + + // MARK: UISound handling + + /** + If YES, then it plays inputClick sound on next/previous/done click. + */ + public var playInputClicks: Bool = true + + /** + Disable automatic toolbar creation within the scope of disabled toolbar viewControllers classes. + Within this scope, 'isEnabled' property is ignored. Class should be kind of UIViewController. + */ + public var disabledToolbarClasses: [UIViewController.Type] = [ + UIAlertController.self, + UIInputViewController.self + ] + + /** + Enable automatic toolbar creation within the scope of enabled toolbar viewControllers classes. + Within this scope, 'isEnabled' property is ignored. Class should be kind of UIViewController. + If same Class is added in disabledToolbarClasses list, then enabledToolbarClasses will be ignore. + */ + public var enabledToolbarClasses: [UIViewController.Type] = [] + + /** + Allowed subclasses of UIView to add all inner textInputView, + this will allow to navigate between textInputView contains in different superview. + Class should be kind of UIView. + */ + public var deepResponderAllowedContainerClasses: [UIView.Type] = [ + UITableView.self, + UICollectionView.self, + IQDeepResponderContainerView.self + ] + + internal var logIndentation = 0 + + internal override init() { + super.init() + + addTextInputViewObserver() + addBecomeActiveObserver() + + // (Bug ID: #550) + // Loading IQKeyboardToolbar, 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 textInputView: UITextField = UITextField() + textInputView.iq.addDone(target: nil, action: #selector(self.doneAction(_:))) + textInputView.iq.addPreviousNextDone(target: nil, + previousAction: #selector(self.previousAction(_:)), + nextAction: #selector(self.nextAction(_:)), + doneAction: #selector(self.doneAction(_:))) + } + } +} + +@available(iOSApplicationExtension, unavailable) +@MainActor +private extension IQKeyboardToolbarManager { + + private func removeTextInputViewObserver() { + textInputViewObserver.unsubscribe(identifier: "IQKeyboardToolbarManager") + } + + private func addTextInputViewObserver() { + textInputViewObserver.subscribe(identifier: "IQKeyboardToolbarManager", + changeHandler: { [weak self] event, textInputView in + guard let self = self else { return } + guard (textInputView as UIView).iq.isAlertViewTextField() == false else { + return + } + + switch event { + case .beginEditing: + reloadInputViews() + case .endEditing: + removeToolbarIfRequired(of: textInputView) + } + }) + } +} + +@available(iOSApplicationExtension, unavailable) +@MainActor +private extension IQKeyboardToolbarManager { + + private func removeBecomeActiveObserver() { + storage.forEach { $0.cancel() } + storage.removeAll() + } + + private func addBecomeActiveObserver() { + let beginEditingNotificationNames: [Notification.Name] = [ + UIApplication.didBecomeActiveNotification + ] + + for notificationName in beginEditingNotificationNames { + NotificationCenter.default.publisher(for: notificationName) + .sink(receiveValue: { [weak self] info in + guard let self = self else { return } + + // In SwiftUI View's when app comes from background to foreground + // The inputAccessoryView was getting removed in iOS 26. So forcing to reload. + self.reloadInputViews() + }) + .store(in: &storage) + } + } +} diff --git a/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/Toolbar/IQKeyboardToolbarManager+Action.swift b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/Toolbar/IQKeyboardToolbarManager+Action.swift new file mode 100644 index 0000000..1a79819 --- /dev/null +++ b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/Toolbar/IQKeyboardToolbarManager+Action.swift @@ -0,0 +1,210 @@ +// +// IQKeyboardToolbarManager+Action.swift +// https://github.com/hackiftekhar/IQKeyboardToolbarManager +// 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: +// +// 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. + +import UIKit +import IQKeyboardCore +import IQKeyboardToolbar + +// MARK: Previous next button actions +@available(iOSApplicationExtension, unavailable) +@MainActor +@objc public extension IQKeyboardToolbarManager { + + /** + Returns YES if can navigate to previous responder textInputView, otherwise NO. + */ + var canGoPrevious: Bool { + // If it is not first textInputView. then it's previous object canBecomeFirstResponder. + guard let textInputView: any IQTextInputView = self.textInputView, + let textInputViews: [any IQTextInputView] = responderViews(of: textInputView), + let index: Int = textInputViews.firstIndex(where: { $0 == textInputView }), + index > 0 else { + return false + } + return true + } + + /** + Returns YES if can navigate to next responder textInputViews, otherwise NO. + */ + var canGoNext: Bool { + // If it is not first textInputView. then it's previous object canBecomeFirstResponder. + guard let textInputView: any IQTextInputView = self.textInputView, + let textInputViews: [any IQTextInputView] = responderViews(of: textInputView), + let index: Int = textInputViews.firstIndex(where: { $0 == textInputView }), + index < textInputViews.count-1 else { + return false + } + return true + } + + /** + Navigate to previous responder textInputViews + */ + @discardableResult + func goPrevious() -> Bool { + + // If it is not first textInputView. then it's previous object becomeFirstResponder. + guard let textInputView: any IQTextInputView = self.textInputView, + let textInputViews: [any IQTextInputView] = responderViews(of: textInputView), + let index: Int = textInputViews.firstIndex(where: { $0 == textInputView }), + index > 0 else { + return false + } + + let nextTextInputView: any IQTextInputView = textInputViews[index-1] + + let isAcceptAsFirstResponder: Bool = nextTextInputView.becomeFirstResponder() + + // If it refuses then becoming previous textInputView as first responder again. (Bug ID: #96) + if !isAcceptAsFirstResponder { + showLog("Refuses to become first responder: \(nextTextInputView)") + } + + return isAcceptAsFirstResponder + } + + /** + Navigate to next responder textInputView. + */ + @discardableResult + func goNext() -> Bool { + + // If it is not first textInputView. then it's previous object becomeFirstResponder. + guard let textInputView: any IQTextInputView = self.textInputView, + let textInputViews: [any IQTextInputView] = responderViews(of: textInputView), + let index: Int = textInputViews.firstIndex(where: { $0 == textInputView }), + index < textInputViews.count-1 else { + return false + } + + let nextTextInputView: any IQTextInputView = textInputViews[index+1] + + let isAcceptAsFirstResponder: Bool = nextTextInputView.becomeFirstResponder() + + // If it refuses then becoming previous textInputView as first responder again. (Bug ID: #96) + if !isAcceptAsFirstResponder { + showLog("Refuses to become first responder: \(nextTextInputView)") + } + + return isAcceptAsFirstResponder + } +} + +@available(iOSApplicationExtension, unavailable) +@MainActor +internal extension IQKeyboardToolbarManager { + + /** previousAction. */ + func previousAction(_ barButton: IQBarButtonItem) { + + // If user wants to play input Click sound. + if playInputClicks { + // Play Input Click Sound. + UIDevice.current.playInputClick() + } + + guard canGoPrevious, + let textInputView: any IQTextInputView = self.textInputView else { + return + } + + let isAcceptedAsFirstResponder: Bool = goPrevious() + + if isAcceptedAsFirstResponder { + Self.sendInvokeAction(of: barButton, sender: textInputView) + } + } + + /** nextAction. */ + func nextAction(_ barButton: IQBarButtonItem) { + + // If user wants to play input Click sound. + if playInputClicks { + // Play Input Click Sound. + UIDevice.current.playInputClick() + } + + guard canGoNext, + let textInputView: any IQTextInputView = self.textInputView else { + return + } + + let isAcceptedAsFirstResponder: Bool = goNext() + + if isAcceptedAsFirstResponder { + Self.sendInvokeAction(of: barButton, sender: textInputView) + } + } + + /** doneAction. Resigning current textInputView. */ + func doneAction(_ barButton: IQBarButtonItem) { + + // If user wants to play input Click sound. + if playInputClicks { + // Play Input Click Sound. + UIDevice.current.playInputClick() + } + + guard let textInputView: any IQTextInputView = self.textInputView else { + return + } + + // Resign textInputView. + let isResignedFirstResponder: Bool = textInputView.resignFirstResponder() + + if isResignedFirstResponder { + Self.sendInvokeAction(of: barButton, sender: textInputView) + } + } +} + +@available(iOSApplicationExtension, unavailable) +@MainActor +private extension IQKeyboardToolbarManager { + private static func sendInvokeAction(of barButton: IQBarButtonItem, sender: some IQTextInputView) { + // Handling search bar special case + if let searchBar: UISearchBar = sender.iq.textFieldSearchBar() { + switch barButton { + case sender.internalToolbar.nextBarButton: + searchBar.internalToolbar.nextBarButton.invocation?.invoke(from: searchBar) + case sender.internalToolbar.previousBarButton: + searchBar.internalToolbar.previousBarButton.invocation?.invoke(from: searchBar) + case sender.internalToolbar.doneBarButton: + searchBar.internalToolbar.doneBarButton.invocation?.invoke(from: searchBar) + default: + break + } + } else { + barButton.invocation?.invoke(from: sender) + } + } +} + +@available(iOSApplicationExtension, unavailable) +@MainActor +fileprivate extension IQTextInputView { + var internalToolbar: IQKeyboardToolbar { + return iq.toolbar + } +} diff --git a/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/Toolbar/IQKeyboardToolbarManager+Toolbar.swift b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/Toolbar/IQKeyboardToolbarManager+Toolbar.swift new file mode 100644 index 0000000..b3dd0f4 --- /dev/null +++ b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/Toolbar/IQKeyboardToolbarManager+Toolbar.swift @@ -0,0 +1,287 @@ +// +// IQKeyboardToolbarManager+Toolbar.swift +// https://github.com/hackiftekhar/IQKeyboardToolbarManager +// 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: +// +// 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. + +import UIKit +import IQKeyboardCore +import IQKeyboardToolbar + +@available(iOSApplicationExtension, unavailable) +@MainActor +@objc public extension IQKeyboardToolbarManager { + /** reloadInputViews to reload toolbar buttons enable/disable state on the fly Enhancement ID #434. */ + func reloadInputViews() { + + guard let textInputView = textInputView else { return } + // If enabled then adding toolbar. + if privateIsEnableAutoToolbar(of: textInputView) { + self.addToolbarIfRequired(of: textInputView) + } else { + self.removeToolbarIfRequired(of: textInputView) + } + } +} + +@available(iOSApplicationExtension, unavailable) +@MainActor +internal extension IQKeyboardToolbarManager { + + /** + Default tag for toolbar with Done button -1001 + */ + private static let toolbarTag = -1001 + + // swiftlint:disable function_body_length + // swiftlint:disable cyclomatic_complexity + /** + Add toolbar if it is required to add on textInputViews and it's siblings. + */ + func addToolbarIfRequired(of textInputView: some IQTextInputView) { + + // Either there is no inputAccessoryView or + // if accessoryView is not appropriate for current situation + // (There is Previous/Next/Done toolbar) + guard let siblings: [any IQTextInputView] = responderViews(of: textInputView), !siblings.isEmpty, + !Self.hasUserDefinedInputAccessoryView(textInputView: textInputView) else { + return + } + + showLog(">>>>> \(#function) started >>>>>", indentation: 1) + defer { + showLog("<<<<< \(#function) ended <<<<<", indentation: -1) + } + + showLog("Found \(siblings.count) responder sibling(s)") + let rightConfiguration: IQBarButtonItemConfiguration = getRightConfiguration() + + let isTableCollectionView: Bool + if (textInputView as UIView).iq.superviewOf(type: UITableView.self) != nil || + (textInputView as UIView).iq.superviewOf(type: UICollectionView.self) != nil { + isTableCollectionView = true + } else { + isTableCollectionView = false + } + + let previousNextDisplayMode: IQPreviousNextDisplayMode = toolbarConfiguration.previousNextDisplayMode + + let havePreviousNext: Bool + switch previousNextDisplayMode { + case .default: + // If the textInputView is part of UITableView/UICollectionView then we should be exposing previous/next too + // Because at this time we don't know previous or next cell if it contains another textInputView to move. + if isTableCollectionView { + havePreviousNext = true + } else if siblings.count <= 1 { + // If only one object is found, then adding only Done button. + havePreviousNext = false + } else { + havePreviousNext = true + } + case .alwaysShow: + havePreviousNext = true + case .alwaysHide: + havePreviousNext = false + } + + let placeholderConfig: IQKeyboardToolbarPlaceholderConfiguration = toolbarConfiguration.placeholderConfiguration + let titleText: String? = placeholderConfig.showPlaceholder ? textInputView.iq.drawingPlaceholder : nil + if havePreviousNext { + let prevConfiguration: IQBarButtonItemConfiguration = getPreviousConfiguration() + let nextConfiguration: IQBarButtonItemConfiguration = getNextConfiguration() + + textInputView.iq.addToolbar(target: self, + previousConfiguration: prevConfiguration, + nextConfiguration: nextConfiguration, + rightConfiguration: rightConfiguration, title: titleText, + titleAccessibilityLabel: placeholderConfig.accessibilityLabel) + if isTableCollectionView { + // (Bug ID: #56) + // In case of UITableView, the next/previous buttons should always be enabled. + textInputView.iq.toolbar.previousBarButton.isEnabled = true + textInputView.iq.toolbar.nextBarButton.isEnabled = true + } else { + // If first textInputView, then previous should not be enabled. + if let first = siblings.first { + textInputView.iq.toolbar.previousBarButton.isEnabled = first != textInputView + } else { + textInputView.iq.toolbar.previousBarButton.isEnabled = false + } + // If last textInputView, then next should not be enabled. + if let last = siblings.last { + textInputView.iq.toolbar.nextBarButton.isEnabled = last != textInputView + } else { + textInputView.iq.toolbar.nextBarButton.isEnabled = false + } + } + } else { + textInputView.iq.addToolbar(target: self, rightConfiguration: rightConfiguration, + title: titleText, + titleAccessibilityLabel: placeholderConfig.accessibilityLabel) + } + // (Bug ID: #78) + textInputView.inputAccessoryView?.tag = IQKeyboardToolbarManager.toolbarTag + + Self.applyToolbarConfiguration(textInputView: textInputView, toolbarConfiguration: toolbarConfiguration) + } + // swiftlint:enable function_body_length + // swiftlint:enable cyclomatic_complexity + + /** Remove any toolbar if it is IQKeyboardToolbar. */ + func removeToolbarIfRequired(of textInputView: some IQTextInputView) { // (Bug ID: #18) + + guard let toolbar: IQKeyboardToolbar = textInputView.inputAccessoryView as? IQKeyboardToolbar, + toolbar.tag == IQKeyboardToolbarManager.toolbarTag else { + return + } + + showLog(">>>>> \(#function) started >>>>>", indentation: 1) + + defer { + showLog("<<<<< \(#function) ended <<<<<", indentation: -1) + } + + textInputView.inputAccessoryView = nil + } +} + +@available(iOSApplicationExtension, unavailable) +@MainActor +private extension IQKeyboardToolbarManager { + + static func hasUserDefinedInputAccessoryView(textInputView: some IQTextInputView) -> Bool { + guard let inputAccessoryView: UIView = textInputView.inputAccessoryView, + inputAccessoryView.tag != IQKeyboardToolbarManager.toolbarTag else { return false } + + let swiftUIAccessoryNamePrefixes: [String] = [ + "InputAccessoryHost", // iOS 17 and below + "RootUIView", // iOS 18 + "_UIInputViewContent", // iOS 18 system views + "_UIKeyboardInputAccessory" // Additional iOS 18 system view + ] + let classNameString: String = "\(type(of: inputAccessoryView.classForCoder))" + + // If it's SwiftUI accessory view but doesn't have a height (fake accessory view), then we should + // add our own accessoryView otherwise, keep the SwiftUI accessoryView since user has added it from code + let isSwiftUIAccessoryView = swiftUIAccessoryNamePrefixes.contains(where: { classNameString.hasPrefix($0) }) + + // A height of 0 or very small height typically indicates a system placeholder + guard isSwiftUIAccessoryView, + inputAccessoryView.subviews.isEmpty else { + return true + } + return false + } + + func getRightConfiguration() -> IQBarButtonItemConfiguration { + let rightConfiguration: IQBarButtonItemConfiguration + if let configuration: IQBarButtonItemConfiguration = toolbarConfiguration.doneBarButtonConfiguration { + rightConfiguration = configuration + rightConfiguration.action = #selector(self.doneAction(_:)) + } else { +#if compiler(>=6.2) // Xcode 26 + let requiresCompatibility: Bool = Bundle.main.object(forInfoDictionaryKey: "UIDesignRequiresCompatibility") as? Bool ?? false + if #available(iOS 26.0, *), !requiresCompatibility { + rightConfiguration = IQBarButtonItemConfiguration(image: UIImage(systemName: "checkmark")!, action: #selector(self.doneAction(_:))) + } else { + rightConfiguration = IQBarButtonItemConfiguration(systemItem: .done, action: #selector(self.doneAction(_:))) + } +#else + rightConfiguration = IQBarButtonItemConfiguration(systemItem: .done, action: #selector(self.doneAction(_:))) +#endif + rightConfiguration.accessibilityLabel = "Done" + } + return rightConfiguration + } + + func getPreviousConfiguration() -> IQBarButtonItemConfiguration { + let prevConfiguration: IQBarButtonItemConfiguration + if let configuration: IQBarButtonItemConfiguration = toolbarConfiguration.previousBarButtonConfiguration { + configuration.action = #selector(self.previousAction(_:)) + prevConfiguration = configuration + } else { + let chevronUp: UIImage = UIImage(systemName: "chevron.up") ?? UIImage() + prevConfiguration = IQBarButtonItemConfiguration(image: chevronUp, + action: #selector(self.previousAction(_:))) + prevConfiguration.accessibilityLabel = "Previous" + } + return prevConfiguration + } + + func getNextConfiguration() -> IQBarButtonItemConfiguration { + let nextConfiguration: IQBarButtonItemConfiguration + if let configuration: IQBarButtonItemConfiguration = toolbarConfiguration.nextBarButtonConfiguration { + configuration.action = #selector(self.nextAction(_:)) + nextConfiguration = configuration + } else { + let chevronDown: UIImage = UIImage(systemName: "chevron.down") ?? UIImage() + nextConfiguration = IQBarButtonItemConfiguration(image: chevronDown, + action: #selector(self.nextAction(_:))) + nextConfiguration.accessibilityLabel = "Next" + } + return nextConfiguration + } + + static func applyToolbarConfiguration(textInputView: some IQTextInputView, + toolbarConfiguration: IQKeyboardToolbarConfiguration) { + + let toolbar: IQKeyboardToolbar = textInputView.iq.toolbar + + // Setting toolbar tintColor // (Enhancement ID: #30) + if toolbarConfiguration.useTextInputViewTintColor { + toolbar.tintColor = textInputView.tintColor + } else { + toolbar.tintColor = toolbarConfiguration.tintColor + } + + // Bar style according to keyboard appearance + switch textInputView.keyboardAppearance { + case .dark: + toolbar.barStyle = .black + toolbar.barTintColor = nil + default: + toolbar.barStyle = .default + toolbar.barTintColor = toolbarConfiguration.barTintColor + } + + // Setting toolbar title font. // (Enhancement ID: #30) + guard toolbarConfiguration.placeholderConfiguration.showPlaceholder, + !textInputView.iq.hidePlaceholder else { + toolbar.titleBarButton.title = nil + return + } + + // Updating placeholder font to toolbar. //(Bug ID: #148, #272) + if toolbar.titleBarButton.title == nil || + toolbar.titleBarButton.title != textInputView.iq.drawingPlaceholder { + toolbar.titleBarButton.title = textInputView.iq.drawingPlaceholder + } + + // Setting toolbar title font. // (Enhancement ID: #30) + toolbar.titleBarButton.titleFont = toolbarConfiguration.placeholderConfiguration.font + + // Setting toolbar title color. // (Enhancement ID: #880) + toolbar.titleBarButton.titleColor = toolbarConfiguration.placeholderConfiguration.color + + // Setting toolbar button title color. // (Enhancement ID: #880) + toolbar.titleBarButton.selectableTitleColor = toolbarConfiguration.placeholderConfiguration.buttonColor + } +} diff --git a/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/UIKitExtensions/Array+Sort.swift b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/UIKitExtensions/Array+Sort.swift new file mode 100644 index 0000000..83a8b9c --- /dev/null +++ b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/UIKitExtensions/Array+Sort.swift @@ -0,0 +1,58 @@ +// +// Array+Sort.swift +// https://github.com/hackiftekhar/IQKeyboardToolbarManager +// 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: +// +// 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. + +import UIKit +import IQKeyboardCore + +/** +UIView.subviews sorting category. +*/ +@available(iOSApplicationExtension, unavailable) +@MainActor +internal extension Array where Element: IQTextInputView { + + /** + Returns the array by sorting the UIView's by their tag property. + */ + func sortedByTag() -> [Element] { + + return sorted(by: { (obj1: Element, obj2: Element) -> Bool in + + return (obj1.tag < obj2.tag) + }) + } + + /** + Returns the array by sorting the UIView's by their tag property. + */ + func sortedByPosition() -> [Element] { + + return sorted(by: { (obj1: Element, obj2: Element) -> Bool in + if obj1.frame.minY != obj2.frame.minY { + return obj1.frame.minY < obj2.frame.minY + } else { + return obj1.frame.minX < obj2.frame.minX + } + }) + } +} diff --git a/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/UIKitExtensions/UIView+Responders.swift b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/UIKitExtensions/UIView+Responders.swift new file mode 100644 index 0000000..592399e --- /dev/null +++ b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/UIKitExtensions/UIView+Responders.swift @@ -0,0 +1,179 @@ +// +// UIView+Responders.swift +// https://github.com/hackiftekhar/IQKeyboardToolbarManager +// 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: +// +// 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. + +import UIKit +import IQKeyboardCore + +@available(iOSApplicationExtension, unavailable) +@MainActor +private struct AssociatedKeys { + static var ignoreSwitchingByNextPrevious: Int = 0 +} + +/** +UIView category for managing textInputView +*/ +@available(iOSApplicationExtension, unavailable) +@MainActor +public extension IQKeyboardExtension where Base: IQTextInputView { + + /** + If ignoreSwitchingByNextPrevious is true then library will ignore this textInputView + while moving to other textInputView using keyboard toolbar next previous buttons. + Default is false + */ + var ignoreSwitchingByNextPrevious: Bool { + get { + if let base = base { + return objc_getAssociatedObject(base, &AssociatedKeys.ignoreSwitchingByNextPrevious) as? Bool ?? false + } + return false + } + set(newValue) { + if let base = base { + objc_setAssociatedObject(base, &AssociatedKeys.ignoreSwitchingByNextPrevious, + newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + } + } + } +} + +// swiftlint:disable unused_setter_value +@available(iOSApplicationExtension, unavailable) +@MainActor +@objc public extension UIView { + @available(*, unavailable, renamed: "iq.ignoreSwitchingByNextPrevious") + var ignoreSwitchingByNextPrevious: Bool { + get { false } + set { } + } +} +// swiftlint:enable unused_setter_value + +@available(iOSApplicationExtension, unavailable) +@MainActor +internal extension IQKeyboardExtension where Base: IQTextInputView { + + /** + Returns all siblings of the receiver which canBecomeFirstResponder. + */ + func responderSiblings() -> [any IQTextInputView] { + + // Getting all siblings + guard let siblings: [UIView] = base?.superview?.subviews else { return [] } + + // Array of textInputView. + var textInputViews: [any IQTextInputView] = [] + for view in siblings { + if let view = view as? any IQTextInputView, + view == base || !view.internalIgnoreSwitchingByNextPrevious, + view.internalCanBecomeFirstResponder() { + textInputViews.append(view) + } + } + + return textInputViews + } +} + +/** +UIView category for managing textInputView +*/ +@available(iOSApplicationExtension, unavailable) +@MainActor +internal extension IQKeyboardExtension where Base: UIView { + + /** + Returns all deep subViews of the receiver which canBecomeFirstResponder. + */ + func deepResponderViews() -> [any IQTextInputView] { + + guard let subviews: [UIView] = base?.subviews, !subviews.isEmpty else { return [] } + + // Array of textInputViews. + var textInputViews: [any IQTextInputView] = [] + + for view in subviews { + + if let view = view as? any IQTextInputView, + view == base || !view.internalIgnoreSwitchingByNextPrevious, + view.internalCanBecomeFirstResponder() { + textInputViews.append(view) + } + // Sometimes there are hidden or disabled views and textInputView inside them still recorded, + // so we added some more validations here (Bug ID: #458) + // Uncommented else (Bug ID: #625) + else if view.subviews.count != 0, + base?.isUserInteractionEnabled == true, + base?.isHidden == false, base?.alpha != 0.0 { + for deepView in view.iq.deepResponderViews() { + textInputViews.append(deepView) + } + } + } + + // subviews are returning in opposite order. Sorting according the frames 'y'. + return textInputViews.sorted(by: { (view1: any IQTextInputView, view2: any IQTextInputView) -> Bool in + + let frame1: CGRect = view1.convert(view1.bounds, to: base) + let frame2: CGRect = view2.convert(view2.bounds, to: base) + + if frame1.minY != frame2.minY { + return frame1.minY < frame2.minY + } else { + return frame1.minX < frame2.minX + } + }) + } +} + +@available(iOSApplicationExtension, unavailable) +@MainActor +private extension IQKeyboardExtension where Base: IQTextInputView { + + func canBecomeFirstResponder() -> Bool { + + var canBecomeFirstResponder: Bool = base?.iqIsEnabled == true + + if canBecomeFirstResponder { + canBecomeFirstResponder = base?.isUserInteractionEnabled == true && + base?.isHidden == false && + base?.alpha != 0.0 && + !isAlertViewTextField() && + textFieldSearchBar() == nil + } + + return canBecomeFirstResponder + } +} + +@available(iOSApplicationExtension, unavailable) +@MainActor +fileprivate extension IQTextInputView { + var internalIgnoreSwitchingByNextPrevious: Bool { + return iq.ignoreSwitchingByNextPrevious + } + func internalCanBecomeFirstResponder() -> Bool { + return iq.canBecomeFirstResponder() + } +} diff --git a/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/UIKitExtensions/UIView+RespondersObjc.swift b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/UIKitExtensions/UIView+RespondersObjc.swift new file mode 100644 index 0000000..f8113e6 --- /dev/null +++ b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/UIKitExtensions/UIView+RespondersObjc.swift @@ -0,0 +1,44 @@ +// +// UIView+RespondersObjc.swift +// https://github.com/hackiftekhar/IQKeyboardToolbar +// 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: +// +// 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. + +import UIKit + +// MARK: For ObjectiveC Compatibility + +// swiftlint:disable identifier_name +@objc public extension UITextField { + + var iq_ignoreSwitchingByNextPrevious: Bool { + get { iq.ignoreSwitchingByNextPrevious } + set { iq.ignoreSwitchingByNextPrevious = newValue } + } +} + +@objc public extension UITextView { + + var iq_ignoreSwitchingByNextPrevious: Bool { + get { iq.ignoreSwitchingByNextPrevious } + set { iq.ignoreSwitchingByNextPrevious = newValue } + } +} +// swiftlint:enable identifier_name diff --git a/Pods/IQKeyboardToolbarManager/LICENSE b/Pods/IQKeyboardToolbarManager/LICENSE new file mode 100644 index 0000000..5d8eb96 --- /dev/null +++ b/Pods/IQKeyboardToolbarManager/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 Mohd 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: + +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. diff --git a/Pods/IQKeyboardToolbarManager/README.md b/Pods/IQKeyboardToolbarManager/README.md new file mode 100644 index 0000000..1e995a9 --- /dev/null +++ b/Pods/IQKeyboardToolbarManager/README.md @@ -0,0 +1,134 @@ +# IQKeyboardToolbarManager + +[![CI Status](https://img.shields.io/travis/hackiftekhar/IQKeyboardToolbarManager.svg?style=flat)](https://travis-ci.org/hackiftekhar/IQKeyboardToolbarManager) +[![Version](https://img.shields.io/cocoapods/v/IQKeyboardToolbarManager.svg?style=flat)](https://cocoapods.org/pods/IQKeyboardToolbarManager) +[![License](https://img.shields.io/cocoapods/l/IQKeyboardToolbarManager.svg?style=flat)](https://cocoapods.org/pods/IQKeyboardToolbarManager) +[![Platform](https://img.shields.io/cocoapods/p/IQKeyboardToolbarManager.svg?style=flat)](https://cocoapods.org/pods/IQKeyboardToolbarManager) + +![Screenshot](https://raw.githubusercontent.com/hackiftekhar/IQKeyboardToolbarManager/master/Screenshot/IQKeyboardToolbarManagerScreenshot.png) + +## Example + +To run the example project, clone the repo, and run `pod install` from the Example directory first. + +## Requirements + +## Installation + +### Swift Package Manager (Recommended) + +IQKeyboardToolbarManager is available through [Swift Package Manager](https://swift.org/package-manager/). + +**Requirements:** iOS 13.0+, Swift 5.7+ + +#### Using Xcode: +1. In Xcode, go to `File` → `Add Package Dependencies...` +2. Enter the repository URL: `https://github.com/hackiftekhar/IQKeyboardToolbarManager` +3. Select the version rule (e.g., "Up to Next Major Version") +4. Click `Add Package` +5. Select the `IQKeyboardToolbarManager` library and click `Add Package` + +#### Using Package.swift: +Add the following dependency to your `Package.swift` file: + +```swift +dependencies: [ + .package(url: "https://github.com/hackiftekhar/IQKeyboardToolbarManager", from: "1.1.3") +] +``` + +Then add `IQKeyboardToolbarManager` to your target dependencies: + +```swift +.target( + name: "YourTarget", + dependencies: ["IQKeyboardToolbarManager"] +) +``` + +### CocoaPods + +IQKeyboardToolbarManager is also available through [CocoaPods](https://cocoapods.org). To install +it, simply add the following line to your Podfile: + +```ruby +pod 'IQKeyboardToolbarManager' +``` + +### Carthage + +Add the following line to your `Cartfile`: + +``` +github "hackiftekhar/IQKeyboardToolbarManager" +``` + +## Usage + +After adding IQKeyboardToolbarManager to your project, import it and enable toolbar handling in AppDelegate: + +```swift +import UIKit +import IQKeyboardToolbarManager + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + IQKeyboardToolbarManager.shared.isEnabled = true + return true + } +``` + +Cuistomize Behavior +```swift + IQKeyboardToolbarManager.shared.toolbarConfiguration.useTextInputViewTintColor = true + IQKeyboardToolbarManager.shared.toolbarConfiguration.tintColor = UIColor.systemGreen + IQKeyboardToolbarManager.shared.toolbarConfiguration.barTintColor = UIColor.systemYellow + IQKeyboardToolbarManager.shared.toolbarConfiguration.previousNextDisplayMode = .alwaysShow + IQKeyboardToolbarManager.shared.toolbarConfiguration.manageBehavior = .byPosition + + IQKeyboardToolbarManager.shared.toolbarConfiguration.previousBarButtonConfiguration = ... // BarButton configuration to change title, image or system image etc + IQKeyboardToolbarManager.shared.toolbarConfiguration.nextBarButtonConfiguration = ... // BarButton configuration to change title, image or system image etc + IQKeyboardToolbarManager.shared.toolbarConfiguration.doneBarButtonConfiguration = ... // BarButton configuration to change title, image or system image etc + + IQKeyboardToolbarManager.shared.toolbarConfiguration.placeholderConfiguration.showPlaceholder = false + IQKeyboardToolbarManager.shared.toolbarConfiguration.placeholderConfiguration.font = UIFont.italicSystemFont(ofSize: 14) + IQKeyboardToolbarManager.shared.toolbarConfiguration.placeholderConfiguration.color = UIColor.systemPurple + IQKeyboardToolbarManager.shared.toolbarConfiguration.placeholderConfiguration.buttonColor = UIColor.systemBrown // This is used only if placeholder is an action button + + IQKeyboardToolbarManager.shared.playInputClicks = false + + IQKeyboardToolbarManager.shared.disabledToolbarClasses.append(ChatViewController.self) + IQKeyboardToolbarManager.shared.enabledToolbarClasses.append(LoginViewController.self) + IQKeyboardToolbarManager.shared.deepResponderAllowedContainerClasses.append(UIStackView.self) +``` + +Useful functions and variables +```swift + if IQKeyboardToolbarManager.shared.canGoPrevious { + ... + } + + if IQKeyboardToolbarManager.shared.canGoNext { + ... + } + + IQKeyboardToolbarManager.shared.goPrevious() + IQKeyboardToolbarManager.shared.goNext() + + IQKeyboardToolbarManager.shared.reloadInputViews() // If some textInputView hierarchy are changed on the fly then use this to reload button states +``` + +Useful functions and variables for TextInputView +```swift + textField.iq.ignoreSwitchingByNextPrevious = false +``` + +## Author + +Iftekhar Qurashi hack.iftekhar@gmail.com + +## License + +IQKeyboardToolbarManager is available under the MIT license. See the LICENSE file for more info. diff --git a/Pods/IQTextInputViewNotification/IQTextInputViewNotification/Assets/PrivacyInfo.xcprivacy b/Pods/IQTextInputViewNotification/IQTextInputViewNotification/Assets/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..9021190 --- /dev/null +++ b/Pods/IQTextInputViewNotification/IQTextInputViewNotification/Assets/PrivacyInfo.xcprivacy @@ -0,0 +1,14 @@ + + + + + NSPrivacyAccessedAPITypes + + NSPrivacyTrackingDomains + + NSPrivacyCollectedDataTypes + + NSPrivacyTracking + + + diff --git a/Pods/IQTextInputViewNotification/IQTextInputViewNotification/Classes/IQTextInputViewInfo.swift b/Pods/IQTextInputViewNotification/IQTextInputViewNotification/Classes/IQTextInputViewInfo.swift new file mode 100644 index 0000000..dfc954a --- /dev/null +++ b/Pods/IQTextInputViewNotification/IQTextInputViewNotification/Classes/IQTextInputViewInfo.swift @@ -0,0 +1,91 @@ +// +// IQTextInputViewInfo.swift +// https://github.com/hackiftekhar/IQTextInputViewNotification +// 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: +// +// 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. + +import UIKit +public import IQKeyboardCore + +@available(iOSApplicationExtension, unavailable) +@MainActor +public struct IQTextInputViewInfo: Equatable { + + nonisolated public static func == (lhs: Self, rhs: Self) -> Bool { + return lhs.textInputView == rhs.textInputView && + lhs.event == rhs.event + } + + @MainActor + @objc public enum Event: Int { + case beginEditing + case endEditing + + public var name: String { + switch self { + case .beginEditing: + return "BeginEditing" + case .endEditing: + return "EndEditing" + } + } + } + + public let event: Event + + public let textInputView: any IQTextInputView + + internal init?(notification: Notification, event: Event) { + guard let view: any IQTextInputView = notification.object as? (any IQTextInputView) else { + return nil + } + + self.event = event + textInputView = view + } +} + +// MARK: Deprecated +@available(iOSApplicationExtension, unavailable) +public extension IQTextInputViewInfo { + + @available(*, unavailable, renamed: "event") + var name: Event { event } + + @available(*, unavailable, renamed: "textInputView") + var textFieldView: any IQTextInputView { textInputView } +} + +@available(*, unavailable, renamed: "IQTextInputViewInfo") +@MainActor +public struct IQTextFieldViewInfo: Equatable {} + +@available(iOSApplicationExtension, unavailable) +@objcMembers public class IQTextInputViewInfoObjC: NSObject { + private let wrappedValue: IQTextInputViewInfo + + public var event: IQTextInputViewInfo.Event { wrappedValue.event } + + public var textInputView: any IQTextInputView { wrappedValue.textInputView } + + init(wrappedValue: IQTextInputViewInfo){ + self.wrappedValue = wrappedValue + } +} diff --git a/Pods/IQTextInputViewNotification/IQTextInputViewNotification/Classes/IQTextInputViewNotification.swift b/Pods/IQTextInputViewNotification/IQTextInputViewNotification/Classes/IQTextInputViewNotification.swift new file mode 100644 index 0000000..61bfd40 --- /dev/null +++ b/Pods/IQTextInputViewNotification/IQTextInputViewNotification/Classes/IQTextInputViewNotification.swift @@ -0,0 +1,196 @@ +// +// IQTextInputViewNotification.swift +// https://github.com/hackiftekhar/IQTextInputViewNotification +// 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: +// +// 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. + +import UIKit +import Combine +public import IQKeyboardCore + +@available(iOSApplicationExtension, unavailable) +@MainActor +@objcMembers public final class IQTextInputViewNotification: NSObject { + + private var storage: Set = [] + + private var textInputViewObservers: [AnyHashable: TextInputViewCompletion] = [:] + + private var findInteractionTextInputViewInfo: IQTextInputViewInfo? + + public private(set) var textInputViewInfo: IQTextInputViewInfo? + + public var event: IQTextInputViewInfo.Event? { + textInputViewInfo?.event + } + + public var textInputView: (any IQTextInputView)? { + return textInputViewInfo?.textInputView + } + + public override init() { + super.init() + + // Registering for TextInputView notification. + do { + let beginEditingNotificationNames: [Notification.Name] = [ + UITextField.textDidBeginEditingNotification, + UITextView.textDidBeginEditingNotification + ] + + for notificationName in beginEditingNotificationNames { + NotificationCenter.default.publisher(for: notificationName) + .compactMap({ IQTextInputViewInfo(notification: $0, event: .beginEditing) }) + .sink(receiveValue: { [weak self] info in + guard let self = self else { return } + self.didBeginEditing(info: info) + }) + .store(in: &storage) + } + } + + do { + let endEditingNotificationNames: [Notification.Name] = [ + UITextField.textDidEndEditingNotification, + UITextView.textDidEndEditingNotification + ] + + for notificationName in endEditingNotificationNames { + NotificationCenter.default.publisher(for: notificationName) + .compactMap({ IQTextInputViewInfo(notification: $0, event: .endEditing) }) + .sink(receiveValue: { [weak self] info in + guard let self = self else { return } + self.didEndEditing(info: info) + }) + .store(in: &storage) + } + } + } + + private func didBeginEditing(info: IQTextInputViewInfo) { + +#if compiler(>=5.7) // Xcode 14 + if #available(iOS 16.0, *), + let findInteractionTextInputViewInfo = findInteractionTextInputViewInfo, + findInteractionTextInputViewInfo.textInputView.iqFindInteraction?.isFindNavigatorVisible == true { + // // This means the this didBeginEditing call comes due to find interaction + textInputViewInfo = findInteractionTextInputViewInfo + sendEvent(info: findInteractionTextInputViewInfo) + } else if textInputViewInfo != info { + textInputViewInfo = info + findInteractionTextInputViewInfo = nil + sendEvent(info: info) + } else { + findInteractionTextInputViewInfo = nil + } +#else + if textInputViewInfo != info { + textInputViewInfo = info + findInteractionTextInputViewInfo = nil + sendEvent(info: info) + } else { + findInteractionTextInputViewInfo = nil + } +#endif + } + + private func didEndEditing(info: IQTextInputViewInfo) { + + if textInputViewInfo != info { +#if compiler(>=5.7) // Xcode 14 + if #available(iOS 16.0, *), + info.textInputView.iqIsFindInteractionEnabled { + findInteractionTextInputViewInfo = textInputViewInfo + } else { + findInteractionTextInputViewInfo = nil + } +#else + findInteractionTextInputViewInfo = nil +#endif + textInputViewInfo = info + sendEvent(info: info) + textInputViewInfo = nil + } + } +} + +@available(iOSApplicationExtension, unavailable) +@MainActor +@objc public extension IQTextInputViewNotification { + + typealias TextInputViewCompletion = (_ event: IQTextInputViewInfo.Event, + _ textInputView: any IQTextInputView) -> Void + + func subscribe(identifier: AnyHashable, changeHandler: @escaping TextInputViewCompletion) { + textInputViewObservers[identifier] = changeHandler + + if let textInputViewInfo = textInputViewInfo { + changeHandler(textInputViewInfo.event, textInputViewInfo.textInputView) + } + } + + func unsubscribe(identifier: AnyHashable) { + textInputViewObservers[identifier] = nil + } + + func isSubscribed(identifier: AnyHashable) -> Bool { + return textInputViewObservers[identifier] != nil + } + + @nonobjc + private func sendEvent(info: IQTextInputViewInfo) { + + for block in textInputViewObservers.values { + block(info.event, info.textInputView) + } + } +} + +// MARK: Deprecated +@available(iOSApplicationExtension, unavailable) +@MainActor +public extension IQTextInputViewNotification { + + @available(*, unavailable, renamed: "textInputViewInfo") + var textFieldViewInfo: IQTextInputViewInfo? { textInputViewInfo } + + @available(*, unavailable, renamed: "textInputView") + var textFieldView: (some IQTextInputView)? { textInputView } + + @available(*, unavailable, renamed: "subscribe(identifier:changeHandler:)") + func registerTextFieldViewChange(identifier: AnyHashable, changeHandler: @escaping TextInputViewCompletion) {} + + @available(*, unavailable, renamed: "unsubscribe(identifier:)") + func unregisterSizeChange(identifier: AnyHashable) {} +} + +@available(*, unavailable, renamed: "IQTextInputViewNotification") +@MainActor +@objcMembers public final class IQTextFieldViewListener: NSObject {} + +@available(iOSApplicationExtension, unavailable) +@MainActor +@objc public extension IQTextInputViewNotification { + + var textInputViewInfoObjc: IQTextInputViewInfoObjC? { + guard let textInputViewInfo = textInputViewInfo else { return nil } + return IQTextInputViewInfoObjC(wrappedValue: textInputViewInfo) + } +} diff --git a/Pods/IQTextInputViewNotification/LICENSE b/Pods/IQTextInputViewNotification/LICENSE new file mode 100644 index 0000000..4440a40 --- /dev/null +++ b/Pods/IQTextInputViewNotification/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2024 hackiftekhar + +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 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. diff --git a/Pods/IQTextInputViewNotification/README.md b/Pods/IQTextInputViewNotification/README.md new file mode 100644 index 0000000..3926512 --- /dev/null +++ b/Pods/IQTextInputViewNotification/README.md @@ -0,0 +1,66 @@ +# IQTextInputViewNotification + +[![CI Status](https://img.shields.io/travis/hackiftekhar/IQTextInputViewNotification.svg?style=flat)](https://travis-ci.org/hackiftekhar/IQTextInputViewNotification) +[![Version](https://img.shields.io/cocoapods/v/IQTextInputViewNotification.svg?style=flat)](https://cocoapods.org/pods/IQTextInputViewNotification) +[![License](https://img.shields.io/cocoapods/l/IQTextInputViewNotification.svg?style=flat)](https://cocoapods.org/pods/IQTextInputViewNotification) +[![Platform](https://img.shields.io/cocoapods/p/IQTextInputViewNotification.svg?style=flat)](https://cocoapods.org/pods/IQTextInputViewNotification) + +![Screenshot](https://raw.githubusercontent.com/hackiftekhar/IQTextInputViewNotification/master/Screenshot/IQTextInputViewNotificationScreenshot.png) + +## Example + +To run the example project, clone the repo, and run `pod install` from the Example directory first. + +## Requirements + +## Installation + +IQTextInputViewNotification is available through [CocoaPods](https://cocoapods.org). To install +it, simply add the following line to your Podfile: + +```ruby +pod 'IQTextInputViewNotification' +``` + +## Usage + +To observe textInputView becomeFirstResponder and resignFirstResponder changes, subscribe to the textInputView events:- + +```swift +import IQTextInputViewNotification + +class ViewController: UIViewController { + + private let textInputViewObserver: IQTextInputViewNotification = .init() + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + + // Subscribe + textInputViewObserver.subscribe(identifier: "YOUR_UNIQUE_IDENTIFIER") {info in + print(info.event.name) // BeginEditing or EndEditing event + print(info.textInputView) // TextInputView which begin editing or end editing + // Write your own logic here based on event + } + } + + override func viewWillDisappear(_ animated: Bool) { + super.viewWillDisappear(animated) + + // Unsubscribe + textInputViewObserver.unsubscribe(identifier: "YOUR_UNIQUE_IDENTIFIER") + } +} +``` + +## Author + +Iftekhar Qurashi hack.iftekhar@gmail.com + +## Flow + +![Screenshot](https://raw.githubusercontent.com/hackiftekhar/IQTextInputViewNotification/master/Screenshot/FlowDiagram.jpg) + +## License + +IQTextInputViewNotification is available under the MIT license. See the LICENSE file for more info. diff --git a/Pods/IQTextView/IQTextView/Assets/PrivacyInfo.xcprivacy b/Pods/IQTextView/IQTextView/Assets/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..9021190 --- /dev/null +++ b/Pods/IQTextView/IQTextView/Assets/PrivacyInfo.xcprivacy @@ -0,0 +1,14 @@ + + + + + NSPrivacyAccessedAPITypes + + NSPrivacyTrackingDomains + + NSPrivacyCollectedDataTypes + + NSPrivacyTracking + + + diff --git a/Pods/IQTextView/IQTextView/Classes/IQTextView+Placeholderable.swift b/Pods/IQTextView/IQTextView/Classes/IQTextView+Placeholderable.swift new file mode 100644 index 0000000..1cf3954 --- /dev/null +++ b/Pods/IQTextView/IQTextView/Classes/IQTextView+Placeholderable.swift @@ -0,0 +1,29 @@ +// +// IQTextView.swift +// https://github.com/hackiftekhar/IQTextView +// 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: +// +// 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. + +import UIKit +import IQKeyboardToolbar + +@available(iOSApplicationExtension, unavailable) +@MainActor +@objc extension IQTextView: IQPlaceholderable { } diff --git a/Pods/IQTextView/IQTextView/Classes/IQTextView.swift b/Pods/IQTextView/IQTextView/Classes/IQTextView.swift new file mode 100644 index 0000000..9c49e51 --- /dev/null +++ b/Pods/IQTextView/IQTextView/Classes/IQTextView.swift @@ -0,0 +1,193 @@ +// +// IQTextView.swift +// https://github.com/hackiftekhar/IQTextView +// 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: +// +// 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. + +import UIKit + +/** @abstract UITextView with placeholder support */ +@available(iOSApplicationExtension, unavailable) +@MainActor +@objcMembers open class IQTextView: UITextView { + + required public init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + setup() + } + + override public init(frame: CGRect, textContainer: NSTextContainer?) { + super.init(frame: frame, textContainer: textContainer) + setup() + } + + override open func awakeFromNib() { + super.awakeFromNib() + setup() + } + + private func setup() { + NotificationCenter.default.addObserver(self, selector: #selector(self.refreshPlaceholder), + name: UITextView.textDidChangeNotification, object: self) + + do { + placeholderLabel.frame = placeholderExpectedFrame + placeholderLabel.autoresizingMask = [.flexibleWidth, .flexibleHeight] + placeholderLabel.lineBreakMode = .byWordWrapping + placeholderLabel.numberOfLines = 0 + placeholderLabel.font = self.font + placeholderLabel.textAlignment = self.textAlignment + placeholderLabel.backgroundColor = UIColor.clear + placeholderLabel.isAccessibilityElement = false + placeholderLabel.textColor = UIColor.placeholderText + self.addSubview(placeholderLabel) + refreshPlaceholder() + } + } + + private var placeholderInsets: UIEdgeInsets { + let top: CGFloat = self.textContainerInset.top + let left: CGFloat = self.textContainerInset.left + self.textContainer.lineFragmentPadding + let bottom: CGFloat = self.textContainerInset.bottom + let right: CGFloat = self.textContainerInset.right + self.textContainer.lineFragmentPadding + return UIEdgeInsets(top: top, left: left, bottom: bottom, right: right) + } + + private var placeholderExpectedFrame: CGRect { + let insets: UIEdgeInsets = self.placeholderInsets + let maxWidth: CGFloat = self.frame.width-insets.left-insets.right + let size: CGSize = CGSize(width: maxWidth, height: self.frame.height-insets.top-insets.bottom) + let expectedSize: CGSize = placeholderLabel.sizeThatFits(size) + + return CGRect(x: insets.left, y: insets.top, width: maxWidth, height: expectedSize.height) + } + + public let placeholderLabel: UILabel = .init() + + /** @abstract To set textView's placeholder text color. */ + @IBInspectable open var placeholderTextColor: UIColor? { + + get { + return placeholderLabel.textColor + } + + set { + placeholderLabel.textColor = newValue + } + } + + /** @abstract To set textView's placeholder text. Default is nil. */ + @IBInspectable open var placeholder: String? { + + get { + return placeholderLabel.text + } + + set { + placeholderLabel.text = newValue + refreshPlaceholder() + } + } + + /** @abstract To set textView's placeholder attributed text. Default is nil. */ + open var attributedPlaceholder: NSAttributedString? { + get { + return placeholderLabel.attributedText + } + + set { + placeholderLabel.attributedText = newValue + refreshPlaceholder() + } + } + + open override func layoutSubviews() { + super.layoutSubviews() + + placeholderLabel.frame = placeholderExpectedFrame + } + + @objc private func refreshPlaceholder() { + + let text: String = text ?? attributedText?.string ?? "" + placeholderLabel.alpha = text.isEmpty ? 1 : 0 + } + + open override var text: String! { + + didSet { + refreshPlaceholder() + } + } + + open override var attributedText: NSAttributedString! { + + didSet { + refreshPlaceholder() + } + } + + open override var font: UIFont? { + + didSet { + + if let font: UIFont = font { + placeholderLabel.font = font + } else { + placeholderLabel.font = UIFont.systemFont(ofSize: 12) + } + } + } + + open override var textAlignment: NSTextAlignment { + didSet { + placeholderLabel.textAlignment = textAlignment + } + } + + open override var intrinsicContentSize: CGSize { + guard !hasText else { + return super.intrinsicContentSize + } + + var newSize: CGSize = super.intrinsicContentSize + let placeholderInsets: UIEdgeInsets = self.placeholderInsets + newSize.height = placeholderExpectedFrame.height + placeholderInsets.top + placeholderInsets.bottom + + return newSize + } + + open override func caretRect(for position: UITextPosition) -> CGRect { + var originalRect = super.caretRect(for: position) + + // When placeholder is visible and text alignment is centered + guard placeholderLabel.alpha == 1 && self.textAlignment == .center else { return originalRect } + + // Calculate the width of the placeholder text + let font = placeholderLabel.font ?? UIFont.systemFont(ofSize: UIFont.systemFontSize) + let textSize = placeholderLabel.text?.size(withAttributes: [.font: font]) ?? .zero + // Calculate the starting x position of the centered placeholder text + let centeredTextX = (self.bounds.size.width - textSize.width) / 2 + // Update the caret position to match the starting x position of the centered text + originalRect.origin.x = centeredTextX + + return originalRect + } +} diff --git a/Pods/IQTextView/LICENSE b/Pods/IQTextView/LICENSE new file mode 100644 index 0000000..5d8eb96 --- /dev/null +++ b/Pods/IQTextView/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 Mohd 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: + +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. diff --git a/Pods/IQTextView/README.md b/Pods/IQTextView/README.md new file mode 100644 index 0000000..417325e --- /dev/null +++ b/Pods/IQTextView/README.md @@ -0,0 +1,48 @@ +# IQTextView + +[![CI Status](https://img.shields.io/travis/hackiftekhar/IQTextView.svg?style=flat)](https://travis-ci.org/hackiftekhar/IQTextView) +[![Version](https://img.shields.io/cocoapods/v/IQTextView.svg?style=flat)](https://cocoapods.org/pods/IQTextView) +[![License](https://img.shields.io/cocoapods/l/IQTextView.svg?style=flat)](https://cocoapods.org/pods/IQTextView) +[![Platform](https://img.shields.io/cocoapods/p/IQTextView.svg?style=flat)](https://cocoapods.org/pods/IQTextView) + +![Screenshot](https://raw.githubusercontent.com/hackiftekhar/IQTextView/master/Screenshot/IQTextViewScreenshot.png) + +## Example + +To run the example project, clone the repo, and run `pod install` from the Example directory first. + +## Requirements + +## Installation + +IQTextView is available through [CocoaPods](https://cocoapods.org). To install +it, simply add the following line to your Podfile: + +```ruby +pod 'IQTextView' +``` + +## Usage + +You can set any UITextView class to IQTextView and then you can change the placeholder and placeholderTextColor from the storyboard + +To change them via code, you may have to set them programmatically +```swift +textView.placeholderTextColor = UIColor.lightGray +textView.placeholder = "Enter your message here..." +``` + +To work this with IQKeyboardToolbarManager to show placeholder in toolbar, you may have to confirm IQPlaceholderable manually in your code +```swift +@available(iOSApplicationExtension, unavailable) +@MainActor +extension IQTextView: IQPlaceholderable { } +``` + +## Author + +Iftekhar Qurashi hack.iftekhar@gmail.com + +## License + +IQTextView is available under the MIT license. See the LICENSE file for more info. diff --git a/Pods/Manifest.lock b/Pods/Manifest.lock index 48e9e52..03ed760 100644 --- a/Pods/Manifest.lock +++ b/Pods/Manifest.lock @@ -6,6 +6,46 @@ PODS: - AMapFoundation-NO-IDFA (>= 1.9.0) - AMapSearch-NO-IDFA (9.8.0): - AMapFoundation-NO-IDFA (>= 1.9.0) + - IQKeyboardCore (1.0.9) + - IQKeyboardManagerSwift (8.0.3): + - IQKeyboardManagerSwift/Appearance (= 8.0.3) + - IQKeyboardManagerSwift/Core (= 8.0.3) + - IQKeyboardManagerSwift/IQKeyboardReturnManager (= 8.0.3) + - IQKeyboardManagerSwift/IQKeyboardToolbarManager (= 8.0.3) + - IQKeyboardManagerSwift/IQTextView (= 8.0.3) + - IQKeyboardManagerSwift/Resign (= 8.0.3) + - IQKeyboardManagerSwift/Appearance (8.0.3): + - IQKeyboardManagerSwift/Core + - IQTextInputViewNotification + - IQKeyboardManagerSwift/Core (8.0.3): + - IQKeyboardNotification + - IQTextInputViewNotification + - IQKeyboardManagerSwift/IQKeyboardReturnManager (8.0.3): + - IQKeyboardReturnManager + - IQKeyboardManagerSwift/IQKeyboardToolbarManager (8.0.3): + - IQKeyboardManagerSwift/Core + - IQKeyboardToolbarManager + - IQKeyboardManagerSwift/IQTextView (8.0.3): + - IQTextView + - IQKeyboardManagerSwift/Resign (8.0.3): + - IQKeyboardManagerSwift/Core + - IQTextInputViewNotification + - IQKeyboardNotification (1.0.7) + - IQKeyboardReturnManager (1.0.6): + - IQKeyboardCore + - IQKeyboardToolbar (1.1.5): + - IQKeyboardToolbar/Core (= 1.1.5) + - IQKeyboardToolbar/Core (1.1.5): + - IQKeyboardCore + - IQKeyboardToolbar/Placeholderable + - IQKeyboardToolbar/Placeholderable (1.1.5) + - IQKeyboardToolbarManager (1.1.6): + - IQKeyboardToolbar + - IQTextInputViewNotification + - IQTextInputViewNotification (1.0.9): + - IQKeyboardCore + - IQTextView (1.0.5): + - IQKeyboardToolbar/Placeholderable - UMAPM (2.0.7): - UMCommon - UMCommon (7.5.11): @@ -17,6 +57,7 @@ DEPENDENCIES: - AMap3DMap-NO-IDFA - AMapLocation-NO-IDFA - AMapSearch-NO-IDFA + - IQKeyboardManagerSwift - UMAPM - UMCommon - UMDevice @@ -28,6 +69,14 @@ SPEC REPOS: - AMapFoundation-NO-IDFA - AMapLocation-NO-IDFA - AMapSearch-NO-IDFA + - IQKeyboardCore + - IQKeyboardManagerSwift + - IQKeyboardNotification + - IQKeyboardReturnManager + - IQKeyboardToolbar + - IQKeyboardToolbarManager + - IQTextInputViewNotification + - IQTextView - UMAPM - UMCommon - UMDevice @@ -38,11 +87,19 @@ SPEC CHECKSUMS: AMapFoundation-NO-IDFA: a2e3c895398d7ee757278e1a0a8f9359da4b146e AMapLocation-NO-IDFA: 7cd8fc837ea41edfbf4d937cd20572e277b77d18 AMapSearch-NO-IDFA: c0afd2a69a076d4228becda4401dbe4a279a03ef + IQKeyboardCore: 250a88dfc713b2ecbe1dce250811d054fc016959 + IQKeyboardManagerSwift: 7f6a9a1e2285732d3ff5f485ff921215253ea77e + IQKeyboardNotification: 3b9bc812a5af2cf97df08a363d9daa9fc0dc1848 + IQKeyboardReturnManager: fcbf51fc68d7536fc1fbcca5231c4e82576b12ac + IQKeyboardToolbar: b0f26e43b9e806e961fde2344fe379ae193236b9 + IQKeyboardToolbarManager: 242e858cc74e06e00aa989bea1355b24d4397854 + IQTextInputViewNotification: 3b9fb27a16e7ee8958cc9092cfb07a1a9e1fd559 + IQTextView: ae13b4922f22e6f027f62c557d9f4f236b19d5c7 UMAPM: ba9fbebe8dd2048b251c332ab0afc86e1ba5ea63 UMCommon: d652b3b372a801b36db203f5b546ab3e15676898 UMDevice: 20b7b3c37a36b2c5c7ca8b5a54386ff9ed2b3b19 WechatOpenSDK-XCFramework: ff342ae616bb86df3d236aca38059dfd4bc4a949 -PODFILE CHECKSUM: f48a71990c19e75f00e16701179b4f160e74986f +PODFILE CHECKSUM: 0fd38f741cbaae39c8e7a70fa233f651d3b34d0f COCOAPODS: 1.16.2 diff --git a/Pods/Pods.xcodeproj/project.pbxproj b/Pods/Pods.xcodeproj/project.pbxproj index 5a6dda6..ceb649a 100644 --- a/Pods/Pods.xcodeproj/project.pbxproj +++ b/Pods/Pods.xcodeproj/project.pbxproj @@ -9,12 +9,12 @@ /* Begin PBXAggregateTarget section */ 09FABB7D06BB8D3958515FB15B4E7971 /* UMCommon */ = { isa = PBXAggregateTarget; - buildConfigurationList = 4BD363A7955A50B752C0F2EE46DF82FA /* Build configuration list for PBXAggregateTarget "UMCommon" */; + buildConfigurationList = 644D892EDFA6381DC82D71DC5C2F8D6F /* Build configuration list for PBXAggregateTarget "UMCommon" */; buildPhases = ( - EF0E3FC9B6EE1A9C908433C323228B7C /* [CP] Copy XCFrameworks */, + FBE5DA9F98D23090BE0A41FECC364DF2 /* [CP] Copy XCFrameworks */, ); dependencies = ( - 21EC4402F23CC89322584C4190C64981 /* PBXTargetDependency */, + 0F7A67AD8E9321DD125EDE4532C7B621 /* PBXTargetDependency */, ); name = UMCommon; }; @@ -24,7 +24,7 @@ buildPhases = ( ); dependencies = ( - AF80A180C5B3841DFC72A45C419B14BC /* PBXTargetDependency */, + 33555EC29BF8027B235703241C066690 /* PBXTargetDependency */, ); name = "AMapLocation-NO-IDFA"; }; @@ -34,7 +34,7 @@ buildPhases = ( ); dependencies = ( - 29F474965F0AB7D17DB4A3D89EA9E86F /* PBXTargetDependency */, + EFD4EFE6FD52288812EE28A45E4AF5D9 /* PBXTargetDependency */, ); name = "AMapSearch-NO-IDFA"; }; @@ -50,7 +50,7 @@ }; 9B182CB4E1716E9070813D3C59736001 /* AMapFoundation-NO-IDFA */ = { isa = PBXAggregateTarget; - buildConfigurationList = 946C13012BDBDC56DC9D26E19BA9D129 /* Build configuration list for PBXAggregateTarget "AMapFoundation-NO-IDFA" */; + buildConfigurationList = D55DE508D232101A9401C119066B1179 /* Build configuration list for PBXAggregateTarget "AMapFoundation-NO-IDFA" */; buildPhases = ( ); dependencies = ( @@ -63,15 +63,15 @@ buildPhases = ( ); dependencies = ( - 39E8D398FFF9E2EF5EFCC030000214A6 /* PBXTargetDependency */, + 35ADED26003EA4A70C9A299D7FE29C82 /* PBXTargetDependency */, ); name = "AMap3DMap-NO-IDFA"; }; CEB9AD2C3CFC208BFBE1F22F5EC3E1FC /* UMDevice */ = { isa = PBXAggregateTarget; - buildConfigurationList = B9E2AB2044DB991A9B55D980CEBF2D9A /* Build configuration list for PBXAggregateTarget "UMDevice" */; + buildConfigurationList = B4B24BD4D38051C4B3F72F56A9E471F1 /* Build configuration list for PBXAggregateTarget "UMDevice" */; buildPhases = ( - EFB006F9E64CF4C9C37AA7A9DEC5BE68 /* [CP] Copy XCFrameworks */, + 1FBBEABC5CD4F9D8B761ABFBC501A335 /* [CP] Copy XCFrameworks */, ); dependencies = ( ); @@ -84,281 +84,877 @@ 47CF44479ABE0A5C18DEDA0F07935DF1 /* [CP] Copy XCFrameworks */, ); dependencies = ( - 4EB0F71C76E065029AE9C426A2B43B81 /* PBXTargetDependency */, + D479FCE32A53C8D1560C1DC682887585 /* PBXTargetDependency */, ); name = UMAPM; }; /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ - 1B4E84392BCAE40B8D02294001544906 /* Pods-suixinkanTests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 65EE9CD76EF8BD358253184A5FA8B069 /* Pods-suixinkanTests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 38345B1EC1DA5F3668EE44701253E92A /* Pods-suixinkan-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = BF228B17BC7260C40143BD13BD131504 /* Pods-suixinkan-dummy.m */; }; - 854C28C6CC7D858B9645ED10D409AF6C /* Pods-suixinkan-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = CE36A961B0F78784EC9BFE7F48C84F82 /* Pods-suixinkan-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8AA66BD0572CCDC71153FEA95C7AB666 /* Pods-suixinkanTests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = BBC4E88072A58FC7DD14D5BC2316725E /* Pods-suixinkanTests-dummy.m */; }; - 914AE43A691016D126083E13CFD8919F /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 384DDA2CB25005BD6479B5987C619DD4 /* Foundation.framework */; }; - 9EDCFA51CF55ABD87CD178D9700B89C7 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 384DDA2CB25005BD6479B5987C619DD4 /* Foundation.framework */; }; + 01216C042B056FFF0FC7EE32A002C38A /* IQKeyboardCore-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 12577E7D396AF4A0D52E8BF9EAB0B178 /* IQKeyboardCore-dummy.m */; }; + 01772F3F31A552C1898094C34995FBFF /* IQKeyboardReturnManager+UITextFieldDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE29BCA8BFDA54E4CD9B0D3354642A00 /* IQKeyboardReturnManager+UITextFieldDelegate.swift */; }; + 01F707D90E40C64CEF6B0130CD6A178E /* UIView+RespondersObjc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 538CBFD998EF3722E7689C6296456C1C /* UIView+RespondersObjc.swift */; }; + 03B31AAA8FE764D9264C465B87FF5958 /* IQKeyboardToolbarManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05DAA96D10BBDD4CD0563EF76883B8CA /* IQKeyboardToolbarManager.swift */; }; + 054617E019D116086EBE9EE351830049 /* IQKeyboardToolbar-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 98C600FCCEF4A91D173BC8EFDC782856 /* IQKeyboardToolbar-dummy.m */; }; + 065F8A3FABA2CA581B78AC88FCC1DF04 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 647AECC2271497CFBB36311165FC0BF0 /* UIKit.framework */; }; + 066ED3786057BC51273F52D91A507355 /* IQKeyboardToolbarManager+Toolbar.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8A2FAE36062DB36A7A86FD2D8816B14 /* IQKeyboardToolbarManager+Toolbar.swift */; }; + 0722BBD7A89C873C7C0E877B434244D8 /* IQKeyboardReturnManager+UITextViewDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C330EE82C2618812608F6AE8A6E63A9 /* IQKeyboardReturnManager+UITextViewDelegate.swift */; }; + 07609DBC62C85DFEEECD636C0653127E /* IQKeyboardManager+Resign.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9DC6694ECD3E3A0881A97E842D83D49 /* IQKeyboardManager+Resign.swift */; }; + 0C9FB8BAE5BAD8ED89791BD43900B800 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 647AECC2271497CFBB36311165FC0BF0 /* UIKit.framework */; }; + 100A572B2597C5AD09168107D45F9929 /* Combine.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 030EAF35766AF14A0C9409424A6C2B82 /* Combine.framework */; }; + 13AAA3B389AEE7BFD334A90B67B9509B /* IQKeyboardReturnManager-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = E609D1C2E46F6003B156E9308AED0D51 /* IQKeyboardReturnManager-dummy.m */; }; + 13B75C893C5241E8C6D4A8A7C1FE56C9 /* IQKeyboardManager+Position.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E4BF580BDA53A23D79EE15962CCF36C /* IQKeyboardManager+Position.swift */; }; + 16A2854239094F2F08D7D8A0579E7CA4 /* UIView+IQKeyboardExtensionDeprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C0982FA7F37AF2EF650B5353744211C /* UIView+IQKeyboardExtensionDeprecated.swift */; }; + 189A6E9D301AAF25AE03E5696A0539D7 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6464447070DB8A1E9C56338928A9DC0F /* Foundation.framework */; }; + 1A0ED97718867A07C7020B8BBD889B25 /* UIView+Parent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D9EBCEF6F3F2A232E2FD51767D24513 /* UIView+Parent.swift */; }; + 1B4E84392BCAE40B8D02294001544906 /* Pods-suixinkanTests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 8DB9F697E059AD84BBE6DB6241D65A19 /* Pods-suixinkanTests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1DFA9FF0E56B7211CC945955627F680B /* IQTextView+Placeholderable.swift in Sources */ = {isa = PBXBuildFile; fileRef = E0138A528AE020D49E92C528899B69E6 /* IQTextView+Placeholderable.swift */; }; + 2188FDE07E4F76E9F50623C7DEC91B90 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 647AECC2271497CFBB36311165FC0BF0 /* UIKit.framework */; }; + 25C8C1DC571620C676F59FEBA032B95F /* IQKeyboardManager+Debug.swift in Sources */ = {isa = PBXBuildFile; fileRef = C318D1B54A3D843401F9DA4933592E1B /* IQKeyboardManager+Debug.swift */; }; + 2C9181EF6A244D525D5CDE45CC776350 /* IQKeyboardToolbar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 68F50E3C54264FA6F8FEC4D7C86F2A8E /* IQKeyboardToolbar.swift */; }; + 2E2E33A7CE9A23D5A01049599E8ED1B4 /* IQKeyboardManager+Appearance.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2036A3FB465FF366E97BF39DEE669F09 /* IQKeyboardManager+Appearance.swift */; }; + 371EE3B1682699E7C9A8F2835032478E /* UIView+IQKeyboardExtensionObjc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B35E9590B445883D21697E01ACFFF1E /* UIView+IQKeyboardExtensionObjc.swift */; }; + 378BD5280F6C07B11CF30B253D824972 /* IQKeyboardExtended.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB7F6E3397C4BCFEFDBC1AFAF7AD8F64 /* IQKeyboardExtended.swift */; }; + 3AA85F341A703A0E91707613BC1FBB2F /* UIView+ParentObjc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E7C51C9D03E4F23E428C0C1AFFE32A7 /* UIView+ParentObjc.swift */; }; + 3AFBD37DF163254F6695A0CF8105B741 /* IQTextView-IQTextView in Resources */ = {isa = PBXBuildFile; fileRef = 847044E56CBBCE1235A6F3CEF3F9F607 /* IQTextView-IQTextView */; }; + 3BDC0695F069416FED48F824C55F90AB /* UICollectionView+IndexPaths.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7EC30B9EBF71A33CFE3B7A50F7A262A1 /* UICollectionView+IndexPaths.swift */; }; + 3E715D5BADDEACEEF30D6A4CA82CDA9B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6464447070DB8A1E9C56338928A9DC0F /* Foundation.framework */; }; + 3EE43A1A7294F331DA0172D3DA2DE250 /* IQTextInputViewNotification-IQTextInputViewNotification in Resources */ = {isa = PBXBuildFile; fileRef = F956E149F5B195BB7833F97FC6211AE8 /* IQTextInputViewNotification-IQTextInputViewNotification */; }; + 4C35AD6D6C1964E0B62736D44627D9BF /* IQScrollViewConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3B88D3B9242AE15CCC3E92D2613A589 /* IQScrollViewConfiguration.swift */; }; + 4E012E4A4CE4435DF6D829CB6904687D /* IQBarButtonItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63070DE77E76B5B254CA451C68509EF5 /* IQBarButtonItem.swift */; }; + 50A311C55B25BE8EA6B5C20EDAF6E231 /* UIView+IQKeyboardManagerExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0A209F6A3ED70A0B4E017DDC44D73C2 /* UIView+IQKeyboardManagerExtension.swift */; }; + 540CFC9075EC06780C6F934353584833 /* IQTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FED7E40B8371E0302367A1C49C8E619E /* IQTextView.swift */; }; + 576EBE7A8D8A0C1E332CC7479B95B08A /* IQKeyboardNotification-IQKeyboardNotification in Resources */ = {isa = PBXBuildFile; fileRef = 120BD4C670EF00F4D5A40AA4B863A7AE /* IQKeyboardNotification-IQKeyboardNotification */; }; + 57B5DEB0C98D408C28CEE2B381C1964D /* IQKeyboardToolbarConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2DFAB27A0DAF494EABA388687CED00A /* IQKeyboardToolbarConstants.swift */; }; + 5C2FE44A1373EE5446FB2094E0CCE0E9 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 647AECC2271497CFBB36311165FC0BF0 /* UIKit.framework */; }; + 5E310DC66AA22AA31602DAD6B8A7C787 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6464447070DB8A1E9C56338928A9DC0F /* Foundation.framework */; }; + 61BDE8E1D8CFD674C6CCD41C70CB981D /* Combine.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 030EAF35766AF14A0C9409424A6C2B82 /* Combine.framework */; }; + 62CD171ED278181D9297D4FC844F7023 /* UIView+IQKeyboardExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED47720D629B7CC0D7D00CF5C5E40FF0 /* UIView+IQKeyboardExtension.swift */; }; + 688879C0DA9CFC4701AB33689DFAA299 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 647AECC2271497CFBB36311165FC0BF0 /* UIKit.framework */; }; + 69657BED56A2DDAE4D94D0FF7F296F48 /* IQKeyboardManager+Appearance_Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE0A38788022564F1272806A4515ED11 /* IQKeyboardManager+Appearance_Deprecated.swift */; }; + 696AD590527FF3A1B986BF7974851C45 /* IQKeyboardToolbarManager+Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC889F43B2C6A6F8CAF9AE34A437535A /* IQKeyboardToolbarManager+Deprecated.swift */; }; + 698B6FF2D3EB35756E187675DB447A0D /* IQKeyboardToolbarManager+Internal.swift in Sources */ = {isa = PBXBuildFile; fileRef = F5CC8BDBC24E508A9EAFA3BD070E373D /* IQKeyboardToolbarManager+Internal.swift */; }; + 6BB50CA0467930C6314FD196D4D7E3D4 /* IQInvocation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 586ADA6A1632DBA2224552BFBA22581D /* IQInvocation.swift */; }; + 6C1E1FB34F5E4795759BBA858F006598 /* IQKeyboardManagerSwift-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = A67B65E64610A804D78568AFE2057CF4 /* IQKeyboardManagerSwift-dummy.m */; }; + 6CC5606CD458DDB113E3F74401F34970 /* IQKeyboardManager+ActiveConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26AA0168FEE4652E795A487F2D628BA0 /* IQKeyboardManager+ActiveConfiguration.swift */; }; + 6DE9FD143CBC24075601F8FE2ADC4115 /* IQKeyboardCore-IQKeyboardCore in Resources */ = {isa = PBXBuildFile; fileRef = 6E897F35E5E27028AC58B14B552FBC8D /* IQKeyboardCore-IQKeyboardCore */; }; + 709D0EF3CAC21F2C46996DC012F853CA /* IQKeyboardAppearanceConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 861EDB4B4F61692A313FF611C8CF95AF /* IQKeyboardAppearanceConfiguration.swift */; }; + 70C33A3C8A6F1EC98EEB3887921E1346 /* IQDeepResponderContainerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51C2DC792A6DF0C698B5CA877445AD73 /* IQDeepResponderContainerView.swift */; }; + 7199EAFCB9BFD43B5CF333627BBE6715 /* IQKeyboardToolbar-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 6A7D9DC50C63535042164A35DFD40EC2 /* IQKeyboardToolbar-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 737ED0AA4A3560B77672478137FD3077 /* IQActiveConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1B8186A80AC5E0814DA1D966D3E40BF /* IQActiveConfiguration.swift */; }; + 7CC8EFB6010B9B87FEEDE9150EE5F617 /* IQTextInputViewInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F9CC787EDE5D230D3BB2F2DA0ABEB99 /* IQTextInputViewInfo.swift */; }; + 7E3D82D0DF9EE0F14DA44AC251B45E27 /* IQKeyboardNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = B80D24BAD77BA27807693623CE7D270D /* IQKeyboardNotification.swift */; }; + 802C058F68EEFCECDA6841FA9FF5F7AB /* IQKeyboardManager+ToolbarManagerDeprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18BB99887E76717DB51BAD581A6B441E /* IQKeyboardManager+ToolbarManagerDeprecated.swift */; }; + 82EE52834AB7023FE255776D547678BF /* IQKeyboardAppearanceManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C958D24E4FE5EFD8C5B81405559A4BD /* IQKeyboardAppearanceManager.swift */; }; + 879D2E821C85A4C9A91327C8823707C3 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 647AECC2271497CFBB36311165FC0BF0 /* UIKit.framework */; }; + 8AA66BD0572CCDC71153FEA95C7AB666 /* Pods-suixinkanTests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 37B17973B8B0E935D23A94470AB95C07 /* Pods-suixinkanTests-dummy.m */; }; + 8B39ADF4DB39DD5A427D89AA15826EE3 /* IQKeyboardManager+Internal.swift in Sources */ = {isa = PBXBuildFile; fileRef = A338431F5EE59F889439480E11F55A35 /* IQKeyboardManager+Internal.swift */; }; + 8B932FE2562968B4AD79FB11FF1F31F0 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = FE5C672CF96BECD4AEF2D01E86D7A5BC /* PrivacyInfo.xcprivacy */; }; + 8E9854AD5BEB1529B0C974C729FBC812 /* IQKeyboardNotification-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = A975906B3CFBF2DD2C0D832B624B43E5 /* IQKeyboardNotification-dummy.m */; }; + 914AE43A691016D126083E13CFD8919F /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6464447070DB8A1E9C56338928A9DC0F /* Foundation.framework */; }; + 9493F02F394A370868EFE569ABB2C1A2 /* IQKeyboardToolbarManager-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 7CCC40E939F7246E1F0244955BDFF328 /* IQKeyboardToolbarManager-dummy.m */; }; + 94D1ED5D39A994EBD9DDDFC5494EE2D4 /* Pods-suixinkan-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = A6A3ABC34D5CA51948F7619021EEC414 /* Pods-suixinkan-dummy.m */; }; + 986DC523CD4D441E2FEC4D3310F3B6AF /* IQKeyboardManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4FDF616BAC83E63DB1F6D89BD0C25949 /* IQKeyboardManager.swift */; }; + 99E2272BA8CC1502E45DC65CBFBCBCD4 /* Array+Sort.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8B228B45C2AF15F26A0708FF1F4C049 /* Array+Sort.swift */; }; + 9A6363832DBE2489783687308B9FC759 /* IQKeyboardManager+ToolbarManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80DCD72F7A8519A9463BFC22D8AD02A4 /* IQKeyboardManager+ToolbarManager.swift */; }; + 9B0D1C2CD421BD42B4585E158EA8FE59 /* IQKeyboardToolbarConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = F441F8B8B18B288CC0A7425FDC5F01A1 /* IQKeyboardToolbarConfiguration.swift */; }; + 9B2C0863AD3BAB0F877DC1F340119AA0 /* IQTextInputViewNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6183432F20DA00F9E0A8AD4AB8569CFF /* IQTextInputViewNotification.swift */; }; + 9CD18FBC522BC9FAF825298EE13E385A /* UIViewController+ParentContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 526DA4BEC1A96C86419B2B0A724CEAAC /* UIViewController+ParentContainer.swift */; }; + 9F2B162734E484C90062F141ED4BB39C /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6464447070DB8A1E9C56338928A9DC0F /* Foundation.framework */; }; + A11F813E8520CCD02F84535FEF70C004 /* Combine.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 030EAF35766AF14A0C9409424A6C2B82 /* Combine.framework */; }; + A39FE5F72261B202CC63722A7B357206 /* IQTextInputView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D7F4C8DBE08B54A8D13ABD8BDF9D13A /* IQTextInputView.swift */; }; + A3DE47F84D7FE267487C39CBC071916D /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6464447070DB8A1E9C56338928A9DC0F /* Foundation.framework */; }; + A896B59D4DE9C73E1B26FD3778930977 /* IQKeyboardResignHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = E255579824F1D21C00ED5B029E99BDA6 /* IQKeyboardResignHandler.swift */; }; + A9A9B3D2801DD30DA93C8F20A506CCED /* IQKeyboardToolbar-IQKeyboardToolbar in Resources */ = {isa = PBXBuildFile; fileRef = A16FD016E18EACCF6B23F219F2E236FE /* IQKeyboardToolbar-IQKeyboardToolbar */; }; + AE2A39A6A21769A88C36DA4A6ACF2A40 /* IQKeyboardReturnManager-IQKeyboardReturnManager in Resources */ = {isa = PBXBuildFile; fileRef = 110BD425B6CAD6801539E2C6AB6E0662 /* IQKeyboardReturnManager-IQKeyboardReturnManager */; }; + B4E63E50E80BA0DE0FDC0222727DBD11 /* IQKeyboardInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 474B492B560C872CE952C1D51969406A /* IQKeyboardInfo.swift */; }; + B552868FC458E31F528E3AD3A483D677 /* IQKeyboardManager+Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49E3CA5E36443AE3EFB66EE0A3530956 /* IQKeyboardManager+Deprecated.swift */; }; + B596B09A2EFFA3DFCC75D0CB687464CC /* IQKeyboardToolbarManager+Debug.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3D2D5C77B484A469AB0BF920206EF /* IQKeyboardToolbarManager+Debug.swift */; }; + B709C2DB9B3599F3904D99978DFE31BE /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = FBCCE2BB919F40B9EBCD3FF8F5880D9D /* PrivacyInfo.xcprivacy */; }; + BA411DCFF67E3F2117FB300E4D728936 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6464447070DB8A1E9C56338928A9DC0F /* Foundation.framework */; }; + BAB572B2D91EB9FE4085013E8BCF11A2 /* UIView+Responders.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80ADE748531456ABDDE44B5173787FA4 /* UIView+Responders.swift */; }; + BD2157407D719E3B22097A99592F1434 /* IQKeyboardReturnManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8972D89261103F625BBE350DC6A5E5BD /* IQKeyboardReturnManager.swift */; }; + BE50FCAC87378A04725C360266735624 /* IQKeyboardToolbarManager-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 6B8F7D50992F93A9D502BFAD4018B610 /* IQKeyboardToolbarManager-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BEC863764D1B70E42F25A95161D8FA16 /* IQKeyboardResignHandler+Internal.swift in Sources */ = {isa = PBXBuildFile; fileRef = E7606BACFB790485C35F7EC8C0871429 /* IQKeyboardResignHandler+Internal.swift */; }; + BF67A2DCA85E702041E48BC18DB39DEF /* IQTitleBarButtonItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = BECE7DDCA61A0E3D33D4AD9803F445BE /* IQTitleBarButtonItem.swift */; }; + C13E73214F37BAE28B4F8AD6EFEECA95 /* IQKeyboardManagerSwift-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = C83AC5811D580B3B54EA282688BDAA41 /* IQKeyboardManagerSwift-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C313DB17200D1B45E8C337318BA05813 /* IQKeyboardToolbarManager-IQKeyboardToolbarManager in Resources */ = {isa = PBXBuildFile; fileRef = 80A40EDA3AF0499BDBCFF09467BB49AD /* IQKeyboardToolbarManager-IQKeyboardToolbarManager */; }; + C51D4A9FE595DCE7457E080705A98F11 /* IQTextInputViewNotification-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = D27223F0D62482873E0DD988417E334F /* IQTextInputViewNotification-dummy.m */; }; + C8ADA0B4C5E93DC1F608726FFB26AA95 /* Pods-suixinkan-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = A60233C7119F0105DB6C68E30CCC216F /* Pods-suixinkan-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C945CB4EC42271D435BF23E7749BE6BF /* IQKeyboardConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85D9B67B548F1C9544DCB01D4EB6FE1D /* IQKeyboardConstants.swift */; }; + CBF2EBCCBEA754DA8890D0A93C07B935 /* IQTextView-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 48055AC80B1D94B7F9E2BF87BB984279 /* IQTextView-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + CE4289FB36C1751B29FF3A08BAB1303F /* IQKeyboardNotification-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = ACF0BBF875B1A829EB0CEF621C75A491 /* IQKeyboardNotification-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D3ABAF6EDA21C1A1BA048EBE771A3C34 /* IQKeyboardAppearanceManager+Internal.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5279670AC68B19C16BC817052738C47C /* IQKeyboardAppearanceManager+Internal.swift */; }; + D3F608CA68128687287C578A5AE78032 /* IQKeyboardReturnManager-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = B5277185841774F1173A60C70BEEAB43 /* IQKeyboardReturnManager-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D59795F3072DB898B23C7ECAB9648A40 /* IQTextInputViewInfoModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = AF1C389FEE92688E867B717F7F760B81 /* IQTextInputViewInfoModel.swift */; }; + D6EFA9EAA562143F338EB164836B7837 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 647AECC2271497CFBB36311165FC0BF0 /* UIKit.framework */; }; + DA59A956BADB58A8F56351BEF801A4A7 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6464447070DB8A1E9C56338928A9DC0F /* Foundation.framework */; }; + DAE95FD71F66232D13925E728762532B /* UIScrollView+IQKeyboardManagerExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73E69C62CB648A1F39A51A68FCE70203 /* UIScrollView+IQKeyboardManagerExtension.swift */; }; + DCCD3E35C57D99BB47B7CF853C5A9748 /* IQKeyboardManagerSwift-IQKeyboardManagerSwift in Resources */ = {isa = PBXBuildFile; fileRef = 8D8069D3964814114ACEC3084C010B59 /* IQKeyboardManagerSwift-IQKeyboardManagerSwift */; }; + DEE20091E649C632B6EE2FD421214811 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = EB59B9412536BB983F181D5769060818 /* PrivacyInfo.xcprivacy */; }; + DEF9DEE9A4E977FD0789D15512C400B6 /* UIView+Resign.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1DCD55C5C01982AECFC7B1BE8AD51098 /* UIView+Resign.swift */; }; + DFB7A2D3A180F3D0F22CC7FFF9FD5436 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6464447070DB8A1E9C56338928A9DC0F /* Foundation.framework */; }; + DFC69465EAE2C498CA6ABDEFADD9C2F2 /* IQKeyboardToolbarPlaceholderConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B7EC073F09A1F9D54780D9C77AF25BF /* IQKeyboardToolbarPlaceholderConfiguration.swift */; }; + E16CD42A35F0C4177E59F6ABF0D54E18 /* UIView+ResignObjc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C8B1DA3B268A12F02985D29EFC8C82 /* UIView+ResignObjc.swift */; }; + E1734E56DB48E6F238408C9A232C7051 /* UIView+Hierarchy.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE8F0BF8A36B8140B1C8B56EB114A086 /* UIView+Hierarchy.swift */; }; + E1C18171B224E80E6F9E87A2F1BFC47C /* IQKeyboardManager+Resign_Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = B381E333A40EB0E75671BF9FB617AC37 /* IQKeyboardManager+Resign_Deprecated.swift */; }; + E519794B26536386633E398EE481A94F /* UITableView+IndexPaths.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30C3AD78BD7F4CF62CFCE4A94DE54DED /* UITableView+IndexPaths.swift */; }; + E928EA2BF42B4F59378A201F124A24DC /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 3A2160EF949B7A580D286F038B1A56B5 /* PrivacyInfo.xcprivacy */; }; + EE075828CDE3D146F5E1C6534F99B52C /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 3916E4E5989A0F0254EAD32C392B5F5C /* PrivacyInfo.xcprivacy */; }; + EE2DEE5FC0FCE377B0B91053D1EEE1C4 /* IQTextView-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = EFF97AF8ED94B2E1B53EC25523191C20 /* IQTextView-dummy.m */; }; + EE58D262313604F9499EF080BB7570E2 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 65502F5FF9DEEAC1D8D36A27E85FEE02 /* PrivacyInfo.xcprivacy */; }; + EFA0B9BD4DB27C2114AFA46A63F19D79 /* IQBarButtonItemConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B64ACDF6D4EC7B93904691EB45C5C93 /* IQBarButtonItemConfiguration.swift */; }; + EFC13162E3A35D0EC2C76C2B23E5A09C /* IQRootControllerConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = AFA40485EE83F94DDC2D4C718DE4758D /* IQRootControllerConfiguration.swift */; }; + F2DD24E632D6EA8129EF60E0A4AFD91C /* UIView+IQKeyboardManagerExtensionObjc.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1B35C123F478E358FFB01C3A7721D04 /* UIView+IQKeyboardManagerExtensionObjc.swift */; }; + F6EBBAAB0ACF8232BF1F1E249998ED97 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6464447070DB8A1E9C56338928A9DC0F /* Foundation.framework */; }; + F73E398751F521AA064471055F9D76B8 /* UIScrollView+IQKeyboardManagerExtensionObjc.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4C53D4D2AA9A89E5F58608BDE976D61 /* UIScrollView+IQKeyboardManagerExtensionObjc.swift */; }; + F95C52480DA8BDDB020022F7FD010453 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 72BBF069358CCF73D8E674385813A466 /* PrivacyInfo.xcprivacy */; }; + F9F4D20D5371CB1BD4FC03401DC7B980 /* IQPlaceholderable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49433A7414A4DAC29B5BF7295ADBC92D /* IQPlaceholderable.swift */; }; + FB53E4A87D410605B4F27174DF76FF4D /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 9F5FA7D2322208B09B5EA5D72D7209C6 /* PrivacyInfo.xcprivacy */; }; + FB7CE812CC13A8D408545AB087AAB154 /* IQKeyboardToolbarManager+Action.swift in Sources */ = {isa = PBXBuildFile; fileRef = 344274B89E7EEEF54409242ACD059475 /* IQKeyboardToolbarManager+Action.swift */; }; + FC31BD8F5A7ABFAD5F87EFE19920F85C /* IQTextInputViewNotification-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F7D7AA57F77A17CD3D74D75AEBA7070 /* IQTextInputViewNotification-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + FE0D3260BF27D388B0200F1AC8151619 /* IQKeyboardCore-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = B8DC3BD343769A8E67DC140B14E40AFA /* IQKeyboardCore-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + FEC86D7371EEAC597840AD4C80D95F6D /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 647AECC2271497CFBB36311165FC0BF0 /* UIKit.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 067A6759ACA9A549384C729E1010EEB2 /* PBXContainerItemProxy */ = { + 072E4E27975479BDD58563BEB3D24683 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; - remoteGlobalIDString = 9B182CB4E1716E9070813D3C59736001; - remoteInfo = "AMapFoundation-NO-IDFA"; + remoteGlobalIDString = A26E6FD851C20D652B2755C1464A9990; + remoteInfo = IQKeyboardNotification; }; - 21C4E3AF810B766F005A0D66D3AB059F /* PBXContainerItemProxy */ = { + 0D2EB4A67CE62F8166C4AEE9F28A2794 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; - remoteGlobalIDString = 09FABB7D06BB8D3958515FB15B4E7971; - remoteInfo = UMCommon; + remoteGlobalIDString = F4FE17428FD0E607723A44F17231B7A1; + remoteInfo = IQKeyboardToolbar; }; - 24A06925FD6662781797D78547B19FC7 /* PBXContainerItemProxy */ = { + 11F6CAD234D50E3B19009ACDB7B04828 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; - remoteGlobalIDString = 7F18C31A804695333763EEC303E265D7; - remoteInfo = "WechatOpenSDK-XCFramework"; + remoteGlobalIDString = A6602BCAA6F4F932A586C41D0B7E019C; + remoteInfo = "IQTextView-IQTextView"; }; - 2F48F1B754086F0F2514AA521AB8B493 /* PBXContainerItemProxy */ = { + 1FFB29A77F93BDAC1566FEC554B6C293 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; - remoteGlobalIDString = 4F1379598302C9160590B3650C10E1A5; - remoteInfo = "AMapSearch-NO-IDFA"; + remoteGlobalIDString = 7C5613175BBC4BF67E36DB4FBEBC01D0; + remoteInfo = "IQKeyboardToolbarManager-IQKeyboardToolbarManager"; }; - 33B5943FAAD2EDE37C3C94F327FA50BC /* PBXContainerItemProxy */ = { + 2FE8AB43E3CB0161C772ED070487B9E4 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; - remoteGlobalIDString = 4BD4E22D3419D68A85BDD6119CB37C6C; - remoteInfo = "AMapLocation-NO-IDFA"; + remoteGlobalIDString = 2B8FF445A5162845FAB9EC00FC92B694; + remoteInfo = "IQKeyboardNotification-IQKeyboardNotification"; }; - 3D12EEA2C94F5E7D1A04E3DCB8056418 /* PBXContainerItemProxy */ = { + 3466093273143BEB58E4CBBC579B64F6 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; - remoteGlobalIDString = CEB9AD2C3CFC208BFBE1F22F5EC3E1FC; - remoteInfo = UMDevice; + remoteGlobalIDString = 88810798DA63A2F6611B0970EA276DEC; + remoteInfo = "IQKeyboardReturnManager-IQKeyboardReturnManager"; }; - 849BA746108EE0BE0F41CAF99BCF009C /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 09FABB7D06BB8D3958515FB15B4E7971; - remoteInfo = UMCommon; - }; - 991CAE88F0A4725CB8E8F174974E5B98 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 9B182CB4E1716E9070813D3C59736001; - remoteInfo = "AMapFoundation-NO-IDFA"; - }; - A9B64CB2E1958A4EBD9D7B1E35942161 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = CEB9AD2C3CFC208BFBE1F22F5EC3E1FC; - remoteInfo = UMDevice; - }; - ADE47395DAB29611CE948513B2F0F2E5 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 9B182CB4E1716E9070813D3C59736001; - remoteInfo = "AMapFoundation-NO-IDFA"; - }; - BD91D75C44C68F52A94B116B7D1294F4 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 9B182CB4E1716E9070813D3C59736001; - remoteInfo = "AMapFoundation-NO-IDFA"; - }; - C0AB8415F3749D034999E1F84151D767 /* PBXContainerItemProxy */ = { + 3FA7EE33E2A4A9317A1A9BD1271CAD9A /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = B44FB02BD2D3FEAD1F36808AD405A543; remoteInfo = "AMap3DMap-NO-IDFA"; }; - E0029779384156C3352043F0C3AFFE56 /* PBXContainerItemProxy */ = { + 48703231ACE2850477BE5A954C22D39D /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; - remoteGlobalIDString = F1E09035B7675D89EC69B16728E2833E; - remoteInfo = UMAPM; + remoteGlobalIDString = F9A1BF709B7BA4C24A83664EB1E1C7D4; + remoteInfo = IQKeyboardCore; }; - F7B6C2F4ACE4C28AB6488EF406B7E9D1 /* PBXContainerItemProxy */ = { + 49BBC9B14F79A04BA8DD9B0BB90A9B9C /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = F4FE17428FD0E607723A44F17231B7A1; + remoteInfo = IQKeyboardToolbar; + }; + 4B1EBB18B5B15E617B246B4FF5DAF0BC /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 09FABB7D06BB8D3958515FB15B4E7971; + remoteInfo = UMCommon; + }; + 4ED0FC63512556305238B4F8A655BFC3 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = F9A1BF709B7BA4C24A83664EB1E1C7D4; + remoteInfo = IQKeyboardCore; + }; + 5CE52FF97D512708CA7A47A2B3D62E76 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 09FABB7D06BB8D3958515FB15B4E7971; + remoteInfo = UMCommon; + }; + 604C23F4D8288FC7F99E40CC6B0A5AFB /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = CEB9AD2C3CFC208BFBE1F22F5EC3E1FC; + remoteInfo = UMDevice; + }; + 64DDDAE98CDB07AA875EF2F8785EDD43 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 0981F89DB5DA3FFCFFEBDE1F56287054; + remoteInfo = IQKeyboardReturnManager; + }; + 6B5EB24E9DAD48FA4C5EA18A140601A6 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 12890DE3ABBC2CA295E108358D85EE69; + remoteInfo = IQTextView; + }; + 7554BF75E0EABA51787581741F2C0977 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = B247F77A0CD5E19C8187A9BA1EB58C09; + remoteInfo = "IQKeyboardToolbar-IQKeyboardToolbar"; + }; + 80C7A425A8BEDEEB907E1C0D59EE09CF /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 982A68D37F5DCBC1FC1FDC0BB2F0EB8E; + remoteInfo = "IQKeyboardManagerSwift-IQKeyboardManagerSwift"; + }; + 852A1D21D2CE860CC83410BBFD84880C /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 9B182CB4E1716E9070813D3C59736001; + remoteInfo = "AMapFoundation-NO-IDFA"; + }; + 86E020E02CC1A1EB70F0897B32D2077B /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 12890DE3ABBC2CA295E108358D85EE69; + remoteInfo = IQTextView; + }; + 88A05DB4A06DCD769D9535B118AA4542 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = EEE261386011CDF271BE289F73FF5959; + remoteInfo = "IQKeyboardCore-IQKeyboardCore"; + }; + 96B3FE193BFA13D2A4F33193086413A0 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 283C1F2EA88CD4413165801A6748A48E; + remoteInfo = IQTextInputViewNotification; + }; + A68BA12EA1172EA196C307EFD226E3FA /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 1DE17B7C77CD95CB67DF1197965B76AB; remoteInfo = "Pods-suixinkan"; }; + ACB2B6CE324FAA2F107B41B1B30FD3A3 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 020993F16DA5986DACE118349EBCE9E5; + remoteInfo = IQKeyboardToolbarManager; + }; + B1369EF2BD3C2C080B0E2339B47E2F81 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 4BD4E22D3419D68A85BDD6119CB37C6C; + remoteInfo = "AMapLocation-NO-IDFA"; + }; + B39953252EDD987C1A35C366900690CF /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = CEB9AD2C3CFC208BFBE1F22F5EC3E1FC; + remoteInfo = UMDevice; + }; + B93EAD193D88C9A60662E10DBCFCEA88 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = F9A1BF709B7BA4C24A83664EB1E1C7D4; + remoteInfo = IQKeyboardCore; + }; + BCC15AB291C526956A6ADA2EB049BB6C /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 9B182CB4E1716E9070813D3C59736001; + remoteInfo = "AMapFoundation-NO-IDFA"; + }; + BD04367E23147103AA5A3FD785ABF923 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = F9A1BF709B7BA4C24A83664EB1E1C7D4; + remoteInfo = IQKeyboardCore; + }; + BE77FABD96B18CC818A1B8048B62AD9A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = A26E6FD851C20D652B2755C1464A9990; + remoteInfo = IQKeyboardNotification; + }; + C42BE70475DBB73A4D64287452A8476B /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = B490E7485944099E16C9CBD79119D1D4; + remoteInfo = IQKeyboardManagerSwift; + }; + CEBE80C066C9BF2161D89833D0CC119A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 283C1F2EA88CD4413165801A6748A48E; + remoteInfo = IQTextInputViewNotification; + }; + D6F6A7863C357AB39376EC52209E2A0D /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 4F1379598302C9160590B3650C10E1A5; + remoteInfo = "AMapSearch-NO-IDFA"; + }; + D93021E90DCA27E33FA08E04B32E8653 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 9B182CB4E1716E9070813D3C59736001; + remoteInfo = "AMapFoundation-NO-IDFA"; + }; + D9CD489745F094398AC7EE56A075E972 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = F4FE17428FD0E607723A44F17231B7A1; + remoteInfo = IQKeyboardToolbar; + }; + DC2DD867ABEA019EFC6E98A0B2815AE6 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = F1E09035B7675D89EC69B16728E2833E; + remoteInfo = UMAPM; + }; + DD14992E69F497F71BA00CD9DD122987 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 0981F89DB5DA3FFCFFEBDE1F56287054; + remoteInfo = IQKeyboardReturnManager; + }; + DFC2204E567402299825907959EB082C /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 7F18C31A804695333763EEC303E265D7; + remoteInfo = "WechatOpenSDK-XCFramework"; + }; + E9B4E5C8009A9E93DFFE3687E7A7C298 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 283C1F2EA88CD4413165801A6748A48E; + remoteInfo = IQTextInputViewNotification; + }; + ED4A999B5C1FBCC9415B78F1A4FDC18A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 4502C7427440BEB17A50C0BF6E638A85; + remoteInfo = "IQTextInputViewNotification-IQTextInputViewNotification"; + }; + EE4EF75722C69B32AF324E46C1BBA7D1 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 020993F16DA5986DACE118349EBCE9E5; + remoteInfo = IQKeyboardToolbarManager; + }; + F37D3A96D9C3BBF6C882CF3CD02C632D /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 9B182CB4E1716E9070813D3C59736001; + remoteInfo = "AMapFoundation-NO-IDFA"; + }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 03ECB029C3BA6719F3CE27704FE9866A /* AMapNearbySearchManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapNearbySearchManager.h; path = AMapSearchKit.framework/Headers/AMapNearbySearchManager.h; sourceTree = ""; }; - 0560C72601DFB7648983A59E3A8630CF /* Pods-suixinkanTests-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-suixinkanTests-Info.plist"; sourceTree = ""; }; - 05E4BFEB8A5EC2DC86095F225B502975 /* MAMVTTileOverlayRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMVTTileOverlayRenderer.h; path = MAMapKit.framework/Headers/MAMVTTileOverlayRenderer.h; sourceTree = ""; }; - 05F51B66A225DC56F48A197D8DE3AB8E /* MAHeatMapVectorOverlayRender.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAHeatMapVectorOverlayRender.h; path = MAMapKit.framework/Headers/MAHeatMapVectorOverlayRender.h; sourceTree = ""; }; - 069E056FF5EF11FB955BE3C9637228BF /* Pods-suixinkan-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-suixinkan-acknowledgements.markdown"; sourceTree = ""; }; - 081BB8B4C329A89813BAFEFD92F278DC /* MAArc.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAArc.h; path = MAMapKit.framework/Headers/MAArc.h; sourceTree = ""; }; - 0CB65467D9BC6FB4CA43DBDEE8046DC8 /* MACustomCalloutView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MACustomCalloutView.h; path = MAMapKit.framework/Headers/MACustomCalloutView.h; sourceTree = ""; }; - 0D4EF6D40137F0A4CECF2C4CC617B5BA /* MAPolygon.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAPolygon.h; path = MAMapKit.framework/Headers/MAPolygon.h; sourceTree = ""; }; - 0E97FA02BDFE7464E96DDDA67672EAB8 /* MAMapStatus.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMapStatus.h; path = MAMapKit.framework/Headers/MAMapStatus.h; sourceTree = ""; }; - 0F67BAD007D9313441603E8FD0C72BDE /* MAMapView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMapView.h; path = MAMapKit.framework/Headers/MAMapView.h; sourceTree = ""; }; - 11E7551362FA5BAEED7A7CF2E5A5998B /* AMapLocationRegionObj.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapLocationRegionObj.h; path = AMapLocationKit.framework/Headers/AMapLocationRegionObj.h; sourceTree = ""; }; - 125064997C0EDA842FA880F67BB3D06F /* AMap3DMap-NO-IDFA.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "AMap3DMap-NO-IDFA.debug.xcconfig"; sourceTree = ""; }; - 12C40249116DE0574E7DC16E3A5C4D06 /* AMapLocationCommonObj.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapLocationCommonObj.h; path = AMapLocationKit.framework/Headers/AMapLocationCommonObj.h; sourceTree = ""; }; - 1733284B424C8D089B1C8E9C6167E533 /* MAPolygonRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAPolygonRenderer.h; path = MAMapKit.framework/Headers/MAPolygonRenderer.h; sourceTree = ""; }; + 01003F931713782781BF6BB014711F27 /* Pods-suixinkanTests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-suixinkanTests-acknowledgements.markdown"; sourceTree = ""; }; + 01FED2850C91917B5CF595B8834B8F2A /* IQKeyboardToolbar-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "IQKeyboardToolbar-prefix.pch"; sourceTree = ""; }; + 030EAF35766AF14A0C9409424A6C2B82 /* Combine.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Combine.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/Combine.framework; sourceTree = DEVELOPER_DIR; }; + 05DAA96D10BBDD4CD0563EF76883B8CA /* IQKeyboardToolbarManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQKeyboardToolbarManager.swift; path = IQKeyboardToolbarManager/Classes/IQKeyboardToolbarManager.swift; sourceTree = ""; }; + 06C25F9B95293799D367CBD0E0B95E77 /* AMapNearbySearchManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapNearbySearchManager.h; path = AMapSearchKit.framework/Headers/AMapNearbySearchManager.h; sourceTree = ""; }; + 06E5B413FEA5A600D76636DA132F8FB9 /* IQTextInputViewNotification */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = IQTextInputViewNotification; path = IQTextInputViewNotification.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 081A933139371B97D5ABFD37B065516E /* Pods-suixinkan.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-suixinkan.release.xcconfig"; sourceTree = ""; }; + 08CB266E76332AED0E3B48EEB055983F /* MAMapAccessibilityIdentifier.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMapAccessibilityIdentifier.h; path = MAMapKit.framework/Headers/MAMapAccessibilityIdentifier.h; sourceTree = ""; }; + 0B35E9590B445883D21697E01ACFFF1E /* UIView+IQKeyboardExtensionObjc.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIView+IQKeyboardExtensionObjc.swift"; path = "IQKeyboardToolbar/Classes/IQKeyboardExtension/UIView+IQKeyboardExtensionObjc.swift"; sourceTree = ""; }; + 0B4AC58FF4324A3FA8F73CA4DA10DD58 /* IQTextInputViewNotification-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "IQTextInputViewNotification-Info.plist"; sourceTree = ""; }; + 0BC7D01167CA03F161AF5BC994C741C4 /* WechatOpenSDK.xcframework */ = {isa = PBXFileReference; includeInIndex = 1; path = WechatOpenSDK.xcframework; sourceTree = ""; }; + 0C330EE82C2618812608F6AE8A6E63A9 /* IQKeyboardReturnManager+UITextViewDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardReturnManager+UITextViewDelegate.swift"; path = "IQKeyboardReturnManager/Classes/Delegates/IQKeyboardReturnManager+UITextViewDelegate.swift"; sourceTree = ""; }; + 0C8150D39D06CA5117F674365A2D6513 /* AMapLocationKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = AMapLocationKit.framework; sourceTree = ""; }; + 0DFD4541FF9DAA31A2FC2A7F6D03ED22 /* IQTextView */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = IQTextView; path = IQTextView.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 0E3937675CAA550D5CB90F0343F30691 /* MAPolyline.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAPolyline.h; path = MAMapKit.framework/Headers/MAPolyline.h; sourceTree = ""; }; + 0EBA328CDD2131771C5A3F054677DEB7 /* ResourceBundle-IQKeyboardToolbar-IQKeyboardToolbar-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-IQKeyboardToolbar-IQKeyboardToolbar-Info.plist"; sourceTree = ""; }; + 0F7D7AA57F77A17CD3D74D75AEBA7070 /* IQTextInputViewNotification-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "IQTextInputViewNotification-umbrella.h"; sourceTree = ""; }; + 103108AC7A027FAA9D881105F432DFED /* AMap3DMap-NO-IDFA.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "AMap3DMap-NO-IDFA.release.xcconfig"; sourceTree = ""; }; + 103B4566E5B3E8DEF9340A316936E77D /* AMapGeoFenceManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapGeoFenceManager.h; path = AMapLocationKit.framework/Headers/AMapGeoFenceManager.h; sourceTree = ""; }; + 110BD425B6CAD6801539E2C6AB6E0662 /* IQKeyboardReturnManager-IQKeyboardReturnManager */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "IQKeyboardReturnManager-IQKeyboardReturnManager"; path = IQKeyboardReturnManager.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; + 115539E22DDDBEAA2759FD2CEE701673 /* IQKeyboardToolbarManager.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQKeyboardToolbarManager.release.xcconfig; sourceTree = ""; }; + 11E57560E05A7E18A4833A108BBF77A7 /* IQKeyboardReturnManager.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQKeyboardReturnManager.debug.xcconfig; sourceTree = ""; }; + 120BD4C670EF00F4D5A40AA4B863A7AE /* IQKeyboardNotification-IQKeyboardNotification */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "IQKeyboardNotification-IQKeyboardNotification"; path = IQKeyboardNotification.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; + 12577E7D396AF4A0D52E8BF9EAB0B178 /* IQKeyboardCore-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "IQKeyboardCore-dummy.m"; sourceTree = ""; }; + 130EEB4090B9AF897D37B6DE8A064E66 /* WechatOpenSDK-XCFramework.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "WechatOpenSDK-XCFramework.release.xcconfig"; sourceTree = ""; }; + 14A1F49D0B3C6F4A06FE802DFE3C86A5 /* UMDevice.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = UMDevice.release.xcconfig; sourceTree = ""; }; + 155001DC0189CD12099F5DA44FFC98CB /* WechatOpenSDK-XCFramework.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "WechatOpenSDK-XCFramework.debug.xcconfig"; sourceTree = ""; }; + 15848DEC7727A809830E7F6FC1B6CE0F /* IQKeyboardReturnManager */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = IQKeyboardReturnManager; path = IQKeyboardReturnManager.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 18BB99887E76717DB51BAD581A6B441E /* IQKeyboardManager+ToolbarManagerDeprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardManager+ToolbarManagerDeprecated.swift"; path = "IQKeyboardManagerSwift/IQKeyboardToolbarManager/IQKeyboardManager+ToolbarManagerDeprecated.swift"; sourceTree = ""; }; + 19C8D9FF70E4E67A9CC761929E9C65E8 /* AMapLocationVersion.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapLocationVersion.h; path = AMapLocationKit.framework/Headers/AMapLocationVersion.h; sourceTree = ""; }; 1B7465A72120AF417FD5F1F34AD33AD4 /* Pods-suixinkanTests */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Pods-suixinkanTests"; path = Pods_suixinkanTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 1BABD1E2BA172FF891B45D69723A8FA6 /* MAMapSnapshot.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMapSnapshot.h; path = MAMapKit.framework/Headers/MAMapSnapshot.h; sourceTree = ""; }; - 21F64182FA5AB6FB454C619FF610CB14 /* AMap.bundle */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "wrapper.plug-in"; name = AMap.bundle; path = MAMapKit.framework/AMap.bundle; sourceTree = ""; }; - 21F8229FFC8693946D569FF6D8C1FA3F /* AMapSearchVersion.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapSearchVersion.h; path = AMapSearchKit.framework/Headers/AMapSearchVersion.h; sourceTree = ""; }; - 24067F4DDEF17AFA8641D4550327134F /* MAAnnotation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAAnnotation.h; path = MAMapKit.framework/Headers/MAAnnotation.h; sourceTree = ""; }; - 258B890CD915D0C02409050126A34A78 /* MAHeatMapVectorGridOverlayRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAHeatMapVectorGridOverlayRenderer.h; path = MAMapKit.framework/Headers/MAHeatMapVectorGridOverlayRenderer.h; sourceTree = ""; }; - 267A3DEBF9AF353E463F539354095601 /* AMapSearchKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = AMapSearchKit.framework; sourceTree = ""; }; - 2695372829B2B3DE46736249F9327CB3 /* AMapFoundationConst.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapFoundationConst.h; path = AMapFoundationKit.framework/Headers/AMapFoundationConst.h; sourceTree = ""; }; - 2B1E1B290F1753A341C14CED0A6F3F4D /* UMAPM.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = UMAPM.release.xcconfig; sourceTree = ""; }; - 2B483D35C6A5C6886C8305F8655E02EB /* UMAPM.xcframework */ = {isa = PBXFileReference; includeInIndex = 1; name = UMAPM.xcframework; path = UMAPM_2.0.7/UMAPM.xcframework; sourceTree = ""; }; - 2BC8EBA3D7E41F9EA60264E82C2C3D54 /* MAGeodesicPolyline.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAGeodesicPolyline.h; path = MAMapKit.framework/Headers/MAGeodesicPolyline.h; sourceTree = ""; }; - 2D9188A08F7F86FBF3EBB3CD93699D53 /* Pods-suixinkan.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-suixinkan.release.xcconfig"; sourceTree = ""; }; - 2EC3D8175A3DC6341FD9BA09E1108BD1 /* MAMultiTexturePolylineRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMultiTexturePolylineRenderer.h; path = MAMapKit.framework/Headers/MAMultiTexturePolylineRenderer.h; sourceTree = ""; }; - 308336B8D46677C30433D2DCCD115731 /* AMapURLSearchConfig.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapURLSearchConfig.h; path = AMapFoundationKit.framework/Headers/AMapURLSearchConfig.h; sourceTree = ""; }; - 311EEA5B46D1D7FAAA7E30958EBFE969 /* MAOfflineMap.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOfflineMap.h; path = MAMapKit.framework/Headers/MAOfflineMap.h; sourceTree = ""; }; - 380659BF8742AC4FF0E4359B7E02FBEC /* MAOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOverlay.h; path = MAMapKit.framework/Headers/MAOverlay.h; sourceTree = ""; }; - 384DDA2CB25005BD6479B5987C619DD4 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; - 38F697EA154D9687F844A0F0C832E889 /* MAParticleOverlayRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAParticleOverlayRenderer.h; path = MAMapKit.framework/Headers/MAParticleOverlayRenderer.h; sourceTree = ""; }; - 3A16DCDE527DE0F46DBB2B7A4A10C9FF /* AMapLocationKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapLocationKit.h; path = AMapLocationKit.framework/Headers/AMapLocationKit.h; sourceTree = ""; }; - 3CE7B2EE0FE95BBD834825FA4D0571C5 /* Pods-suixinkanTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-suixinkanTests.debug.xcconfig"; sourceTree = ""; }; - 3D27E75D0D982BBB14DF16A6604AF8CD /* AMapSearch-NO-IDFA.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "AMapSearch-NO-IDFA.release.xcconfig"; sourceTree = ""; }; - 3F4A6FE6F5896BC28D894A3C56F4458B /* MAMapView+Resource.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "MAMapView+Resource.h"; path = "MAMapKit.framework/Headers/MAMapView+Resource.h"; sourceTree = ""; }; - 3F6E024A4BC8B4F7C84F62B453336C6B /* MAOverlayRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOverlayRenderer.h; path = MAMapKit.framework/Headers/MAOverlayRenderer.h; sourceTree = ""; }; - 3F99AF4BEDBB1A46A1B2DDA808C60C8A /* MAOfflineItemMunicipality.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOfflineItemMunicipality.h; path = MAMapKit.framework/Headers/MAOfflineItemMunicipality.h; sourceTree = ""; }; - 44674EC1944BB8CC20D1FB811A28DA3F /* Pods-suixinkan-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-suixinkan-acknowledgements.plist"; sourceTree = ""; }; - 45AB9E4A609CD01DF5027D580BD33218 /* MAMapCustomStyleOptions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMapCustomStyleOptions.h; path = MAMapKit.framework/Headers/MAMapCustomStyleOptions.h; sourceTree = ""; }; - 47DAF61B95087ADC814BD2F6DFD04D32 /* MAMultiPoint.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMultiPoint.h; path = MAMapKit.framework/Headers/MAMultiPoint.h; sourceTree = ""; }; - 495C8FA8FA1E743C3D041B5066D249A1 /* MAParticleOverlayOptions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAParticleOverlayOptions.h; path = MAMapKit.framework/Headers/MAParticleOverlayOptions.h; sourceTree = ""; }; - 49D1A8B85287979271F3D66B8968FAAD /* AMapSearchKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapSearchKit.h; path = AMapSearchKit.framework/Headers/AMapSearchKit.h; sourceTree = ""; }; - 4F88C9D2A26698191E3F0BAB6E73C1D6 /* MAUserLocation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAUserLocation.h; path = MAMapKit.framework/Headers/MAUserLocation.h; sourceTree = ""; }; - 505E9C4F754A74BBF0BF433A1ABAB2D3 /* WechatOpenSDK-XCFramework.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "WechatOpenSDK-XCFramework.release.xcconfig"; sourceTree = ""; }; - 511E223F968C9463398F92B7634AA4C1 /* MAOfflineItem.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOfflineItem.h; path = MAMapKit.framework/Headers/MAOfflineItem.h; sourceTree = ""; }; - 514765B300FD9BCBE77BA16182363311 /* AMapFoundationKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = AMapFoundationKit.framework; sourceTree = ""; }; - 56845156741368511567C6ED67855FBE /* MAOfflineItemNationWide.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOfflineItemNationWide.h; path = MAMapKit.framework/Headers/MAOfflineItemNationWide.h; sourceTree = ""; }; - 57EF70D81C78649244E4B0F2BD22C385 /* MAOfflineProvince.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOfflineProvince.h; path = MAMapKit.framework/Headers/MAOfflineProvince.h; sourceTree = ""; }; - 58447B69191400A703B8F1AA0E907906 /* AMapUtility.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapUtility.h; path = AMapFoundationKit.framework/Headers/AMapUtility.h; sourceTree = ""; }; - 5AE4ED04FC4934C3CFE1803544F7E599 /* WechatOpenSDK.xcframework */ = {isa = PBXFileReference; includeInIndex = 1; path = WechatOpenSDK.xcframework; sourceTree = ""; }; - 5B9FB578C59C2D6A42E4137C2BF6F3F4 /* MATerrainOverlayRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MATerrainOverlayRenderer.h; path = MAMapKit.framework/Headers/MATerrainOverlayRenderer.h; sourceTree = ""; }; + 1C0982FA7F37AF2EF650B5353744211C /* UIView+IQKeyboardExtensionDeprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIView+IQKeyboardExtensionDeprecated.swift"; path = "IQKeyboardToolbar/Classes/IQKeyboardExtension/UIView+IQKeyboardExtensionDeprecated.swift"; sourceTree = ""; }; + 1CB599AE97D1806104DE0A97F127E6FB /* MAMultiPoint.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMultiPoint.h; path = MAMapKit.framework/Headers/MAMultiPoint.h; sourceTree = ""; }; + 1DCD55C5C01982AECFC7B1BE8AD51098 /* UIView+Resign.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIView+Resign.swift"; path = "IQKeyboardManagerSwift/Resign/UIKItExtensions/UIView+Resign.swift"; sourceTree = ""; }; + 1EC4F8706BDB476E1074145E1FEE2DBF /* MAHeatMapVectorOverlayRender.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAHeatMapVectorOverlayRender.h; path = MAMapKit.framework/Headers/MAHeatMapVectorOverlayRender.h; sourceTree = ""; }; + 2036A3FB465FF366E97BF39DEE669F09 /* IQKeyboardManager+Appearance.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardManager+Appearance.swift"; path = "IQKeyboardManagerSwift/Appearance/IQKeyboardManager+Appearance.swift"; sourceTree = ""; }; + 21397BCD20ECAE0D5DC45E00B1022122 /* Pods-suixinkan-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-suixinkan-acknowledgements.markdown"; sourceTree = ""; }; + 260A409C8A6E5DE46B3829489949BFA4 /* MACustomBuildingOverlayRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MACustomBuildingOverlayRenderer.h; path = MAMapKit.framework/Headers/MACustomBuildingOverlayRenderer.h; sourceTree = ""; }; + 26446463DDBDB062FC3928B2F4BF9CBC /* AMapLocationRegionObj.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapLocationRegionObj.h; path = AMapLocationKit.framework/Headers/AMapLocationRegionObj.h; sourceTree = ""; }; + 2650DFB5183D12166C27899A4BC4610E /* MAGeometry.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAGeometry.h; path = MAMapKit.framework/Headers/MAGeometry.h; sourceTree = ""; }; + 26AA0168FEE4652E795A487F2D628BA0 /* IQKeyboardManager+ActiveConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardManager+ActiveConfiguration.swift"; path = "IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+ActiveConfiguration.swift"; sourceTree = ""; }; + 2BB0CDECDB237E2314A53B64D3B8695F /* AMapSearch-NO-IDFA.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "AMapSearch-NO-IDFA.debug.xcconfig"; sourceTree = ""; }; + 2CE3D2D5C77B484A469AB0BF920206EF /* IQKeyboardToolbarManager+Debug.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardToolbarManager+Debug.swift"; path = "IQKeyboardToolbarManager/Classes/Debug/IQKeyboardToolbarManager+Debug.swift"; sourceTree = ""; }; + 2CFE6D95F9C535675CB301C388874D7E /* IQTextInputViewNotification.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = IQTextInputViewNotification.modulemap; sourceTree = ""; }; + 2D1CB2C6953200669BA5206342981582 /* AMap3DMap-NO-IDFA.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "AMap3DMap-NO-IDFA.debug.xcconfig"; sourceTree = ""; }; + 2D50A287B9D0AAB2B6E9854E198DF5DD /* AMapSearchVersion.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapSearchVersion.h; path = AMapSearchKit.framework/Headers/AMapSearchVersion.h; sourceTree = ""; }; + 2D5732AE377676B0FE9DD3353BA83883 /* MAMultiPointOverlayRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMultiPointOverlayRenderer.h; path = MAMapKit.framework/Headers/MAMultiPointOverlayRenderer.h; sourceTree = ""; }; + 2F4C42E98F4D9427C292F65FE6F0B5C8 /* ResourceBundle-IQTextInputViewNotification-IQTextInputViewNotification-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-IQTextInputViewNotification-IQTextInputViewNotification-Info.plist"; sourceTree = ""; }; + 30A8A01383C393C5CB8F8FC240A24C39 /* IQKeyboardNotification.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQKeyboardNotification.debug.xcconfig; sourceTree = ""; }; + 30C3AD78BD7F4CF62CFCE4A94DE54DED /* UITableView+IndexPaths.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UITableView+IndexPaths.swift"; path = "IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UITableView+IndexPaths.swift"; sourceTree = ""; }; + 30C5F8B8EB3DD6C77EEE1A267B5CEB7D /* IQKeyboardReturnManager-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "IQKeyboardReturnManager-prefix.pch"; sourceTree = ""; }; + 3151C16FF6B76C248C269F94E4996F57 /* UMCommon.xcframework */ = {isa = PBXFileReference; includeInIndex = 1; name = UMCommon.xcframework; path = UMCommon_7.5.11/UMCommon.xcframework; sourceTree = ""; }; + 3173CBEC8CF7AA8EA006088941718CD5 /* Pods-suixinkanTests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-suixinkanTests-acknowledgements.plist"; sourceTree = ""; }; + 344274B89E7EEEF54409242ACD059475 /* IQKeyboardToolbarManager+Action.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardToolbarManager+Action.swift"; path = "IQKeyboardToolbarManager/Classes/Toolbar/IQKeyboardToolbarManager+Action.swift"; sourceTree = ""; }; + 36D395D9E056DE9587ED95754452991E /* IQKeyboardManagerSwift.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQKeyboardManagerSwift.debug.xcconfig; sourceTree = ""; }; + 37B17973B8B0E935D23A94470AB95C07 /* Pods-suixinkanTests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-suixinkanTests-dummy.m"; sourceTree = ""; }; + 38B439905141423BD2DADBBD5EFC72DE /* Pods-suixinkanTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-suixinkanTests.release.xcconfig"; sourceTree = ""; }; + 3916E4E5989A0F0254EAD32C392B5F5C /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = IQKeyboardCore/Assets/PrivacyInfo.xcprivacy; sourceTree = ""; }; + 39E2B55991EB064699426C92C7A92A8B /* MAHeatMapVectorGridOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAHeatMapVectorGridOverlay.h; path = MAMapKit.framework/Headers/MAHeatMapVectorGridOverlay.h; sourceTree = ""; }; + 39FA574A226D652C33CB6D48276F7B58 /* AMapServices.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapServices.h; path = AMapFoundationKit.framework/Headers/AMapServices.h; sourceTree = ""; }; + 3A2160EF949B7A580D286F038B1A56B5 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = IQTextInputViewNotification/Assets/PrivacyInfo.xcprivacy; sourceTree = ""; }; + 3B39ED3B08A5738A4295207CF9495EEC /* MAMapVersion.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMapVersion.h; path = MAMapKit.framework/Headers/MAMapVersion.h; sourceTree = ""; }; + 3CFBB99CC351EABA5DE1217CF1B40C3E /* IQKeyboardCore.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQKeyboardCore.debug.xcconfig; sourceTree = ""; }; + 3D078068106693825870F72C096C124A /* MATraceLocation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MATraceLocation.h; path = MAMapKit.framework/Headers/MATraceLocation.h; sourceTree = ""; }; + 3E3AD3EE750AEF229F3095AB516C9100 /* AMapFoundation-NO-IDFA.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "AMapFoundation-NO-IDFA.debug.xcconfig"; sourceTree = ""; }; + 3E8D11AD30BB130A5D5F5DD5EEA21C13 /* MAAnnotation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAAnnotation.h; path = MAMapKit.framework/Headers/MAAnnotation.h; sourceTree = ""; }; + 3F08C2AB03A8CF8FCB8E3F1C3A781476 /* MAIndoorInfo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAIndoorInfo.h; path = MAMapKit.framework/Headers/MAIndoorInfo.h; sourceTree = ""; }; + 3F5B1FAC4C895D00527AEDA143FBC575 /* AMapGeoFenceRegionObj.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapGeoFenceRegionObj.h; path = AMapLocationKit.framework/Headers/AMapGeoFenceRegionObj.h; sourceTree = ""; }; + 410B56C1B8326BC9C19B0DB75544B3CA /* UMCommon-xcframeworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "UMCommon-xcframeworks.sh"; sourceTree = ""; }; + 410D0EEAD5DDC79E3DC3911CE33BA2CA /* AMap.bundle */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "wrapper.plug-in"; name = AMap.bundle; path = MAMapKit.framework/AMap.bundle; sourceTree = ""; }; + 41912F06D7E7D5A38C37B6E577D9D059 /* Pods-suixinkan-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-suixinkan-frameworks.sh"; sourceTree = ""; }; + 41ADD30512AEB247C434B54400AA1B8E /* MABaseEngineOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MABaseEngineOverlay.h; path = MAMapKit.framework/Headers/MABaseEngineOverlay.h; sourceTree = ""; }; + 41F03B7A2358FDDBF756EDD2638B0980 /* ResourceBundle-IQKeyboardManagerSwift-IQKeyboardManagerSwift-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-IQKeyboardManagerSwift-IQKeyboardManagerSwift-Info.plist"; sourceTree = ""; }; + 45271BD948661C63407D83810E087058 /* MARouteOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MARouteOverlay.h; path = MAMapKit.framework/Headers/MARouteOverlay.h; sourceTree = ""; }; + 45AED264113ACD57ECAF26F0F85FFB62 /* IQTextView.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQTextView.debug.xcconfig; sourceTree = ""; }; + 4704657980AE2A1E10A33E609D6B926B /* AMapSearchKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapSearchKit.h; path = AMapSearchKit.framework/Headers/AMapSearchKit.h; sourceTree = ""; }; + 474B492B560C872CE952C1D51969406A /* IQKeyboardInfo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQKeyboardInfo.swift; path = IQKeyboardNotification/Classes/IQKeyboardInfo.swift; sourceTree = ""; }; + 48055AC80B1D94B7F9E2BF87BB984279 /* IQTextView-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "IQTextView-umbrella.h"; sourceTree = ""; }; + 485F955AC67F8718BC7E213433D68CAF /* AMapSearchAPI.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapSearchAPI.h; path = AMapSearchKit.framework/Headers/AMapSearchAPI.h; sourceTree = ""; }; + 49433A7414A4DAC29B5BF7295ADBC92D /* IQPlaceholderable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQPlaceholderable.swift; path = IQKeyboardToolbar/Placeholderable/IQPlaceholderable.swift; sourceTree = ""; }; + 49AF7809713DA87B3E840B2C01FFFAE6 /* MAShape.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAShape.h; path = MAMapKit.framework/Headers/MAShape.h; sourceTree = ""; }; + 49E3CA5E36443AE3EFB66EE0A3530956 /* IQKeyboardManager+Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardManager+Deprecated.swift"; path = "IQKeyboardManagerSwift/IQKeyboardManager/Deprecated/IQKeyboardManager+Deprecated.swift"; sourceTree = ""; }; + 4A775B0BB66007F06E41DFE74B3A9929 /* AMapFoundationKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = AMapFoundationKit.framework; sourceTree = ""; }; + 4B2ADDFC7774B5BE010DDF66FAAB1D3B /* MAMapStatus.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMapStatus.h; path = MAMapKit.framework/Headers/MAMapStatus.h; sourceTree = ""; }; + 4B57823CC43E41F28928353470005B2C /* AMapLocationCommonObj.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapLocationCommonObj.h; path = AMapLocationKit.framework/Headers/AMapLocationCommonObj.h; sourceTree = ""; }; + 4DA9CE84A9AE0E48E882398B7D78849C /* IQKeyboardNotification-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "IQKeyboardNotification-prefix.pch"; sourceTree = ""; }; + 4DB9C28692E9F990C88D2461FF36F728 /* MATraceManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MATraceManager.h; path = MAMapKit.framework/Headers/MATraceManager.h; sourceTree = ""; }; + 4F9CC787EDE5D230D3BB2F2DA0ABEB99 /* IQTextInputViewInfo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQTextInputViewInfo.swift; path = IQTextInputViewNotification/Classes/IQTextInputViewInfo.swift; sourceTree = ""; }; + 4FDF616BAC83E63DB1F6D89BD0C25949 /* IQKeyboardManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQKeyboardManager.swift; path = IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager.swift; sourceTree = ""; }; + 51C2DC792A6DF0C698B5CA877445AD73 /* IQDeepResponderContainerView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQDeepResponderContainerView.swift; path = IQKeyboardToolbarManager/Classes/IQDeepResponderContainerView.swift; sourceTree = ""; }; + 526DA4BEC1A96C86419B2B0A724CEAAC /* UIViewController+ParentContainer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIViewController+ParentContainer.swift"; path = "IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UIViewController+ParentContainer.swift"; sourceTree = ""; }; + 5279670AC68B19C16BC817052738C47C /* IQKeyboardAppearanceManager+Internal.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardAppearanceManager+Internal.swift"; path = "IQKeyboardManagerSwift/Appearance/IQKeyboardAppearanceManager+Internal.swift"; sourceTree = ""; }; + 530DCF2469E6370042646A66DA07F65B /* UMAPM.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = UMAPM.debug.xcconfig; sourceTree = ""; }; + 538CBFD998EF3722E7689C6296456C1C /* UIView+RespondersObjc.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIView+RespondersObjc.swift"; path = "IQKeyboardToolbarManager/Classes/UIKitExtensions/UIView+RespondersObjc.swift"; sourceTree = ""; }; + 55417717066654E20173101D0149276F /* MAMapKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMapKit.h; path = MAMapKit.framework/Headers/MAMapKit.h; sourceTree = ""; }; + 568F2B31726426E57A3F36BBBF5F42B8 /* MAHeatMapVectorOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAHeatMapVectorOverlay.h; path = MAMapKit.framework/Headers/MAHeatMapVectorOverlay.h; sourceTree = ""; }; + 56B3624858B660D9DDBBEB280A080869 /* IQTextInputViewNotification.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQTextInputViewNotification.debug.xcconfig; sourceTree = ""; }; + 56EBDABD8EC0E4FF033038CB98DC0DD8 /* IQTextView.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQTextView.release.xcconfig; sourceTree = ""; }; + 57D639F0A4D2DCE8A55EE9F3FB949A93 /* MAParticleOverlayOptions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAParticleOverlayOptions.h; path = MAMapKit.framework/Headers/MAParticleOverlayOptions.h; sourceTree = ""; }; + 586ADA6A1632DBA2224552BFBA22581D /* IQInvocation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQInvocation.swift; path = IQKeyboardToolbar/Classes/IQBarButtonItem/IQInvocation.swift; sourceTree = ""; }; + 59596161CD8354A2C07152FA9E27F084 /* MAMultiTexturePolylineRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMultiTexturePolylineRenderer.h; path = MAMapKit.framework/Headers/MAMultiTexturePolylineRenderer.h; sourceTree = ""; }; + 59C621AA9DE12990B43EFD34DF01B08B /* AMapFoundationConst.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapFoundationConst.h; path = AMapFoundationKit.framework/Headers/AMapFoundationConst.h; sourceTree = ""; }; + 5A5D1BE1351215B2227904B08017BC18 /* Pods-suixinkanTests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-suixinkanTests.modulemap"; sourceTree = ""; }; 5BD109278933E8C2F269E5DCEC3A5376 /* Pods-suixinkan */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Pods-suixinkan"; path = Pods_suixinkan.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 5BDBFE9A3501719BF5A45FCF0782CDBE /* AMapLocationManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapLocationManager.h; path = AMapLocationKit.framework/Headers/AMapLocationManager.h; sourceTree = ""; }; - 5D2FAE9F6CE73F35242C57FADF198A4F /* MATerrainOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MATerrainOverlay.h; path = MAMapKit.framework/Headers/MATerrainOverlay.h; sourceTree = ""; }; - 607B12309D4BBE0A374F5681BC22567B /* MAArcRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAArcRenderer.h; path = MAMapKit.framework/Headers/MAArcRenderer.h; sourceTree = ""; }; - 61B7C8006610229F8A3485704A3944CF /* Pods-suixinkan.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-suixinkan.debug.xcconfig"; sourceTree = ""; }; - 632CBA3F863D4B4C036343CBE79395A0 /* AMapGeoFenceRegionObj.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapGeoFenceRegionObj.h; path = AMapLocationKit.framework/Headers/AMapGeoFenceRegionObj.h; sourceTree = ""; }; - 64240DCE9E380E0318667593766AB4D8 /* AMapURLSearch.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapURLSearch.h; path = AMapFoundationKit.framework/Headers/AMapURLSearch.h; sourceTree = ""; }; - 64C0BEE472E88B93EB7D366E5B2597E4 /* UMDevice.xcframework */ = {isa = PBXFileReference; includeInIndex = 1; name = UMDevice.xcframework; path = UMDevice_3.6.0/UMDevice.xcframework; sourceTree = ""; }; - 657980EFF8962794190BFF647D3FEF24 /* AMapGeoFenceError.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapGeoFenceError.h; path = AMapLocationKit.framework/Headers/AMapGeoFenceError.h; sourceTree = ""; }; - 65EE9CD76EF8BD358253184A5FA8B069 /* Pods-suixinkanTests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-suixinkanTests-umbrella.h"; sourceTree = ""; }; - 664E58E6DDC2966578A2C9D32D9D8FFD /* MAGroundOverlayRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAGroundOverlayRenderer.h; path = MAMapKit.framework/Headers/MAGroundOverlayRenderer.h; sourceTree = ""; }; - 668A9B1E2D7B1954AE52ABE25041CC36 /* Pods-suixinkanTests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-suixinkanTests-acknowledgements.markdown"; sourceTree = ""; }; - 68FB23F98494515B5F635B2080AC2D74 /* MAMultiPointOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMultiPointOverlay.h; path = MAMapKit.framework/Headers/MAMultiPointOverlay.h; sourceTree = ""; }; - 6A16CCC3A9F4BA44294C343AAA01EC6A /* MAShape.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAShape.h; path = MAMapKit.framework/Headers/MAShape.h; sourceTree = ""; }; - 6DDB0F91BAEEA431301574B316329B0D /* MATouchPoi.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MATouchPoi.h; path = MAMapKit.framework/Headers/MATouchPoi.h; sourceTree = ""; }; - 72424614C718027B387FB239F679271E /* WechatOpenSDK-XCFramework-xcframeworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "WechatOpenSDK-XCFramework-xcframeworks.sh"; sourceTree = ""; }; - 746BFCBA1ABA7DC28009805E10F58829 /* MATileOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MATileOverlay.h; path = MAMapKit.framework/Headers/MATileOverlay.h; sourceTree = ""; }; - 75399BCB7E0D56E144717DDCD6C7FBBC /* MAOfflineMapViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOfflineMapViewController.h; path = MAMapKit.framework/Headers/MAOfflineMapViewController.h; sourceTree = ""; }; - 764EBFD12BB5DBE470C3B3EE75778E69 /* AMapFoundationKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapFoundationKit.h; path = AMapFoundationKit.framework/Headers/AMapFoundationKit.h; sourceTree = ""; }; - 78B6815DC0004C618630DC5100B63C80 /* MAGroundOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAGroundOverlay.h; path = MAMapKit.framework/Headers/MAGroundOverlay.h; sourceTree = ""; }; - 79F61EDF41457CD8F6AC99EEB203BDEF /* MATraceManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MATraceManager.h; path = MAMapKit.framework/Headers/MATraceManager.h; sourceTree = ""; }; - 7A8928E3841166C87F9104F3C7257ED1 /* MAAnnotationView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAAnnotationView.h; path = MAMapKit.framework/Headers/MAAnnotationView.h; sourceTree = ""; }; - 7A9B9169FDEDF62E64E2DE22F85610ED /* AMapSearchAPI.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapSearchAPI.h; path = AMapSearchKit.framework/Headers/AMapSearchAPI.h; sourceTree = ""; }; - 7D7597DC9C40CDD0257013247AFBE4C8 /* AMapCommonObj.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapCommonObj.h; path = AMapSearchKit.framework/Headers/AMapCommonObj.h; sourceTree = ""; }; - 7FA9E9DE9F0DB76774F19BF713363C1C /* UMDevice.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = UMDevice.debug.xcconfig; sourceTree = ""; }; - 87983C1BFF90B26765DB26FA52DC8FBE /* MAParticleOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAParticleOverlay.h; path = MAMapKit.framework/Headers/MAParticleOverlay.h; sourceTree = ""; }; - 8954141270608938A38FD68585BFD293 /* Pods-suixinkanTests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-suixinkanTests.modulemap"; sourceTree = ""; }; - 8A2882BF8F5DC25616C1ED02D8BADE8B /* AMapSearch-NO-IDFA.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "AMapSearch-NO-IDFA.debug.xcconfig"; sourceTree = ""; }; - 8C64DEFEB1E7F2C66D9E36F704EB2EDA /* Pods-suixinkan.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-suixinkan.modulemap"; sourceTree = ""; }; - 8D804F47730C24A80564C45691D62159 /* MAMapKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMapKit.h; path = MAMapKit.framework/Headers/MAMapKit.h; sourceTree = ""; }; - 8E8D9B985354179A70BB4148A96CB106 /* AMapFoundationVersion.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapFoundationVersion.h; path = AMapFoundationKit.framework/Headers/AMapFoundationVersion.h; sourceTree = ""; }; - 930BB613D93B3F0743FE520201572148 /* Pods-suixinkanTests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-suixinkanTests-acknowledgements.plist"; sourceTree = ""; }; - 93364FC6486AA57E263ACEAB802CA297 /* WechatOpenSDK-XCFramework.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "WechatOpenSDK-XCFramework.debug.xcconfig"; sourceTree = ""; }; - 9392453F7B8C8EC1DBC411A28840D283 /* MACircleRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MACircleRenderer.h; path = MAMapKit.framework/Headers/MACircleRenderer.h; sourceTree = ""; }; - 9A4789EE651F9A3985C6652F8EF58F6B /* UMCommon-xcframeworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "UMCommon-xcframeworks.sh"; sourceTree = ""; }; + 5D7F4C8DBE08B54A8D13ABD8BDF9D13A /* IQTextInputView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQTextInputView.swift; path = IQKeyboardCore/Classes/IQTextInputView.swift; sourceTree = ""; }; + 5E7C51C9D03E4F23E428C0C1AFFE32A7 /* UIView+ParentObjc.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIView+ParentObjc.swift"; path = "IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UIView+ParentObjc.swift"; sourceTree = ""; }; + 5EC51B95CEAEB39AE17EE8C8A1315458 /* IQKeyboardToolbar.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = IQKeyboardToolbar.modulemap; sourceTree = ""; }; + 5FA112782CA9F7A1FA52C5A334A9734F /* MAOfflineItemNationWide.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOfflineItemNationWide.h; path = MAMapKit.framework/Headers/MAOfflineItemNationWide.h; sourceTree = ""; }; + 5FB231080671A8D81B7D69851169AFF4 /* MARouteOverlayModel.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MARouteOverlayModel.h; path = MAMapKit.framework/Headers/MARouteOverlayModel.h; sourceTree = ""; }; + 6183432F20DA00F9E0A8AD4AB8569CFF /* IQTextInputViewNotification.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQTextInputViewNotification.swift; path = IQTextInputViewNotification/Classes/IQTextInputViewNotification.swift; sourceTree = ""; }; + 61C8B1DA3B268A12F02985D29EFC8C82 /* UIView+ResignObjc.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIView+ResignObjc.swift"; path = "IQKeyboardManagerSwift/Resign/UIKItExtensions/UIView+ResignObjc.swift"; sourceTree = ""; }; + 63070DE77E76B5B254CA451C68509EF5 /* IQBarButtonItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQBarButtonItem.swift; path = IQKeyboardToolbar/Classes/IQBarButtonItem/IQBarButtonItem.swift; sourceTree = ""; }; + 6464447070DB8A1E9C56338928A9DC0F /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; + 647AECC2271497CFBB36311165FC0BF0 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; + 648E27D8BEFDF4B6FECE1F3272B70252 /* MAMapView+Resource.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "MAMapView+Resource.h"; path = "MAMapKit.framework/Headers/MAMapView+Resource.h"; sourceTree = ""; }; + 65502F5FF9DEEAC1D8D36A27E85FEE02 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = IQKeyboardReturnManager/Assets/PrivacyInfo.xcprivacy; sourceTree = ""; }; + 66E6C52C14F00CC472AAF5FF2586C0A6 /* AMapSearchError.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapSearchError.h; path = AMapSearchKit.framework/Headers/AMapSearchError.h; sourceTree = ""; }; + 675C87643DA15213B2237CB3F10145F9 /* MAPolygon.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAPolygon.h; path = MAMapKit.framework/Headers/MAPolygon.h; sourceTree = ""; }; + 678E22BC596467BFE77D6AC56DE6B506 /* MAGeodesicPolyline.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAGeodesicPolyline.h; path = MAMapKit.framework/Headers/MAGeodesicPolyline.h; sourceTree = ""; }; + 68F50E3C54264FA6F8FEC4D7C86F2A8E /* IQKeyboardToolbar.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQKeyboardToolbar.swift; path = IQKeyboardToolbar/Classes/IQKeyboardToolbar.swift; sourceTree = ""; }; + 6A7D9DC50C63535042164A35DFD40EC2 /* IQKeyboardToolbar-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "IQKeyboardToolbar-umbrella.h"; sourceTree = ""; }; + 6AE0AF60D0E6264EA8879C056FEFF333 /* IQTextInputViewNotification-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "IQTextInputViewNotification-prefix.pch"; sourceTree = ""; }; + 6B27D89D91D9554E7D55DCA8850866D3 /* MAOfflineCity.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOfflineCity.h; path = MAMapKit.framework/Headers/MAOfflineCity.h; sourceTree = ""; }; + 6B80A312E4595DC570848E3CCAB974AE /* AMapCommonObj.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapCommonObj.h; path = AMapSearchKit.framework/Headers/AMapCommonObj.h; sourceTree = ""; }; + 6B8F7D50992F93A9D502BFAD4018B610 /* IQKeyboardToolbarManager-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "IQKeyboardToolbarManager-umbrella.h"; sourceTree = ""; }; + 6B90DE7BD5C01A044C39F72CCC36A2E6 /* MATerrainOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MATerrainOverlay.h; path = MAMapKit.framework/Headers/MATerrainOverlay.h; sourceTree = ""; }; + 6C8B2C7235B11C85311CBBD9ACAD5C21 /* MAMapView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMapView.h; path = MAMapKit.framework/Headers/MAMapView.h; sourceTree = ""; }; + 6C958D24E4FE5EFD8C5B81405559A4BD /* IQKeyboardAppearanceManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQKeyboardAppearanceManager.swift; path = IQKeyboardManagerSwift/Appearance/IQKeyboardAppearanceManager.swift; sourceTree = ""; }; + 6D9EBCEF6F3F2A232E2FD51767D24513 /* UIView+Parent.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIView+Parent.swift"; path = "IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UIView+Parent.swift"; sourceTree = ""; }; + 6DDD0F740279371A970E178D332D97B0 /* IQKeyboardToolbarManager-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "IQKeyboardToolbarManager-prefix.pch"; sourceTree = ""; }; + 6E0C9CBED8099166C28C4A4EE5F3A4DB /* AMapGeoFenceError.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapGeoFenceError.h; path = AMapLocationKit.framework/Headers/AMapGeoFenceError.h; sourceTree = ""; }; + 6E14BDA75AF00D9E7A51C5542367D0C5 /* MAArcRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAArcRenderer.h; path = MAMapKit.framework/Headers/MAArcRenderer.h; sourceTree = ""; }; + 6E897F35E5E27028AC58B14B552FBC8D /* IQKeyboardCore-IQKeyboardCore */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "IQKeyboardCore-IQKeyboardCore"; path = IQKeyboardCore.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; + 6FED7B503B038DD91ADA3CD3CBB7596A /* MAConfig.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAConfig.h; path = MAMapKit.framework/Headers/MAConfig.h; sourceTree = ""; }; + 7117F9A1DF7F687A834B261182C1EA55 /* MAArc.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAArc.h; path = MAMapKit.framework/Headers/MAArc.h; sourceTree = ""; }; + 7231AA5CB6E0767D9B4DAEC51CA29801 /* MAOverlayRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOverlayRenderer.h; path = MAMapKit.framework/Headers/MAOverlayRenderer.h; sourceTree = ""; }; + 72BBF069358CCF73D8E674385813A466 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = IQKeyboardToolbarManager/Assets/PrivacyInfo.xcprivacy; sourceTree = ""; }; + 7390E83941C265B7AC76FEEBD5F05C25 /* MAMVTTileOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMVTTileOverlay.h; path = MAMapKit.framework/Headers/MAMVTTileOverlay.h; sourceTree = ""; }; + 73E69C62CB648A1F39A51A68FCE70203 /* UIScrollView+IQKeyboardManagerExtension.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIScrollView+IQKeyboardManagerExtension.swift"; path = "IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIScrollView+IQKeyboardManagerExtension.swift"; sourceTree = ""; }; + 754436F7705D79991C66788AEA045C77 /* IQKeyboardToolbar.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQKeyboardToolbar.debug.xcconfig; sourceTree = ""; }; + 7970E185DCA1CE6D331C00CC66BFEAA3 /* Pods-suixinkan-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-suixinkan-acknowledgements.plist"; sourceTree = ""; }; + 7A7B464DF9B57DFAF21817F1BAA83F12 /* AMapSearchObj.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapSearchObj.h; path = AMapSearchKit.framework/Headers/AMapSearchObj.h; sourceTree = ""; }; + 7BCBC763937F56378DD43E852B2F5630 /* UMAPM-xcframeworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "UMAPM-xcframeworks.sh"; sourceTree = ""; }; + 7CCC40E939F7246E1F0244955BDFF328 /* IQKeyboardToolbarManager-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "IQKeyboardToolbarManager-dummy.m"; sourceTree = ""; }; + 7CD5F62CF1C96772886D9C93F472561F /* AMapNearbyUploadInfo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapNearbyUploadInfo.h; path = AMapSearchKit.framework/Headers/AMapNearbyUploadInfo.h; sourceTree = ""; }; + 7EC30B9EBF71A33CFE3B7A50F7A262A1 /* UICollectionView+IndexPaths.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UICollectionView+IndexPaths.swift"; path = "IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UICollectionView+IndexPaths.swift"; sourceTree = ""; }; + 803FEE5356A6FBA7ED0EAAFC5BC123C9 /* IQKeyboardToolbar-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "IQKeyboardToolbar-Info.plist"; sourceTree = ""; }; + 80A40EDA3AF0499BDBCFF09467BB49AD /* IQKeyboardToolbarManager-IQKeyboardToolbarManager */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "IQKeyboardToolbarManager-IQKeyboardToolbarManager"; path = IQKeyboardToolbarManager.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; + 80ADE748531456ABDDE44B5173787FA4 /* UIView+Responders.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIView+Responders.swift"; path = "IQKeyboardToolbarManager/Classes/UIKitExtensions/UIView+Responders.swift"; sourceTree = ""; }; + 80DCD72F7A8519A9463BFC22D8AD02A4 /* IQKeyboardManager+ToolbarManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardManager+ToolbarManager.swift"; path = "IQKeyboardManagerSwift/IQKeyboardToolbarManager/IQKeyboardManager+ToolbarManager.swift"; sourceTree = ""; }; + 8211233F52EF3340C23AE2618ECA5236 /* AMapUtility.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapUtility.h; path = AMapFoundationKit.framework/Headers/AMapUtility.h; sourceTree = ""; }; + 821CFE722ABC9FDF53472054DEED7118 /* UMDevice.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = UMDevice.debug.xcconfig; sourceTree = ""; }; + 847044E56CBBCE1235A6F3CEF3F9F607 /* IQTextView-IQTextView */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "IQTextView-IQTextView"; path = IQTextView.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; + 85D9B67B548F1C9544DCB01D4EB6FE1D /* IQKeyboardConstants.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQKeyboardConstants.swift; path = IQKeyboardCore/Classes/Constants/IQKeyboardConstants.swift; sourceTree = ""; }; + 861EDB4B4F61692A313FF611C8CF95AF /* IQKeyboardAppearanceConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQKeyboardAppearanceConfiguration.swift; path = IQKeyboardManagerSwift/Appearance/IQKeyboardAppearanceConfiguration.swift; sourceTree = ""; }; + 8972D89261103F625BBE350DC6A5E5BD /* IQKeyboardReturnManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQKeyboardReturnManager.swift; path = IQKeyboardReturnManager/Classes/IQKeyboardReturnManager.swift; sourceTree = ""; }; + 8999012F56CA3CCE7F5291E17D8E5ADF /* UMDevice.xcframework */ = {isa = PBXFileReference; includeInIndex = 1; name = UMDevice.xcframework; path = UMDevice_3.6.0/UMDevice.xcframework; sourceTree = ""; }; + 8AC85556DEF7C559A040F57C33A40633 /* MAAnimatedAnnotation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAAnimatedAnnotation.h; path = MAMapKit.framework/Headers/MAAnimatedAnnotation.h; sourceTree = ""; }; + 8B745529877AADD74BC646FB33E8D06D /* MAOfflineItemCommonCity.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOfflineItemCommonCity.h; path = MAMapKit.framework/Headers/MAOfflineItemCommonCity.h; sourceTree = ""; }; + 8B7EC073F09A1F9D54780D9C77AF25BF /* IQKeyboardToolbarPlaceholderConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQKeyboardToolbarPlaceholderConfiguration.swift; path = IQKeyboardToolbar/Classes/Placeholder/IQKeyboardToolbarPlaceholderConfiguration.swift; sourceTree = ""; }; + 8BCE0C5C82A85BEE1FB8964A80995A91 /* MAMultiColoredPolylineRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMultiColoredPolylineRenderer.h; path = MAMapKit.framework/Headers/MAMultiColoredPolylineRenderer.h; sourceTree = ""; }; + 8C20CA4CA00D852DE4609FBBC631500B /* IQKeyboardCore-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "IQKeyboardCore-Info.plist"; sourceTree = ""; }; + 8CCEBE1D4B4C8B5E5D13F95AB75BA1C1 /* MAMapCustomStyleOptions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMapCustomStyleOptions.h; path = MAMapKit.framework/Headers/MAMapCustomStyleOptions.h; sourceTree = ""; }; + 8D62245CAF96E6999E0AD7443CEBB060 /* AMapFoundationVersion.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapFoundationVersion.h; path = AMapFoundationKit.framework/Headers/AMapFoundationVersion.h; sourceTree = ""; }; + 8D8069D3964814114ACEC3084C010B59 /* IQKeyboardManagerSwift-IQKeyboardManagerSwift */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "IQKeyboardManagerSwift-IQKeyboardManagerSwift"; path = IQKeyboardManagerSwift.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; + 8DB9F697E059AD84BBE6DB6241D65A19 /* Pods-suixinkanTests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-suixinkanTests-umbrella.h"; sourceTree = ""; }; + 8DC1D17AA22E3F30BEC1992D3A9C677B /* Pods-suixinkan.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-suixinkan.modulemap"; sourceTree = ""; }; + 923A5EAEF9B65C7570AA35B60017E644 /* IQKeyboardCore-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "IQKeyboardCore-prefix.pch"; sourceTree = ""; }; + 93D0847F3C4AEFBCEB0F33321FA38F74 /* MAAnnotationView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAAnnotationView.h; path = MAMapKit.framework/Headers/MAAnnotationView.h; sourceTree = ""; }; + 93FDE424FD40693C3039FAD46BC403D0 /* IQKeyboardReturnManager.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQKeyboardReturnManager.release.xcconfig; sourceTree = ""; }; + 944EAA15B09A4E08CA61331DE749BA33 /* ResourceBundle-IQKeyboardCore-IQKeyboardCore-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-IQKeyboardCore-IQKeyboardCore-Info.plist"; sourceTree = ""; }; + 95ADDDA73C96A467FAB58645AD894407 /* MACircle.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MACircle.h; path = MAMapKit.framework/Headers/MACircle.h; sourceTree = ""; }; + 96C3F195B902C9DB4501E896E1169EE5 /* AMapSearchObjV1.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapSearchObjV1.h; path = AMapSearchKit.framework/Headers/AMapSearchObjV1.h; sourceTree = ""; }; + 98C600FCCEF4A91D173BC8EFDC782856 /* IQKeyboardToolbar-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "IQKeyboardToolbar-dummy.m"; sourceTree = ""; }; + 98D4A05B914687A10BBD1D8F52BC1D96 /* MABaseOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MABaseOverlay.h; path = MAMapKit.framework/Headers/MABaseOverlay.h; sourceTree = ""; }; + 98FF779CBB45904DCD621D23A2CA7B2E /* MATerrainOverlayRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MATerrainOverlayRenderer.h; path = MAMapKit.framework/Headers/MATerrainOverlayRenderer.h; sourceTree = ""; }; + 99252666C73C321ECC501FF47D66FA88 /* IQKeyboardManagerSwift.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQKeyboardManagerSwift.release.xcconfig; sourceTree = ""; }; + 99F6EE572187DA42701B0F5D6C460792 /* MAPolygonRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAPolygonRenderer.h; path = MAMapKit.framework/Headers/MAPolygonRenderer.h; sourceTree = ""; }; + 9B57A3B2533A44DCE9EAEA72C2166ADB /* MAParticleOverlayRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAParticleOverlayRenderer.h; path = MAMapKit.framework/Headers/MAParticleOverlayRenderer.h; sourceTree = ""; }; + 9B64ACDF6D4EC7B93904691EB45C5C93 /* IQBarButtonItemConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQBarButtonItemConfiguration.swift; path = IQKeyboardToolbar/Classes/IQBarButtonItem/IQBarButtonItemConfiguration.swift; sourceTree = ""; }; + 9BC7FD73096F0E682B997CB07C344AC1 /* AMapFoundation-NO-IDFA.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "AMapFoundation-NO-IDFA.release.xcconfig"; sourceTree = ""; }; + 9C93DB51A175907CE39A60A4864E2588 /* MAOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOverlay.h; path = MAMapKit.framework/Headers/MAOverlay.h; sourceTree = ""; }; 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - 9DAF861C234DEFE0565960A25179B328 /* MAMVTTileOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMVTTileOverlay.h; path = MAMapKit.framework/Headers/MAMVTTileOverlay.h; sourceTree = ""; }; - 9EABEC92964633D02091EEB81DAC2A28 /* Pods-suixinkan-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-suixinkan-resources.sh"; sourceTree = ""; }; - A187CDD3DB66CAE55829663F7709D099 /* MAGeometry.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAGeometry.h; path = MAMapKit.framework/Headers/MAGeometry.h; sourceTree = ""; }; - A1C2AE0D141F894C0C841BDB91EA7784 /* Pods-suixinkanTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-suixinkanTests.release.xcconfig"; sourceTree = ""; }; - A36042A49C0F8540D18B799FFE9BAF4F /* UMCommon.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = UMCommon.debug.xcconfig; sourceTree = ""; }; - A41513919123C2DB492F2915452B99FB /* MACustomBuildingOverlayRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MACustomBuildingOverlayRenderer.h; path = MAMapKit.framework/Headers/MACustomBuildingOverlayRenderer.h; sourceTree = ""; }; - A544FE588B3DA9A5527AB2104C1E3F6E /* UMDevice.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = UMDevice.release.xcconfig; sourceTree = ""; }; - A54E3FB167D0EBC2D46C20A0F3D271F1 /* MAPathShowRange.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAPathShowRange.h; path = MAMapKit.framework/Headers/MAPathShowRange.h; sourceTree = ""; }; - A6363BBD4CE33059500F06D34B7147D5 /* AMapLocationKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = AMapLocationKit.framework; sourceTree = ""; }; - A64AFA54CDE002685FDDDBFF0A375A63 /* MAMultiColoredPolylineRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMultiColoredPolylineRenderer.h; path = MAMapKit.framework/Headers/MAMultiColoredPolylineRenderer.h; sourceTree = ""; }; - A847712EFCA54C3CF9E1B8503AE196D0 /* MAMapAccessibilityIdentifier.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMapAccessibilityIdentifier.h; path = MAMapKit.framework/Headers/MAMapAccessibilityIdentifier.h; sourceTree = ""; }; - B1D9E9672286630FEF14BE4CCD760A93 /* AMapSearchError.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapSearchError.h; path = AMapSearchKit.framework/Headers/AMapSearchError.h; sourceTree = ""; }; - B1DCEAC5E67DFFADA00E8D6182638950 /* UMCommon.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = UMCommon.release.xcconfig; sourceTree = ""; }; - B3ED06C9CF721AE092A9ACEA19083CAC /* MAOfflineCity.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOfflineCity.h; path = MAMapKit.framework/Headers/MAOfflineCity.h; sourceTree = ""; }; - B97A4D37BDFE1DD115297273C4F4AAA7 /* AMapLocation-NO-IDFA.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "AMapLocation-NO-IDFA.debug.xcconfig"; sourceTree = ""; }; - BB6368DD0AABE98EED2B91B0BA922B8D /* MABaseOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MABaseOverlay.h; path = MAMapKit.framework/Headers/MABaseOverlay.h; sourceTree = ""; }; - BBA147F6EAE0D76BC35E87FCF69C9C2D /* AMap3DMap-NO-IDFA.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "AMap3DMap-NO-IDFA.release.xcconfig"; sourceTree = ""; }; - BBC4E88072A58FC7DD14D5BC2316725E /* Pods-suixinkanTests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-suixinkanTests-dummy.m"; sourceTree = ""; }; - BC6A8AE37A44303A7921B0F1E00000F0 /* MAAnnotationMoveAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAAnnotationMoveAnimation.h; path = MAMapKit.framework/Headers/MAAnnotationMoveAnimation.h; sourceTree = ""; }; - BDBD995EABD877C6CF3EF8835C04E411 /* AMapNearbyUploadInfo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapNearbyUploadInfo.h; path = AMapSearchKit.framework/Headers/AMapNearbyUploadInfo.h; sourceTree = ""; }; - BDED1392DCAE0A8D3D23FC81AA7DC8CA /* UMDevice-xcframeworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "UMDevice-xcframeworks.sh"; sourceTree = ""; }; - BF228B17BC7260C40143BD13BD131504 /* Pods-suixinkan-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-suixinkan-dummy.m"; sourceTree = ""; }; - BF4E206010A80D9F4BD8AC654088FC62 /* MAAnimatedAnnotation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAAnimatedAnnotation.h; path = MAMapKit.framework/Headers/MAAnimatedAnnotation.h; sourceTree = ""; }; - BF6A4572B83783CEDEC1AE7ABB74B145 /* MAOverlayPathRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOverlayPathRenderer.h; path = MAMapKit.framework/Headers/MAOverlayPathRenderer.h; sourceTree = ""; }; - C163EE9A875637E6C1F824BA08BFE21B /* MAHeatMapVectorGridOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAHeatMapVectorGridOverlay.h; path = MAMapKit.framework/Headers/MAHeatMapVectorGridOverlay.h; sourceTree = ""; }; - C1DFE81417556E6F808D1284CF137ADE /* MAIndoorInfo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAIndoorInfo.h; path = MAMapKit.framework/Headers/MAIndoorInfo.h; sourceTree = ""; }; - C45073FF76FBFD70DE8060643C834BEE /* MAMultiPointOverlayRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMultiPointOverlayRenderer.h; path = MAMapKit.framework/Headers/MAMultiPointOverlayRenderer.h; sourceTree = ""; }; - C4B9730FA8B1A82502EDF50DAEF161F7 /* MAPolyline.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAPolyline.h; path = MAMapKit.framework/Headers/MAPolyline.h; sourceTree = ""; }; - C7114968961138953AAE2AD902FFD2A7 /* MARouteOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MARouteOverlay.h; path = MAMapKit.framework/Headers/MARouteOverlay.h; sourceTree = ""; }; - C78838CD3446DBC3B6C57416E5DF1601 /* MATileOverlayRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MATileOverlayRenderer.h; path = MAMapKit.framework/Headers/MATileOverlayRenderer.h; sourceTree = ""; }; - C80B7ABEF97D9D358AEC382367B8FEFE /* AMapSearchObjV1.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapSearchObjV1.h; path = AMapSearchKit.framework/Headers/AMapSearchObjV1.h; sourceTree = ""; }; - C8FDFE01BACEE8807D4E8E5EBB3104AF /* AMapLocationVersion.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapLocationVersion.h; path = AMapLocationKit.framework/Headers/AMapLocationVersion.h; sourceTree = ""; }; - CAA8F759C5471E04D0EDCFD5BAE3E1F3 /* MALineDrawType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MALineDrawType.h; path = MAMapKit.framework/Headers/MALineDrawType.h; sourceTree = ""; }; - CCCBE033D87F7E68F7F4F8A2604DB9FC /* MAHeatMapVectorOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAHeatMapVectorOverlay.h; path = MAMapKit.framework/Headers/MAHeatMapVectorOverlay.h; sourceTree = ""; }; - CCEB62137B691B96014FCE7C2963DE89 /* AMapFoundation-NO-IDFA.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "AMapFoundation-NO-IDFA.release.xcconfig"; sourceTree = ""; }; - CE36A961B0F78784EC9BFE7F48C84F82 /* Pods-suixinkan-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-suixinkan-umbrella.h"; sourceTree = ""; }; - D0E173B83918C3601469EC66C94A97BE /* MAMapVersion.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMapVersion.h; path = MAMapKit.framework/Headers/MAMapVersion.h; sourceTree = ""; }; - D3DF0EA33F3079DDA692A775FDC514CA /* MAPointAnnotation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAPointAnnotation.h; path = MAMapKit.framework/Headers/MAPointAnnotation.h; sourceTree = ""; }; - D3E4AF577ED21FFF5C6997614BE817AF /* UMAPM-xcframeworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "UMAPM-xcframeworks.sh"; sourceTree = ""; }; - D49628F6F87CD3F4A82F10BBA92C44A3 /* Pods-suixinkan-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-suixinkan-Info.plist"; sourceTree = ""; }; - D49F2B29B08A21CE8044825FB0F690B6 /* MAMultiPolyline.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMultiPolyline.h; path = MAMapKit.framework/Headers/MAMultiPolyline.h; sourceTree = ""; }; - D738B4EADCCC0969B2C74EDD60C54C5F /* UMAPM.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = UMAPM.debug.xcconfig; sourceTree = ""; }; - D886BE5A9F5F18037B49BF5843A23557 /* MATraceLocation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MATraceLocation.h; path = MAMapKit.framework/Headers/MATraceLocation.h; sourceTree = ""; }; - DAB1615CF37670F70B385FD315D74635 /* MAPinAnnotationView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAPinAnnotationView.h; path = MAMapKit.framework/Headers/MAPinAnnotationView.h; sourceTree = ""; }; - DC5BC1CE33C0778D3DF37DD68AF6A540 /* MAConfig.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAConfig.h; path = MAMapKit.framework/Headers/MAConfig.h; sourceTree = ""; }; - DE563497DD3BB9A6B51060C88124B030 /* MAUserLocationRepresentation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAUserLocationRepresentation.h; path = MAMapKit.framework/Headers/MAUserLocationRepresentation.h; sourceTree = ""; }; - DE9CCDAE04DBF0C5163DC000763E8F22 /* MACustomBuildingOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MACustomBuildingOverlay.h; path = MAMapKit.framework/Headers/MACustomBuildingOverlay.h; sourceTree = ""; }; - DEBCCADE7DDBA90A395DEF6DA0DB1549 /* MACircle.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MACircle.h; path = MAMapKit.framework/Headers/MACircle.h; sourceTree = ""; }; - DED06228F2ED3100A01944BF056F3316 /* AMapFoundation-NO-IDFA.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "AMapFoundation-NO-IDFA.debug.xcconfig"; sourceTree = ""; }; - E326873DD4D64984A558D4FDE649FB4A /* MAHeatMapTileOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAHeatMapTileOverlay.h; path = MAMapKit.framework/Headers/MAHeatMapTileOverlay.h; sourceTree = ""; }; - E5B7CC2B4D07007A9C53EDC66CCD5799 /* MAPolylineRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAPolylineRenderer.h; path = MAMapKit.framework/Headers/MAPolylineRenderer.h; sourceTree = ""; }; - E6D4DE3793D4AB549D9078053FA2DE6D /* AMapServices.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapServices.h; path = AMapFoundationKit.framework/Headers/AMapServices.h; sourceTree = ""; }; - E715DDE336E4E382EFE238BD6C30978D /* MARouteOverlayModel.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MARouteOverlayModel.h; path = MAMapKit.framework/Headers/MARouteOverlayModel.h; sourceTree = ""; }; - EB4D968F4833DBC93E946E6496A71A4C /* UMCommon.xcframework */ = {isa = PBXFileReference; includeInIndex = 1; name = UMCommon.xcframework; path = UMCommon_7.5.11/UMCommon.xcframework; sourceTree = ""; }; - EC84D11EB46B7B391B31CD492CD597E3 /* MAMapKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = MAMapKit.framework; sourceTree = ""; }; - F399B851B018264B878AB2159250B7E9 /* AMapSearchObj.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapSearchObj.h; path = AMapSearchKit.framework/Headers/AMapSearchObj.h; sourceTree = ""; }; - F64961F52A461A351D3C2CF5AA5AB687 /* MAOfflineItemCommonCity.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOfflineItemCommonCity.h; path = MAMapKit.framework/Headers/MAOfflineItemCommonCity.h; sourceTree = ""; }; - F66C83E664848DC373508F2C5D874901 /* MAPoiFilter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAPoiFilter.h; path = MAMapKit.framework/Headers/MAPoiFilter.h; sourceTree = ""; }; - F68AE8892469CEEAB0C81AB0EF8E8A00 /* AMapGeoFenceManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapGeoFenceManager.h; path = AMapLocationKit.framework/Headers/AMapGeoFenceManager.h; sourceTree = ""; }; - F9EEA82DDCF0523711748E2553B7E441 /* AMapURLSearchType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapURLSearchType.h; path = AMapFoundationKit.framework/Headers/AMapURLSearchType.h; sourceTree = ""; }; - FA44E234FE67D2FC43874714AB8D64CE /* AMapLocation-NO-IDFA.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "AMapLocation-NO-IDFA.release.xcconfig"; sourceTree = ""; }; - FDCF5C554E9F565E7A081E7D2D4D4267 /* MABaseEngineOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MABaseEngineOverlay.h; path = MAMapKit.framework/Headers/MABaseEngineOverlay.h; sourceTree = ""; }; + 9E4BF580BDA53A23D79EE15962CCF36C /* IQKeyboardManager+Position.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardManager+Position.swift"; path = "IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+Position.swift"; sourceTree = ""; }; + 9F5FA7D2322208B09B5EA5D72D7209C6 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = IQTextView/Assets/PrivacyInfo.xcprivacy; sourceTree = ""; }; + A0547FB017A5DFBA2C76B16823FB9F72 /* MAMVTTileOverlayRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMVTTileOverlayRenderer.h; path = MAMapKit.framework/Headers/MAMVTTileOverlayRenderer.h; sourceTree = ""; }; + A0D0F9FC95E46E27D7FF27F0197EA010 /* UMAPM.xcframework */ = {isa = PBXFileReference; includeInIndex = 1; name = UMAPM.xcframework; path = UMAPM_2.0.7/UMAPM.xcframework; sourceTree = ""; }; + A16FD016E18EACCF6B23F219F2E236FE /* IQKeyboardToolbar-IQKeyboardToolbar */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "IQKeyboardToolbar-IQKeyboardToolbar"; path = IQKeyboardToolbar.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; + A338431F5EE59F889439480E11F55A35 /* IQKeyboardManager+Internal.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardManager+Internal.swift"; path = "IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+Internal.swift"; sourceTree = ""; }; + A3B88D3B9242AE15CCC3E92D2613A589 /* IQScrollViewConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQScrollViewConfiguration.swift; path = IQKeyboardManagerSwift/IQKeyboardManager/Configuration/IQScrollViewConfiguration.swift; sourceTree = ""; }; + A4F5C6DCF130F9E43D080DCCD27C8F64 /* IQKeyboardNotification.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQKeyboardNotification.release.xcconfig; sourceTree = ""; }; + A5AF7471F25972AED742BEF49A397B39 /* IQKeyboardNotification.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = IQKeyboardNotification.modulemap; sourceTree = ""; }; + A60233C7119F0105DB6C68E30CCC216F /* Pods-suixinkan-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-suixinkan-umbrella.h"; sourceTree = ""; }; + A67B65E64610A804D78568AFE2057CF4 /* IQKeyboardManagerSwift-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "IQKeyboardManagerSwift-dummy.m"; sourceTree = ""; }; + A6A3ABC34D5CA51948F7619021EEC414 /* Pods-suixinkan-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-suixinkan-dummy.m"; sourceTree = ""; }; + A76B5B2E4501EFABE820F1FA0A53B190 /* AMapURLSearch.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapURLSearch.h; path = AMapFoundationKit.framework/Headers/AMapURLSearch.h; sourceTree = ""; }; + A7CCCEC542C22890A5C1780CC936272D /* MAPoiFilter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAPoiFilter.h; path = MAMapKit.framework/Headers/MAPoiFilter.h; sourceTree = ""; }; + A8A2FAE36062DB36A7A86FD2D8816B14 /* IQKeyboardToolbarManager+Toolbar.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardToolbarManager+Toolbar.swift"; path = "IQKeyboardToolbarManager/Classes/Toolbar/IQKeyboardToolbarManager+Toolbar.swift"; sourceTree = ""; }; + A8E950A16D00F649C54FFB30F81D7842 /* IQKeyboardManagerSwift */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = IQKeyboardManagerSwift; path = IQKeyboardManagerSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + A92E1DCC03BC5DAD5064EB3DBD227D12 /* IQKeyboardToolbar.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQKeyboardToolbar.release.xcconfig; sourceTree = ""; }; + A975906B3CFBF2DD2C0D832B624B43E5 /* IQKeyboardNotification-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "IQKeyboardNotification-dummy.m"; sourceTree = ""; }; + ABA801F2197CA348789920AC30E34B52 /* MAUserLocationRepresentation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAUserLocationRepresentation.h; path = MAMapKit.framework/Headers/MAUserLocationRepresentation.h; sourceTree = ""; }; + ACF0BBF875B1A829EB0CEF621C75A491 /* IQKeyboardNotification-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "IQKeyboardNotification-umbrella.h"; sourceTree = ""; }; + ADCAC46CA8AEF179C511492B4BE969E5 /* MAHeatMapTileOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAHeatMapTileOverlay.h; path = MAMapKit.framework/Headers/MAHeatMapTileOverlay.h; sourceTree = ""; }; + AEF4F9351FE5B148A0234F5931DE6880 /* UMAPM.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = UMAPM.release.xcconfig; sourceTree = ""; }; + AF1C389FEE92688E867B717F7F760B81 /* IQTextInputViewInfoModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQTextInputViewInfoModel.swift; path = IQKeyboardReturnManager/Classes/IQTextInputViewInfoModel.swift; sourceTree = ""; }; + AFA40485EE83F94DDC2D4C718DE4758D /* IQRootControllerConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQRootControllerConfiguration.swift; path = IQKeyboardManagerSwift/IQKeyboardManager/Configuration/IQRootControllerConfiguration.swift; sourceTree = ""; }; + B0B134BD54CAC0568CEFCAC7A2C4D501 /* MAGroundOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAGroundOverlay.h; path = MAMapKit.framework/Headers/MAGroundOverlay.h; sourceTree = ""; }; + B230C109EAD1B602ED3A4501735751A4 /* MATouchPoi.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MATouchPoi.h; path = MAMapKit.framework/Headers/MATouchPoi.h; sourceTree = ""; }; + B381E333A40EB0E75671BF9FB617AC37 /* IQKeyboardManager+Resign_Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardManager+Resign_Deprecated.swift"; path = "IQKeyboardManagerSwift/Resign/IQKeyboardManager+Resign_Deprecated.swift"; sourceTree = ""; }; + B3A9B2740ED243A88FDF2D9AE77E9392 /* Pods-suixinkan.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-suixinkan.debug.xcconfig"; sourceTree = ""; }; + B45917D3D6E447F954940B2ED5C5CDE4 /* MAMultiPolyline.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMultiPolyline.h; path = MAMapKit.framework/Headers/MAMultiPolyline.h; sourceTree = ""; }; + B4B1A58096F15199A14069C5D6AA1C99 /* IQKeyboardToolbar */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = IQKeyboardToolbar; path = IQKeyboardToolbar.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B5277185841774F1173A60C70BEEAB43 /* IQKeyboardReturnManager-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "IQKeyboardReturnManager-umbrella.h"; sourceTree = ""; }; + B67A9FDAE9AD80D36B93C60100CF3E6E /* IQKeyboardManagerSwift.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = IQKeyboardManagerSwift.modulemap; sourceTree = ""; }; + B67ADBF9B39B38C0214A82C1CEB92B7E /* MAOfflineMapViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOfflineMapViewController.h; path = MAMapKit.framework/Headers/MAOfflineMapViewController.h; sourceTree = ""; }; + B80D24BAD77BA27807693623CE7D270D /* IQKeyboardNotification.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQKeyboardNotification.swift; path = IQKeyboardNotification/Classes/IQKeyboardNotification.swift; sourceTree = ""; }; + B80D6E12DED75CA167FDE0E093CE3EB2 /* MALineDrawType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MALineDrawType.h; path = MAMapKit.framework/Headers/MALineDrawType.h; sourceTree = ""; }; + B8AE791619AC35079A245E0E1C923B29 /* MACustomCalloutView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MACustomCalloutView.h; path = MAMapKit.framework/Headers/MACustomCalloutView.h; sourceTree = ""; }; + B8B228B45C2AF15F26A0708FF1F4C049 /* Array+Sort.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Array+Sort.swift"; path = "IQKeyboardToolbarManager/Classes/UIKitExtensions/Array+Sort.swift"; sourceTree = ""; }; + B8DC3BD343769A8E67DC140B14E40AFA /* IQKeyboardCore-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "IQKeyboardCore-umbrella.h"; sourceTree = ""; }; + B96511BAA4FE78A664B6E6551E3D01B4 /* MAGroundOverlayRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAGroundOverlayRenderer.h; path = MAMapKit.framework/Headers/MAGroundOverlayRenderer.h; sourceTree = ""; }; + BACFC696F17A03CB80DEEF73E77302E2 /* MAAnnotationMoveAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAAnnotationMoveAnimation.h; path = MAMapKit.framework/Headers/MAAnnotationMoveAnimation.h; sourceTree = ""; }; + BAD6A1CE728B2A4A22777ECC2C5F4BFC /* AMapURLSearchConfig.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapURLSearchConfig.h; path = AMapFoundationKit.framework/Headers/AMapURLSearchConfig.h; sourceTree = ""; }; + BBAE241099C81D8EFB2A062A04F43105 /* Pods-suixinkan-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-suixinkan-Info.plist"; sourceTree = ""; }; + BBEF1E405BF9FA8B45933C2D48DB8041 /* ResourceBundle-IQKeyboardReturnManager-IQKeyboardReturnManager-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-IQKeyboardReturnManager-IQKeyboardReturnManager-Info.plist"; sourceTree = ""; }; + BC19393AED11092453E09C8483EF87E8 /* UMCommon.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = UMCommon.debug.xcconfig; sourceTree = ""; }; + BC889F43B2C6A6F8CAF9AE34A437535A /* IQKeyboardToolbarManager+Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardToolbarManager+Deprecated.swift"; path = "IQKeyboardToolbarManager/Classes/IQKeyboardToolbarManager+Deprecated.swift"; sourceTree = ""; }; + BE0A38788022564F1272806A4515ED11 /* IQKeyboardManager+Appearance_Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardManager+Appearance_Deprecated.swift"; path = "IQKeyboardManagerSwift/Appearance/IQKeyboardManager+Appearance_Deprecated.swift"; sourceTree = ""; }; + BE29BCA8BFDA54E4CD9B0D3354642A00 /* IQKeyboardReturnManager+UITextFieldDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardReturnManager+UITextFieldDelegate.swift"; path = "IQKeyboardReturnManager/Classes/Delegates/IQKeyboardReturnManager+UITextFieldDelegate.swift"; sourceTree = ""; }; + BE3E3BE5A00DCFFFB9F3E9CECCDF4C87 /* MACustomBuildingOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MACustomBuildingOverlay.h; path = MAMapKit.framework/Headers/MACustomBuildingOverlay.h; sourceTree = ""; }; + BE8F0BF8A36B8140B1C8B56EB114A086 /* UIView+Hierarchy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIView+Hierarchy.swift"; path = "IQKeyboardCore/Classes/UIKitExtensions/UIView+Hierarchy.swift"; sourceTree = ""; }; + BECE7DDCA61A0E3D33D4AD9803F445BE /* IQTitleBarButtonItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQTitleBarButtonItem.swift; path = IQKeyboardToolbar/Classes/IQBarButtonItem/IQTitleBarButtonItem.swift; sourceTree = ""; }; + C0311C83C8A4F175A21D8A662EF13B87 /* Pods-suixinkanTests-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-suixinkanTests-Info.plist"; sourceTree = ""; }; + C0A209F6A3ED70A0B4E017DDC44D73C2 /* UIView+IQKeyboardManagerExtension.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIView+IQKeyboardManagerExtension.swift"; path = "IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIView+IQKeyboardManagerExtension.swift"; sourceTree = ""; }; + C318D1B54A3D843401F9DA4933592E1B /* IQKeyboardManager+Debug.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardManager+Debug.swift"; path = "IQKeyboardManagerSwift/IQKeyboardManager/Debug/IQKeyboardManager+Debug.swift"; sourceTree = ""; }; + C4C53D4D2AA9A89E5F58608BDE976D61 /* UIScrollView+IQKeyboardManagerExtensionObjc.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIScrollView+IQKeyboardManagerExtensionObjc.swift"; path = "IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIScrollView+IQKeyboardManagerExtensionObjc.swift"; sourceTree = ""; }; + C600E8679B2451D5B39BD50AC539E630 /* ResourceBundle-IQTextView-IQTextView-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-IQTextView-IQTextView-Info.plist"; sourceTree = ""; }; + C673BE82C521D6ADDBF2C4B8322DEA9D /* MACircleRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MACircleRenderer.h; path = MAMapKit.framework/Headers/MACircleRenderer.h; sourceTree = ""; }; + C6C125B834201C7BBEC16F597A39DA25 /* MAOfflineItemMunicipality.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOfflineItemMunicipality.h; path = MAMapKit.framework/Headers/MAOfflineItemMunicipality.h; sourceTree = ""; }; + C6E875478190A65FCE880AF91BACA896 /* MATileOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MATileOverlay.h; path = MAMapKit.framework/Headers/MATileOverlay.h; sourceTree = ""; }; + C83AC5811D580B3B54EA282688BDAA41 /* IQKeyboardManagerSwift-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "IQKeyboardManagerSwift-umbrella.h"; sourceTree = ""; }; + C9CD57117742F75FD0F149AF8E59EC81 /* IQKeyboardToolbarManager.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = IQKeyboardToolbarManager.modulemap; sourceTree = ""; }; + C9DC6694ECD3E3A0881A97E842D83D49 /* IQKeyboardManager+Resign.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardManager+Resign.swift"; path = "IQKeyboardManagerSwift/Resign/IQKeyboardManager+Resign.swift"; sourceTree = ""; }; + CA71240104373EBD4E663DD82D9B2B18 /* UMDevice-xcframeworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "UMDevice-xcframeworks.sh"; sourceTree = ""; }; + CBB1595694C12097336B6C3153E13F3E /* IQKeyboardReturnManager-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "IQKeyboardReturnManager-Info.plist"; sourceTree = ""; }; + CC161540B34EC7C6D41CF8A75A119A1C /* MAOverlayPathRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOverlayPathRenderer.h; path = MAMapKit.framework/Headers/MAOverlayPathRenderer.h; sourceTree = ""; }; + CDEF180000A932D3199310882C1F54E3 /* IQKeyboardManagerSwift-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "IQKeyboardManagerSwift-Info.plist"; sourceTree = ""; }; + CF9B73BD5A7EF49C515CE054315DBC4E /* Pods-suixinkanTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-suixinkanTests.debug.xcconfig"; sourceTree = ""; }; + D185250C703386A32752BE9C8D31BB1F /* ResourceBundle-IQKeyboardNotification-IQKeyboardNotification-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-IQKeyboardNotification-IQKeyboardNotification-Info.plist"; sourceTree = ""; }; + D18EA77619DCFFEFD7E07DC6733B93F2 /* MAPinAnnotationView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAPinAnnotationView.h; path = MAMapKit.framework/Headers/MAPinAnnotationView.h; sourceTree = ""; }; + D19D9A587ED9DDB9F0DA8FDAFBC59A5F /* MAParticleOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAParticleOverlay.h; path = MAMapKit.framework/Headers/MAParticleOverlay.h; sourceTree = ""; }; + D1E6D5C9FABB1E0A28AA90DA813EC7A1 /* IQTextView-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "IQTextView-Info.plist"; sourceTree = ""; }; + D27223F0D62482873E0DD988417E334F /* IQTextInputViewNotification-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "IQTextInputViewNotification-dummy.m"; sourceTree = ""; }; + D3C10F06C1B3364A705DEDC7CE316FFA /* IQKeyboardCore.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQKeyboardCore.release.xcconfig; sourceTree = ""; }; + D3E7C16202290A27051D211A4DB7CF5C /* IQKeyboardToolbarManager-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "IQKeyboardToolbarManager-Info.plist"; sourceTree = ""; }; + D697DA8AA4A63580A1F699C896FBFF90 /* MATileOverlayRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MATileOverlayRenderer.h; path = MAMapKit.framework/Headers/MATileOverlayRenderer.h; sourceTree = ""; }; + D90BD86E814201A071022B5983022145 /* MAPathShowRange.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAPathShowRange.h; path = MAMapKit.framework/Headers/MAPathShowRange.h; sourceTree = ""; }; + DA3EC65D3A663DDC63A7683BECC5C515 /* MAOfflineMap.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOfflineMap.h; path = MAMapKit.framework/Headers/MAOfflineMap.h; sourceTree = ""; }; + DA90B2D41D40AD20F8B741334824D9B2 /* MAPointAnnotation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAPointAnnotation.h; path = MAMapKit.framework/Headers/MAPointAnnotation.h; sourceTree = ""; }; + DAD6BC8BBA2DD3CF9E1D82EA8F20A6E0 /* MAMultiPointOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMultiPointOverlay.h; path = MAMapKit.framework/Headers/MAMultiPointOverlay.h; sourceTree = ""; }; + DB242392E0DA91FC494C540963C98671 /* IQKeyboardReturnManager.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = IQKeyboardReturnManager.modulemap; sourceTree = ""; }; + DBAE89D8B5BD6A232B2C07F2A94C0743 /* AMapLocation-NO-IDFA.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "AMapLocation-NO-IDFA.release.xcconfig"; sourceTree = ""; }; + E0138A528AE020D49E92C528899B69E6 /* IQTextView+Placeholderable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQTextView+Placeholderable.swift"; path = "IQTextView/Classes/IQTextView+Placeholderable.swift"; sourceTree = ""; }; + E09F3281D881E3CAD00E9C49C03818A7 /* IQKeyboardNotification-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "IQKeyboardNotification-Info.plist"; sourceTree = ""; }; + E0DCBA54D7EC5F8042CD6BBDD0919E88 /* MAPolylineRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAPolylineRenderer.h; path = MAMapKit.framework/Headers/MAPolylineRenderer.h; sourceTree = ""; }; + E255579824F1D21C00ED5B029E99BDA6 /* IQKeyboardResignHandler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQKeyboardResignHandler.swift; path = IQKeyboardManagerSwift/Resign/IQKeyboardResignHandler.swift; sourceTree = ""; }; + E29E0B8D2C7E2C5C20F9676EB54B2910 /* UMCommon.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = UMCommon.release.xcconfig; sourceTree = ""; }; + E2DFAB27A0DAF494EABA388687CED00A /* IQKeyboardToolbarConstants.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQKeyboardToolbarConstants.swift; path = IQKeyboardToolbarManager/Classes/Constants/IQKeyboardToolbarConstants.swift; sourceTree = ""; }; + E384C5E2E248308B68F0698C93BF3479 /* MAHeatMapVectorGridOverlayRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAHeatMapVectorGridOverlayRenderer.h; path = MAMapKit.framework/Headers/MAHeatMapVectorGridOverlayRenderer.h; sourceTree = ""; }; + E609D1C2E46F6003B156E9308AED0D51 /* IQKeyboardReturnManager-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "IQKeyboardReturnManager-dummy.m"; sourceTree = ""; }; + E6331A013B3E21E1E47C71660B6B2455 /* IQTextInputViewNotification.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQTextInputViewNotification.release.xcconfig; sourceTree = ""; }; + E64DBC5CEA39AA68354EC352BA6AB5F9 /* AMapSearchKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = AMapSearchKit.framework; sourceTree = ""; }; + E7606BACFB790485C35F7EC8C0871429 /* IQKeyboardResignHandler+Internal.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardResignHandler+Internal.swift"; path = "IQKeyboardManagerSwift/Resign/IQKeyboardResignHandler+Internal.swift"; sourceTree = ""; }; + EA8B836507554B0D599FC7F894696827 /* IQTextView.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = IQTextView.modulemap; sourceTree = ""; }; + EB59B9412536BB983F181D5769060818 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = IQKeyboardToolbar/Assets/PrivacyInfo.xcprivacy; sourceTree = ""; }; + EB7088E189876059E84BE697CCBE78A5 /* MAMapSnapshot.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMapSnapshot.h; path = MAMapKit.framework/Headers/MAMapSnapshot.h; sourceTree = ""; }; + EB9605D36291EF1F46BB4C697286ABCC /* IQKeyboardToolbarManager.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQKeyboardToolbarManager.debug.xcconfig; sourceTree = ""; }; + EC777C76ECE76385E98A1CCC670685AB /* AMapFoundationKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapFoundationKit.h; path = AMapFoundationKit.framework/Headers/AMapFoundationKit.h; sourceTree = ""; }; + ED068A300BD99E2CC64E31CDA62372F3 /* ResourceBundle-IQKeyboardToolbarManager-IQKeyboardToolbarManager-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-IQKeyboardToolbarManager-IQKeyboardToolbarManager-Info.plist"; sourceTree = ""; }; + ED47720D629B7CC0D7D00CF5C5E40FF0 /* UIView+IQKeyboardExtension.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIView+IQKeyboardExtension.swift"; path = "IQKeyboardToolbar/Classes/IQKeyboardExtension/UIView+IQKeyboardExtension.swift"; sourceTree = ""; }; + ED75EE1B72B6641B9064BDE79EECC082 /* MAMapKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = MAMapKit.framework; sourceTree = ""; }; + EE1151DDC70248708780391CF5A27282 /* MAUserLocation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAUserLocation.h; path = MAMapKit.framework/Headers/MAUserLocation.h; sourceTree = ""; }; + EFF97AF8ED94B2E1B53EC25523191C20 /* IQTextView-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "IQTextView-dummy.m"; sourceTree = ""; }; + F1727CB2CB0DE18B0DCD9AA41866666D /* Pods-suixinkan-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-suixinkan-resources.sh"; sourceTree = ""; }; + F1B35C123F478E358FFB01C3A7721D04 /* UIView+IQKeyboardManagerExtensionObjc.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIView+IQKeyboardManagerExtensionObjc.swift"; path = "IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIView+IQKeyboardManagerExtensionObjc.swift"; sourceTree = ""; }; + F1B8186A80AC5E0814DA1D966D3E40BF /* IQActiveConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQActiveConfiguration.swift; path = IQKeyboardManagerSwift/IQKeyboardManager/Configuration/IQActiveConfiguration.swift; sourceTree = ""; }; + F1C00D4B39CCE8A35974447C781B450C /* IQTextView-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "IQTextView-prefix.pch"; sourceTree = ""; }; + F441F8B8B18B288CC0A7425FDC5F01A1 /* IQKeyboardToolbarConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQKeyboardToolbarConfiguration.swift; path = IQKeyboardToolbarManager/Classes/Configuration/IQKeyboardToolbarConfiguration.swift; sourceTree = ""; }; + F5CB0122721645A37F7515DE155208E5 /* IQKeyboardManagerSwift-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "IQKeyboardManagerSwift-prefix.pch"; sourceTree = ""; }; + F5CC8BDBC24E508A9EAFA3BD070E373D /* IQKeyboardToolbarManager+Internal.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardToolbarManager+Internal.swift"; path = "IQKeyboardToolbarManager/Classes/IQKeyboardToolbarManager+Internal.swift"; sourceTree = ""; }; + F6C66EC86A13B5E3E1204C3E3555FC55 /* AMapURLSearchType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapURLSearchType.h; path = AMapFoundationKit.framework/Headers/AMapURLSearchType.h; sourceTree = ""; }; + F7CAA68BF129EF117F6CF2A2EC4CBA76 /* AMapLocationManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapLocationManager.h; path = AMapLocationKit.framework/Headers/AMapLocationManager.h; sourceTree = ""; }; + F956E149F5B195BB7833F97FC6211AE8 /* IQTextInputViewNotification-IQTextInputViewNotification */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "IQTextInputViewNotification-IQTextInputViewNotification"; path = IQTextInputViewNotification.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; + F96D42DD35177EFC564FD68BA29A081C /* MAOfflineItem.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOfflineItem.h; path = MAMapKit.framework/Headers/MAOfflineItem.h; sourceTree = ""; }; + FA727BF5D9541C98C22C9ECC911576E2 /* IQKeyboardToolbarManager */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = IQKeyboardToolbarManager; path = IQKeyboardToolbarManager.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + FB67DEAA461320EAF30858AB02394A00 /* AMapLocation-NO-IDFA.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "AMapLocation-NO-IDFA.debug.xcconfig"; sourceTree = ""; }; + FB7F6E3397C4BCFEFDBC1AFAF7AD8F64 /* IQKeyboardExtended.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQKeyboardExtended.swift; path = IQKeyboardCore/Classes/IQKeyboardExtended.swift; sourceTree = ""; }; + FBCCE2BB919F40B9EBCD3FF8F5880D9D /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = IQKeyboardNotification/Assets/PrivacyInfo.xcprivacy; sourceTree = ""; }; + FC5FB2E0AE80905F8CE6DFECD6E0A108 /* WechatOpenSDK-XCFramework-xcframeworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "WechatOpenSDK-XCFramework-xcframeworks.sh"; sourceTree = ""; }; + FC7F0CF2EA5DF59C59D9995890DA5C47 /* IQKeyboardCore */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = IQKeyboardCore; path = IQKeyboardCore.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + FD8D404506B5F9F1593854C67CCD5315 /* MAOfflineProvince.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOfflineProvince.h; path = MAMapKit.framework/Headers/MAOfflineProvince.h; sourceTree = ""; }; + FDC9179DED145C15A3CB7F52DE957964 /* AMapLocationKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapLocationKit.h; path = AMapLocationKit.framework/Headers/AMapLocationKit.h; sourceTree = ""; }; + FE5C672CF96BECD4AEF2D01E86D7A5BC /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = IQKeyboardManagerSwift/PrivacyInfo.xcprivacy; sourceTree = ""; }; + FE7F3BF0EF4A00B5605238D67869933C /* IQKeyboardCore.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = IQKeyboardCore.modulemap; sourceTree = ""; }; + FEB025BC24D3D782961E682E32501DBC /* AMapSearch-NO-IDFA.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "AMapSearch-NO-IDFA.release.xcconfig"; sourceTree = ""; }; + FED7E40B8371E0302367A1C49C8E619E /* IQTextView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQTextView.swift; path = IQTextView/Classes/IQTextView.swift; sourceTree = ""; }; + FEF9AC89E9C4BD37AC0AB78B535D1CFC /* IQKeyboardNotification */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = IQKeyboardNotification; path = IQKeyboardNotification.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 8BD4903F809FAA786A7E5E69F62F63A5 /* Frameworks */ = { + 07115845B01AD888DDF1244A60D3A323 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + DFB7A2D3A180F3D0F22CC7FFF9FD5436 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 0EA478E8AC9EAC80FC161EA42B1F04F0 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 12ED6423A2314290914AA821F798D467 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 140AE9DAFF20F8CF75AF4889E8910941 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + DA59A956BADB58A8F56351BEF801A4A7 /* Foundation.framework in Frameworks */, + FEC86D7371EEAC597840AD4C80D95F6D /* UIKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 2CF735AA78D038135F98198CADF6AD48 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 189A6E9D301AAF25AE03E5696A0539D7 /* Foundation.framework in Frameworks */, + 065F8A3FABA2CA581B78AC88FCC1DF04 /* UIKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 2F79635F5C7B42BA46F46BE3484AB18C /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 560496BF063B615D209DF99AF1664550 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + F6EBBAAB0ACF8232BF1F1E249998ED97 /* Foundation.framework in Frameworks */, + 688879C0DA9CFC4701AB33689DFAA299 /* UIKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 60DE610A8A18555DA5115D0E361E6099 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 804587AB28EEEF0BEA2A61F7793D6397 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 61BDE8E1D8CFD674C6CCD41C70CB981D /* Combine.framework in Frameworks */, + 5E310DC66AA22AA31602DAD6B8A7C787 /* Foundation.framework in Frameworks */, + 2188FDE07E4F76E9F50623C7DEC91B90 /* UIKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 9DC2AACE799ED8E921CF9B390F2EB6E5 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A19AA0BC524C3B2FBEF2E496A062D9E6 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 100A572B2597C5AD09168107D45F9929 /* Combine.framework in Frameworks */, + BA411DCFF67E3F2117FB300E4D728936 /* Foundation.framework in Frameworks */, + 879D2E821C85A4C9A91327C8823707C3 /* UIKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A95A8379EABE849DDA48D1551FC97E26 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 9F2B162734E484C90062F141ED4BB39C /* Foundation.framework in Frameworks */, + 0C9FB8BAE5BAD8ED89791BD43900B800 /* UIKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B855C4F681B3FC1558DD24942FD56363 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + A11F813E8520CCD02F84535FEF70C004 /* Combine.framework in Frameworks */, + A3DE47F84D7FE267487C39CBC071916D /* Foundation.framework in Frameworks */, + 5C2FE44A1373EE5446FB2094E0CCE0E9 /* UIKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + BDB7DB0EADADCCFDB4ED5ABDE9E25C63 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + D07B79E83A18E3018EFA8CE654EF97CB /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 3E715D5BADDEACEEF30D6A4CA82CDA9B /* Foundation.framework in Frameworks */, + D6EFA9EAA562143F338EB164836B7837 /* UIKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + D4DB6A9A63E531CD85F5BFFB32C568F8 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + D5799B6FAE6FF6E60C3D5EA3E382E384 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 9EDCFA51CF55ABD87CD178D9700B89C7 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -373,434 +969,848 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 053E8796D73C515403774DEA87827B53 /* Frameworks */ = { + 03C5C200A0787E300053CFA8F53CA094 /* Frameworks */ = { isa = PBXGroup; children = ( - EB4D968F4833DBC93E946E6496A71A4C /* UMCommon.xcframework */, + 7693C00AD1B9CA6AD0EFB3FCC3C6CAEC /* iOS */, ); name = Frameworks; sourceTree = ""; }; - 0EB9DC8EDC65D038B7A52C7C29794547 /* AMapLocation-NO-IDFA */ = { + 06FC11260001589A2237273CF11C079C /* Pods-suixinkanTests */ = { isa = PBXGroup; children = ( - 657980EFF8962794190BFF647D3FEF24 /* AMapGeoFenceError.h */, - F68AE8892469CEEAB0C81AB0EF8E8A00 /* AMapGeoFenceManager.h */, - 632CBA3F863D4B4C036343CBE79395A0 /* AMapGeoFenceRegionObj.h */, - 12C40249116DE0574E7DC16E3A5C4D06 /* AMapLocationCommonObj.h */, - 3A16DCDE527DE0F46DBB2B7A4A10C9FF /* AMapLocationKit.h */, - 5BDBFE9A3501719BF5A45FCF0782CDBE /* AMapLocationManager.h */, - 11E7551362FA5BAEED7A7CF2E5A5998B /* AMapLocationRegionObj.h */, - C8FDFE01BACEE8807D4E8E5EBB3104AF /* AMapLocationVersion.h */, - AE2DE37A81CF7653F81DB5D38581B5D1 /* Frameworks */, - 3C5798CC5D19A96879E36CB2577FC15D /* Support Files */, + 5A5D1BE1351215B2227904B08017BC18 /* Pods-suixinkanTests.modulemap */, + 01003F931713782781BF6BB014711F27 /* Pods-suixinkanTests-acknowledgements.markdown */, + 3173CBEC8CF7AA8EA006088941718CD5 /* Pods-suixinkanTests-acknowledgements.plist */, + 37B17973B8B0E935D23A94470AB95C07 /* Pods-suixinkanTests-dummy.m */, + C0311C83C8A4F175A21D8A662EF13B87 /* Pods-suixinkanTests-Info.plist */, + 8DB9F697E059AD84BBE6DB6241D65A19 /* Pods-suixinkanTests-umbrella.h */, + CF9B73BD5A7EF49C515CE054315DBC4E /* Pods-suixinkanTests.debug.xcconfig */, + 38B439905141423BD2DADBBD5EFC72DE /* Pods-suixinkanTests.release.xcconfig */, ); - name = "AMapLocation-NO-IDFA"; - path = "AMapLocation-NO-IDFA"; + name = "Pods-suixinkanTests"; + path = "Target Support Files/Pods-suixinkanTests"; sourceTree = ""; }; - 11095F35AEC13106E58B88986E038FA8 /* Support Files */ = { + 07624B2F2F5B5892E706778E57EBEDC6 /* Support Files */ = { isa = PBXGroup; children = ( - 72424614C718027B387FB239F679271E /* WechatOpenSDK-XCFramework-xcframeworks.sh */, - 93364FC6486AA57E263ACEAB802CA297 /* WechatOpenSDK-XCFramework.debug.xcconfig */, - 505E9C4F754A74BBF0BF433A1ABAB2D3 /* WechatOpenSDK-XCFramework.release.xcconfig */, + EA8B836507554B0D599FC7F894696827 /* IQTextView.modulemap */, + EFF97AF8ED94B2E1B53EC25523191C20 /* IQTextView-dummy.m */, + D1E6D5C9FABB1E0A28AA90DA813EC7A1 /* IQTextView-Info.plist */, + F1C00D4B39CCE8A35974447C781B450C /* IQTextView-prefix.pch */, + 48055AC80B1D94B7F9E2BF87BB984279 /* IQTextView-umbrella.h */, + 45AED264113ACD57ECAF26F0F85FFB62 /* IQTextView.debug.xcconfig */, + 56EBDABD8EC0E4FF033038CB98DC0DD8 /* IQTextView.release.xcconfig */, + C600E8679B2451D5B39BD50AC539E630 /* ResourceBundle-IQTextView-IQTextView-Info.plist */, ); name = "Support Files"; - path = "../Target Support Files/WechatOpenSDK-XCFramework"; + path = "../Target Support Files/IQTextView"; sourceTree = ""; }; - 172D1E47595F1B6E3E0082400A5D8802 /* UMAPM */ = { + 0B3CB9C0C7C3CE2E826C98D43D838A89 /* Frameworks */ = { isa = PBXGroup; children = ( - 5D575D3B0023734E1E033B0FABF2A0AC /* Frameworks */, - DFDAD4C6E0E87D50276AF58AF0CC7A7B /* Support Files */, - ); - name = UMAPM; - path = UMAPM; - sourceTree = ""; - }; - 2490E4390BCF4C97C395FCA7A4170CFF /* Support Files */ = { - isa = PBXGroup; - children = ( - 9A4789EE651F9A3985C6652F8EF58F6B /* UMCommon-xcframeworks.sh */, - A36042A49C0F8540D18B799FFE9BAF4F /* UMCommon.debug.xcconfig */, - B1DCEAC5E67DFFADA00E8D6182638950 /* UMCommon.release.xcconfig */, - ); - name = "Support Files"; - path = "../Target Support Files/UMCommon"; - sourceTree = ""; - }; - 361D40936B8C5C5A2B21F0585E7861FC /* Frameworks */ = { - isa = PBXGroup; - children = ( - 514765B300FD9BCBE77BA16182363311 /* AMapFoundationKit.framework */, + 8999012F56CA3CCE7F5291E17D8E5ADF /* UMDevice.xcframework */, ); name = Frameworks; sourceTree = ""; }; - 3C5798CC5D19A96879E36CB2577FC15D /* Support Files */ = { + 0BFE7209F3EAF9B60F8C75874974D749 /* AMapSearch-NO-IDFA */ = { isa = PBXGroup; children = ( - B97A4D37BDFE1DD115297273C4F4AAA7 /* AMapLocation-NO-IDFA.debug.xcconfig */, - FA44E234FE67D2FC43874714AB8D64CE /* AMapLocation-NO-IDFA.release.xcconfig */, - ); - name = "Support Files"; - path = "../Target Support Files/AMapLocation-NO-IDFA"; - sourceTree = ""; - }; - 3DD794182C921E59A62953E67C6E7BAD /* Frameworks */ = { - isa = PBXGroup; - children = ( - EC84D11EB46B7B391B31CD492CD597E3 /* MAMapKit.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 3E3C4F70A9DBD6C79C11F6EF6188D65C /* Frameworks */ = { - isa = PBXGroup; - children = ( - 64C0BEE472E88B93EB7D366E5B2597E4 /* UMDevice.xcframework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 5AD6A3E6076595DC159E4BBD5C7D733C /* Support Files */ = { - isa = PBXGroup; - children = ( - 8A2882BF8F5DC25616C1ED02D8BADE8B /* AMapSearch-NO-IDFA.debug.xcconfig */, - 3D27E75D0D982BBB14DF16A6604AF8CD /* AMapSearch-NO-IDFA.release.xcconfig */, - ); - name = "Support Files"; - path = "../Target Support Files/AMapSearch-NO-IDFA"; - sourceTree = ""; - }; - 5D575D3B0023734E1E033B0FABF2A0AC /* Frameworks */ = { - isa = PBXGroup; - children = ( - 2B483D35C6A5C6886C8305F8655E02EB /* UMAPM.xcframework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 5F5330AD7D2861B5B163FE8656FB11B0 /* UMDevice */ = { - isa = PBXGroup; - children = ( - 3E3C4F70A9DBD6C79C11F6EF6188D65C /* Frameworks */, - BE72718C7BD5CACDC996D04779E9ABD5 /* Support Files */, - ); - name = UMDevice; - path = UMDevice; - sourceTree = ""; - }; - 6325EA2815A018AA2EC65A94FA84F1F5 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 267A3DEBF9AF353E463F539354095601 /* AMapSearchKit.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 701DD2AA6C7160AE06B46DD62ABCC15F /* Resources */ = { - isa = PBXGroup; - children = ( - 21F64182FA5AB6FB454C619FF610CB14 /* AMap.bundle */, - ); - name = Resources; - sourceTree = ""; - }; - 722A96E82AADDB8FB7925DD99D0A68DE /* AMapFoundation-NO-IDFA */ = { - isa = PBXGroup; - children = ( - 2695372829B2B3DE46736249F9327CB3 /* AMapFoundationConst.h */, - 764EBFD12BB5DBE470C3B3EE75778E69 /* AMapFoundationKit.h */, - 8E8D9B985354179A70BB4148A96CB106 /* AMapFoundationVersion.h */, - E6D4DE3793D4AB549D9078053FA2DE6D /* AMapServices.h */, - 64240DCE9E380E0318667593766AB4D8 /* AMapURLSearch.h */, - 308336B8D46677C30433D2DCCD115731 /* AMapURLSearchConfig.h */, - F9EEA82DDCF0523711748E2553B7E441 /* AMapURLSearchType.h */, - 58447B69191400A703B8F1AA0E907906 /* AMapUtility.h */, - 361D40936B8C5C5A2B21F0585E7861FC /* Frameworks */, - A5AD942536C37F3EF1CD33B6D5F144D2 /* Support Files */, - ); - name = "AMapFoundation-NO-IDFA"; - path = "AMapFoundation-NO-IDFA"; - sourceTree = ""; - }; - 73BCF1C0312B0B71003D7FAD6EABE384 /* UMCommon */ = { - isa = PBXGroup; - children = ( - 053E8796D73C515403774DEA87827B53 /* Frameworks */, - 2490E4390BCF4C97C395FCA7A4170CFF /* Support Files */, - ); - name = UMCommon; - path = UMCommon; - sourceTree = ""; - }; - 73F803CD52D81A3DCE3CA16B75828CF8 /* Pods */ = { - isa = PBXGroup; - children = ( - D33759C7A54882359A0F550EB233BDEE /* AMap3DMap-NO-IDFA */, - 722A96E82AADDB8FB7925DD99D0A68DE /* AMapFoundation-NO-IDFA */, - 0EB9DC8EDC65D038B7A52C7C29794547 /* AMapLocation-NO-IDFA */, - 911D4B15F2F8C3819D9DAD4F207148C2 /* AMapSearch-NO-IDFA */, - 172D1E47595F1B6E3E0082400A5D8802 /* UMAPM */, - 73BCF1C0312B0B71003D7FAD6EABE384 /* UMCommon */, - 5F5330AD7D2861B5B163FE8656FB11B0 /* UMDevice */, - 91BC9F43AB22703B4944A1985F883E63 /* WechatOpenSDK-XCFramework */, - ); - name = Pods; - sourceTree = ""; - }; - 911D4B15F2F8C3819D9DAD4F207148C2 /* AMapSearch-NO-IDFA */ = { - isa = PBXGroup; - children = ( - 7D7597DC9C40CDD0257013247AFBE4C8 /* AMapCommonObj.h */, - 03ECB029C3BA6719F3CE27704FE9866A /* AMapNearbySearchManager.h */, - BDBD995EABD877C6CF3EF8835C04E411 /* AMapNearbyUploadInfo.h */, - 7A9B9169FDEDF62E64E2DE22F85610ED /* AMapSearchAPI.h */, - B1D9E9672286630FEF14BE4CCD760A93 /* AMapSearchError.h */, - 49D1A8B85287979271F3D66B8968FAAD /* AMapSearchKit.h */, - F399B851B018264B878AB2159250B7E9 /* AMapSearchObj.h */, - C80B7ABEF97D9D358AEC382367B8FEFE /* AMapSearchObjV1.h */, - 21F8229FFC8693946D569FF6D8C1FA3F /* AMapSearchVersion.h */, - 6325EA2815A018AA2EC65A94FA84F1F5 /* Frameworks */, - 5AD6A3E6076595DC159E4BBD5C7D733C /* Support Files */, + 6B80A312E4595DC570848E3CCAB974AE /* AMapCommonObj.h */, + 06C25F9B95293799D367CBD0E0B95E77 /* AMapNearbySearchManager.h */, + 7CD5F62CF1C96772886D9C93F472561F /* AMapNearbyUploadInfo.h */, + 485F955AC67F8718BC7E213433D68CAF /* AMapSearchAPI.h */, + 66E6C52C14F00CC472AAF5FF2586C0A6 /* AMapSearchError.h */, + 4704657980AE2A1E10A33E609D6B926B /* AMapSearchKit.h */, + 7A7B464DF9B57DFAF21817F1BAA83F12 /* AMapSearchObj.h */, + 96C3F195B902C9DB4501E896E1169EE5 /* AMapSearchObjV1.h */, + 2D50A287B9D0AAB2B6E9854E198DF5DD /* AMapSearchVersion.h */, + 1135A0002069274A095AA05296E25694 /* Frameworks */, + B3967D96E5272628782C2813BE991FE0 /* Support Files */, ); name = "AMapSearch-NO-IDFA"; path = "AMapSearch-NO-IDFA"; sourceTree = ""; }; - 91BC9F43AB22703B4944A1985F883E63 /* WechatOpenSDK-XCFramework */ = { + 1135A0002069274A095AA05296E25694 /* Frameworks */ = { isa = PBXGroup; children = ( - E9F17ABFD66E8A4813CAB917573983D8 /* Frameworks */, - 11095F35AEC13106E58B88986E038FA8 /* Support Files */, + E64DBC5CEA39AA68354EC352BA6AB5F9 /* AMapSearchKit.framework */, ); - name = "WechatOpenSDK-XCFramework"; - path = "WechatOpenSDK-XCFramework"; + name = Frameworks; sourceTree = ""; }; - A5AD942536C37F3EF1CD33B6D5F144D2 /* Support Files */ = { + 1374818EDCEB3B6EF81CCA1529926531 /* Resources */ = { isa = PBXGroup; children = ( - DED06228F2ED3100A01944BF056F3316 /* AMapFoundation-NO-IDFA.debug.xcconfig */, - CCEB62137B691B96014FCE7C2963DE89 /* AMapFoundation-NO-IDFA.release.xcconfig */, + 65502F5FF9DEEAC1D8D36A27E85FEE02 /* PrivacyInfo.xcprivacy */, + ); + name = Resources; + sourceTree = ""; + }; + 15C9DEA46ED88D0C9C79C3453751C4F7 /* AMapFoundation-NO-IDFA */ = { + isa = PBXGroup; + children = ( + 59C621AA9DE12990B43EFD34DF01B08B /* AMapFoundationConst.h */, + EC777C76ECE76385E98A1CCC670685AB /* AMapFoundationKit.h */, + 8D62245CAF96E6999E0AD7443CEBB060 /* AMapFoundationVersion.h */, + 39FA574A226D652C33CB6D48276F7B58 /* AMapServices.h */, + A76B5B2E4501EFABE820F1FA0A53B190 /* AMapURLSearch.h */, + BAD6A1CE728B2A4A22777ECC2C5F4BFC /* AMapURLSearchConfig.h */, + F6C66EC86A13B5E3E1204C3E3555FC55 /* AMapURLSearchType.h */, + 8211233F52EF3340C23AE2618ECA5236 /* AMapUtility.h */, + 2AB31E9B2DA57D1712F2E19F92A18B5C /* Frameworks */, + 7A39C8E16C031C8A18F0149F58B9E3D9 /* Support Files */, + ); + name = "AMapFoundation-NO-IDFA"; + path = "AMapFoundation-NO-IDFA"; + sourceTree = ""; + }; + 187D91BAF1C64DE4E9E3EDDC2A695D53 /* UMCommon */ = { + isa = PBXGroup; + children = ( + C7B977B4D90F762C1ECB177B8C893DBB /* Frameworks */, + 27251B61AD3E7A3323BF8506D020ECB3 /* Support Files */, + ); + name = UMCommon; + path = UMCommon; + sourceTree = ""; + }; + 1B106AE95FE8CE35C0975480BF8738FA /* IQKeyboardCore */ = { + isa = PBXGroup; + children = ( + 85D9B67B548F1C9544DCB01D4EB6FE1D /* IQKeyboardConstants.swift */, + FB7F6E3397C4BCFEFDBC1AFAF7AD8F64 /* IQKeyboardExtended.swift */, + 5D7F4C8DBE08B54A8D13ABD8BDF9D13A /* IQTextInputView.swift */, + BE8F0BF8A36B8140B1C8B56EB114A086 /* UIView+Hierarchy.swift */, + 24BA18E90A5D14668AB03EE3A0A76688 /* Resources */, + 296AA90EFA45EA63C90DD79193442454 /* Support Files */, + ); + name = IQKeyboardCore; + path = IQKeyboardCore; + sourceTree = ""; + }; + 1B3B26A6443992155C8F1DF7465ED6E8 /* IQKeyboardToolbarManager */ = { + isa = PBXGroup; + children = ( + B8B228B45C2AF15F26A0708FF1F4C049 /* Array+Sort.swift */, + 51C2DC792A6DF0C698B5CA877445AD73 /* IQDeepResponderContainerView.swift */, + F441F8B8B18B288CC0A7425FDC5F01A1 /* IQKeyboardToolbarConfiguration.swift */, + E2DFAB27A0DAF494EABA388687CED00A /* IQKeyboardToolbarConstants.swift */, + 05DAA96D10BBDD4CD0563EF76883B8CA /* IQKeyboardToolbarManager.swift */, + 344274B89E7EEEF54409242ACD059475 /* IQKeyboardToolbarManager+Action.swift */, + 2CE3D2D5C77B484A469AB0BF920206EF /* IQKeyboardToolbarManager+Debug.swift */, + BC889F43B2C6A6F8CAF9AE34A437535A /* IQKeyboardToolbarManager+Deprecated.swift */, + F5CC8BDBC24E508A9EAFA3BD070E373D /* IQKeyboardToolbarManager+Internal.swift */, + A8A2FAE36062DB36A7A86FD2D8816B14 /* IQKeyboardToolbarManager+Toolbar.swift */, + 80ADE748531456ABDDE44B5173787FA4 /* UIView+Responders.swift */, + 538CBFD998EF3722E7689C6296456C1C /* UIView+RespondersObjc.swift */, + 69E7801BE42B5900A04367157047E6CD /* Resources */, + 5F37593A0EA7542E3D9BF2B9D6074AC7 /* Support Files */, + ); + name = IQKeyboardToolbarManager; + path = IQKeyboardToolbarManager; + sourceTree = ""; + }; + 1C759227F2288F3D43451160B1D140F4 /* Core */ = { + isa = PBXGroup; + children = ( + 63070DE77E76B5B254CA451C68509EF5 /* IQBarButtonItem.swift */, + 9B64ACDF6D4EC7B93904691EB45C5C93 /* IQBarButtonItemConfiguration.swift */, + 586ADA6A1632DBA2224552BFBA22581D /* IQInvocation.swift */, + 68F50E3C54264FA6F8FEC4D7C86F2A8E /* IQKeyboardToolbar.swift */, + 8B7EC073F09A1F9D54780D9C77AF25BF /* IQKeyboardToolbarPlaceholderConfiguration.swift */, + BECE7DDCA61A0E3D33D4AD9803F445BE /* IQTitleBarButtonItem.swift */, + ED47720D629B7CC0D7D00CF5C5E40FF0 /* UIView+IQKeyboardExtension.swift */, + 1C0982FA7F37AF2EF650B5353744211C /* UIView+IQKeyboardExtensionDeprecated.swift */, + 0B35E9590B445883D21697E01ACFFF1E /* UIView+IQKeyboardExtensionObjc.swift */, + ); + name = Core; + sourceTree = ""; + }; + 214C1F1D0AF8308FF81EB532ECBBA166 /* AMapLocation-NO-IDFA */ = { + isa = PBXGroup; + children = ( + 6E0C9CBED8099166C28C4A4EE5F3A4DB /* AMapGeoFenceError.h */, + 103B4566E5B3E8DEF9340A316936E77D /* AMapGeoFenceManager.h */, + 3F5B1FAC4C895D00527AEDA143FBC575 /* AMapGeoFenceRegionObj.h */, + 4B57823CC43E41F28928353470005B2C /* AMapLocationCommonObj.h */, + FDC9179DED145C15A3CB7F52DE957964 /* AMapLocationKit.h */, + F7CAA68BF129EF117F6CF2A2EC4CBA76 /* AMapLocationManager.h */, + 26446463DDBDB062FC3928B2F4BF9CBC /* AMapLocationRegionObj.h */, + 19C8D9FF70E4E67A9CC761929E9C65E8 /* AMapLocationVersion.h */, + 8BB7FD94F4873B9A466F312FFC5508D1 /* Frameworks */, + 52DF7594DF946A074655DBFFA086F603 /* Support Files */, + ); + name = "AMapLocation-NO-IDFA"; + path = "AMapLocation-NO-IDFA"; + sourceTree = ""; + }; + 24BA18E90A5D14668AB03EE3A0A76688 /* Resources */ = { + isa = PBXGroup; + children = ( + 3916E4E5989A0F0254EAD32C392B5F5C /* PrivacyInfo.xcprivacy */, + ); + name = Resources; + sourceTree = ""; + }; + 27251B61AD3E7A3323BF8506D020ECB3 /* Support Files */ = { + isa = PBXGroup; + children = ( + 410B56C1B8326BC9C19B0DB75544B3CA /* UMCommon-xcframeworks.sh */, + BC19393AED11092453E09C8483EF87E8 /* UMCommon.debug.xcconfig */, + E29E0B8D2C7E2C5C20F9676EB54B2910 /* UMCommon.release.xcconfig */, + ); + name = "Support Files"; + path = "../Target Support Files/UMCommon"; + sourceTree = ""; + }; + 2825AB24AFE12CA673090C793AD7B866 /* UMDevice */ = { + isa = PBXGroup; + children = ( + 0B3CB9C0C7C3CE2E826C98D43D838A89 /* Frameworks */, + E5AD5B9A7945081BBCBE5777A465FB24 /* Support Files */, + ); + name = UMDevice; + path = UMDevice; + sourceTree = ""; + }; + 296AA90EFA45EA63C90DD79193442454 /* Support Files */ = { + isa = PBXGroup; + children = ( + FE7F3BF0EF4A00B5605238D67869933C /* IQKeyboardCore.modulemap */, + 12577E7D396AF4A0D52E8BF9EAB0B178 /* IQKeyboardCore-dummy.m */, + 8C20CA4CA00D852DE4609FBBC631500B /* IQKeyboardCore-Info.plist */, + 923A5EAEF9B65C7570AA35B60017E644 /* IQKeyboardCore-prefix.pch */, + B8DC3BD343769A8E67DC140B14E40AFA /* IQKeyboardCore-umbrella.h */, + 3CFBB99CC351EABA5DE1217CF1B40C3E /* IQKeyboardCore.debug.xcconfig */, + D3C10F06C1B3364A705DEDC7CE316FFA /* IQKeyboardCore.release.xcconfig */, + 944EAA15B09A4E08CA61331DE749BA33 /* ResourceBundle-IQKeyboardCore-IQKeyboardCore-Info.plist */, + ); + name = "Support Files"; + path = "../Target Support Files/IQKeyboardCore"; + sourceTree = ""; + }; + 2AB31E9B2DA57D1712F2E19F92A18B5C /* Frameworks */ = { + isa = PBXGroup; + children = ( + 4A775B0BB66007F06E41DFE74B3A9929 /* AMapFoundationKit.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 3651416894979E08C0C3728A91E659BC /* IQKeyboardReturnManager */ = { + isa = PBXGroup; + children = ( + 8972D89261103F625BBE350DC6A5E5BD /* IQKeyboardReturnManager.swift */, + BE29BCA8BFDA54E4CD9B0D3354642A00 /* IQKeyboardReturnManager+UITextFieldDelegate.swift */, + 0C330EE82C2618812608F6AE8A6E63A9 /* IQKeyboardReturnManager+UITextViewDelegate.swift */, + AF1C389FEE92688E867B717F7F760B81 /* IQTextInputViewInfoModel.swift */, + 1374818EDCEB3B6EF81CCA1529926531 /* Resources */, + AF12AE217E744DEA262698C35F4E0DC3 /* Support Files */, + ); + name = IQKeyboardReturnManager; + path = IQKeyboardReturnManager; + sourceTree = ""; + }; + 3C2B3E335C8AEB07FEB670D5AC7ECB85 /* Appearance */ = { + isa = PBXGroup; + children = ( + 861EDB4B4F61692A313FF611C8CF95AF /* IQKeyboardAppearanceConfiguration.swift */, + 6C958D24E4FE5EFD8C5B81405559A4BD /* IQKeyboardAppearanceManager.swift */, + 5279670AC68B19C16BC817052738C47C /* IQKeyboardAppearanceManager+Internal.swift */, + 2036A3FB465FF366E97BF39DEE669F09 /* IQKeyboardManager+Appearance.swift */, + BE0A38788022564F1272806A4515ED11 /* IQKeyboardManager+Appearance_Deprecated.swift */, + ); + name = Appearance; + sourceTree = ""; + }; + 42D7139D8083B7E70591E25BCBCD961B /* UMAPM */ = { + isa = PBXGroup; + children = ( + 9402875191337202416A41E2B3568D22 /* Frameworks */, + EC18E061295BDAD5E1E82BD9FE903B65 /* Support Files */, + ); + name = UMAPM; + path = UMAPM; + sourceTree = ""; + }; + 4DEB3AF830AF7A52701E4DBBAEEEEA84 /* Resources */ = { + isa = PBXGroup; + children = ( + 3A2160EF949B7A580D286F038B1A56B5 /* PrivacyInfo.xcprivacy */, + ); + name = Resources; + sourceTree = ""; + }; + 52DF7594DF946A074655DBFFA086F603 /* Support Files */ = { + isa = PBXGroup; + children = ( + FB67DEAA461320EAF30858AB02394A00 /* AMapLocation-NO-IDFA.debug.xcconfig */, + DBAE89D8B5BD6A232B2C07F2A94C0743 /* AMapLocation-NO-IDFA.release.xcconfig */, + ); + name = "Support Files"; + path = "../Target Support Files/AMapLocation-NO-IDFA"; + sourceTree = ""; + }; + 56AA605DE0B2046CB6EA7C01ADD6A9A5 /* Pods */ = { + isa = PBXGroup; + children = ( + F1DC98103FEE2E8AD766AFD9E3FF4E13 /* AMap3DMap-NO-IDFA */, + 15C9DEA46ED88D0C9C79C3453751C4F7 /* AMapFoundation-NO-IDFA */, + 214C1F1D0AF8308FF81EB532ECBBA166 /* AMapLocation-NO-IDFA */, + 0BFE7209F3EAF9B60F8C75874974D749 /* AMapSearch-NO-IDFA */, + 1B106AE95FE8CE35C0975480BF8738FA /* IQKeyboardCore */, + 593C8C63D6309CE3C930472B76DD4E71 /* IQKeyboardManagerSwift */, + 623F314AEECB1042B8F0FA8E9E6C68B1 /* IQKeyboardNotification */, + 3651416894979E08C0C3728A91E659BC /* IQKeyboardReturnManager */, + 665E10D6BFD3120F512C10CB183C1D06 /* IQKeyboardToolbar */, + 1B3B26A6443992155C8F1DF7465ED6E8 /* IQKeyboardToolbarManager */, + AD697BC3CAC82CFFDFF36ABBF72A892A /* IQTextInputViewNotification */, + 5A11BF7B8A81015D125E1816678FA96C /* IQTextView */, + 42D7139D8083B7E70591E25BCBCD961B /* UMAPM */, + 187D91BAF1C64DE4E9E3EDDC2A695D53 /* UMCommon */, + 2825AB24AFE12CA673090C793AD7B866 /* UMDevice */, + DFF48BF1E45DA469D775743D7025F76B /* WechatOpenSDK-XCFramework */, + ); + name = Pods; + sourceTree = ""; + }; + 593C8C63D6309CE3C930472B76DD4E71 /* IQKeyboardManagerSwift */ = { + isa = PBXGroup; + children = ( + 3C2B3E335C8AEB07FEB670D5AC7ECB85 /* Appearance */, + CB28A15B5F2FE35CF0B09C163C51735E /* Core */, + A78720AC6CD420805C4A2600D7324F49 /* IQKeyboardToolbarManager */, + FE39F1D628207BAE4D51BDA1F5799D8F /* Resign */, + ED2F580E29081C28DF63DF03D4B3E246 /* Resources */, + 6BDBD122A0A4B9ADDB9E408E190C05E7 /* Support Files */, + ); + name = IQKeyboardManagerSwift; + path = IQKeyboardManagerSwift; + sourceTree = ""; + }; + 5A11BF7B8A81015D125E1816678FA96C /* IQTextView */ = { + isa = PBXGroup; + children = ( + FED7E40B8371E0302367A1C49C8E619E /* IQTextView.swift */, + E0138A528AE020D49E92C528899B69E6 /* IQTextView+Placeholderable.swift */, + 8CDA752E86F78161CB7CC33FB080D6A2 /* Resources */, + 07624B2F2F5B5892E706778E57EBEDC6 /* Support Files */, + ); + name = IQTextView; + path = IQTextView; + sourceTree = ""; + }; + 5F37593A0EA7542E3D9BF2B9D6074AC7 /* Support Files */ = { + isa = PBXGroup; + children = ( + C9CD57117742F75FD0F149AF8E59EC81 /* IQKeyboardToolbarManager.modulemap */, + 7CCC40E939F7246E1F0244955BDFF328 /* IQKeyboardToolbarManager-dummy.m */, + D3E7C16202290A27051D211A4DB7CF5C /* IQKeyboardToolbarManager-Info.plist */, + 6DDD0F740279371A970E178D332D97B0 /* IQKeyboardToolbarManager-prefix.pch */, + 6B8F7D50992F93A9D502BFAD4018B610 /* IQKeyboardToolbarManager-umbrella.h */, + EB9605D36291EF1F46BB4C697286ABCC /* IQKeyboardToolbarManager.debug.xcconfig */, + 115539E22DDDBEAA2759FD2CEE701673 /* IQKeyboardToolbarManager.release.xcconfig */, + ED068A300BD99E2CC64E31CDA62372F3 /* ResourceBundle-IQKeyboardToolbarManager-IQKeyboardToolbarManager-Info.plist */, + ); + name = "Support Files"; + path = "../Target Support Files/IQKeyboardToolbarManager"; + sourceTree = ""; + }; + 623F314AEECB1042B8F0FA8E9E6C68B1 /* IQKeyboardNotification */ = { + isa = PBXGroup; + children = ( + 474B492B560C872CE952C1D51969406A /* IQKeyboardInfo.swift */, + B80D24BAD77BA27807693623CE7D270D /* IQKeyboardNotification.swift */, + 81D7F0266E176A1CFD1ECA7769E4778A /* Resources */, + 66B0F53A78D4AA2DF34B5659C29619CB /* Support Files */, + ); + name = IQKeyboardNotification; + path = IQKeyboardNotification; + sourceTree = ""; + }; + 665E10D6BFD3120F512C10CB183C1D06 /* IQKeyboardToolbar */ = { + isa = PBXGroup; + children = ( + 1C759227F2288F3D43451160B1D140F4 /* Core */, + FE07A82F771683AB423C9860244A6FE6 /* Placeholderable */, + F1320EF8DE183C5CCF2AB1FE8E9EC450 /* Resources */, + F0CD363F7C4454C2EBAA68E4DA26AB89 /* Support Files */, + ); + name = IQKeyboardToolbar; + path = IQKeyboardToolbar; + sourceTree = ""; + }; + 66B0F53A78D4AA2DF34B5659C29619CB /* Support Files */ = { + isa = PBXGroup; + children = ( + A5AF7471F25972AED742BEF49A397B39 /* IQKeyboardNotification.modulemap */, + A975906B3CFBF2DD2C0D832B624B43E5 /* IQKeyboardNotification-dummy.m */, + E09F3281D881E3CAD00E9C49C03818A7 /* IQKeyboardNotification-Info.plist */, + 4DA9CE84A9AE0E48E882398B7D78849C /* IQKeyboardNotification-prefix.pch */, + ACF0BBF875B1A829EB0CEF621C75A491 /* IQKeyboardNotification-umbrella.h */, + 30A8A01383C393C5CB8F8FC240A24C39 /* IQKeyboardNotification.debug.xcconfig */, + A4F5C6DCF130F9E43D080DCCD27C8F64 /* IQKeyboardNotification.release.xcconfig */, + D185250C703386A32752BE9C8D31BB1F /* ResourceBundle-IQKeyboardNotification-IQKeyboardNotification-Info.plist */, + ); + name = "Support Files"; + path = "../Target Support Files/IQKeyboardNotification"; + sourceTree = ""; + }; + 69E7801BE42B5900A04367157047E6CD /* Resources */ = { + isa = PBXGroup; + children = ( + 72BBF069358CCF73D8E674385813A466 /* PrivacyInfo.xcprivacy */, + ); + name = Resources; + sourceTree = ""; + }; + 6AF4AB2CD95191F647218D6A24F8669C /* Pods-suixinkan */ = { + isa = PBXGroup; + children = ( + 8DC1D17AA22E3F30BEC1992D3A9C677B /* Pods-suixinkan.modulemap */, + 21397BCD20ECAE0D5DC45E00B1022122 /* Pods-suixinkan-acknowledgements.markdown */, + 7970E185DCA1CE6D331C00CC66BFEAA3 /* Pods-suixinkan-acknowledgements.plist */, + A6A3ABC34D5CA51948F7619021EEC414 /* Pods-suixinkan-dummy.m */, + 41912F06D7E7D5A38C37B6E577D9D059 /* Pods-suixinkan-frameworks.sh */, + BBAE241099C81D8EFB2A062A04F43105 /* Pods-suixinkan-Info.plist */, + F1727CB2CB0DE18B0DCD9AA41866666D /* Pods-suixinkan-resources.sh */, + A60233C7119F0105DB6C68E30CCC216F /* Pods-suixinkan-umbrella.h */, + B3A9B2740ED243A88FDF2D9AE77E9392 /* Pods-suixinkan.debug.xcconfig */, + 081A933139371B97D5ABFD37B065516E /* Pods-suixinkan.release.xcconfig */, + ); + name = "Pods-suixinkan"; + path = "Target Support Files/Pods-suixinkan"; + sourceTree = ""; + }; + 6BDBD122A0A4B9ADDB9E408E190C05E7 /* Support Files */ = { + isa = PBXGroup; + children = ( + B67A9FDAE9AD80D36B93C60100CF3E6E /* IQKeyboardManagerSwift.modulemap */, + A67B65E64610A804D78568AFE2057CF4 /* IQKeyboardManagerSwift-dummy.m */, + CDEF180000A932D3199310882C1F54E3 /* IQKeyboardManagerSwift-Info.plist */, + F5CB0122721645A37F7515DE155208E5 /* IQKeyboardManagerSwift-prefix.pch */, + C83AC5811D580B3B54EA282688BDAA41 /* IQKeyboardManagerSwift-umbrella.h */, + 36D395D9E056DE9587ED95754452991E /* IQKeyboardManagerSwift.debug.xcconfig */, + 99252666C73C321ECC501FF47D66FA88 /* IQKeyboardManagerSwift.release.xcconfig */, + 41F03B7A2358FDDBF756EDD2638B0980 /* ResourceBundle-IQKeyboardManagerSwift-IQKeyboardManagerSwift-Info.plist */, + ); + name = "Support Files"; + path = "../Target Support Files/IQKeyboardManagerSwift"; + sourceTree = ""; + }; + 7693C00AD1B9CA6AD0EFB3FCC3C6CAEC /* iOS */ = { + isa = PBXGroup; + children = ( + 030EAF35766AF14A0C9409424A6C2B82 /* Combine.framework */, + 6464447070DB8A1E9C56338928A9DC0F /* Foundation.framework */, + 647AECC2271497CFBB36311165FC0BF0 /* UIKit.framework */, + ); + name = iOS; + sourceTree = ""; + }; + 7A39C8E16C031C8A18F0149F58B9E3D9 /* Support Files */ = { + isa = PBXGroup; + children = ( + 3E3AD3EE750AEF229F3095AB516C9100 /* AMapFoundation-NO-IDFA.debug.xcconfig */, + 9BC7FD73096F0E682B997CB07C344AC1 /* AMapFoundation-NO-IDFA.release.xcconfig */, ); name = "Support Files"; path = "../Target Support Files/AMapFoundation-NO-IDFA"; sourceTree = ""; }; - AE2DE37A81CF7653F81DB5D38581B5D1 /* Frameworks */ = { + 800B26A49CB600AD89767C4482FE6BF5 /* Frameworks */ = { isa = PBXGroup; children = ( - A6363BBD4CE33059500F06D34B7147D5 /* AMapLocationKit.framework */, + 0BC7D01167CA03F161AF5BC994C741C4 /* WechatOpenSDK.xcframework */, ); name = Frameworks; sourceTree = ""; }; - BE72718C7BD5CACDC996D04779E9ABD5 /* Support Files */ = { + 80E3DF42C81B4A8C6BE9A0196EAA7E96 /* Support Files */ = { isa = PBXGroup; children = ( - BDED1392DCAE0A8D3D23FC81AA7DC8CA /* UMDevice-xcframeworks.sh */, - 7FA9E9DE9F0DB76774F19BF713363C1C /* UMDevice.debug.xcconfig */, - A544FE588B3DA9A5527AB2104C1E3F6E /* UMDevice.release.xcconfig */, + FC5FB2E0AE80905F8CE6DFECD6E0A108 /* WechatOpenSDK-XCFramework-xcframeworks.sh */, + 155001DC0189CD12099F5DA44FFC98CB /* WechatOpenSDK-XCFramework.debug.xcconfig */, + 130EEB4090B9AF897D37B6DE8A064E66 /* WechatOpenSDK-XCFramework.release.xcconfig */, ); name = "Support Files"; - path = "../Target Support Files/UMDevice"; + path = "../Target Support Files/WechatOpenSDK-XCFramework"; sourceTree = ""; }; - C0A54D8DDA8ED18D016C2F971E3440BD /* Products */ = { + 81D7F0266E176A1CFD1ECA7769E4778A /* Resources */ = { isa = PBXGroup; children = ( + FBCCE2BB919F40B9EBCD3FF8F5880D9D /* PrivacyInfo.xcprivacy */, + ); + name = Resources; + sourceTree = ""; + }; + 8BB7FD94F4873B9A466F312FFC5508D1 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 0C8150D39D06CA5117F674365A2D6513 /* AMapLocationKit.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 8CDA752E86F78161CB7CC33FB080D6A2 /* Resources */ = { + isa = PBXGroup; + children = ( + 9F5FA7D2322208B09B5EA5D72D7209C6 /* PrivacyInfo.xcprivacy */, + ); + name = Resources; + sourceTree = ""; + }; + 9402875191337202416A41E2B3568D22 /* Frameworks */ = { + isa = PBXGroup; + children = ( + A0D0F9FC95E46E27D7FF27F0197EA010 /* UMAPM.xcframework */, + ); + name = Frameworks; + sourceTree = ""; + }; + A44383B435488DA9FDC1DB25CBBBCBA6 /* Products */ = { + isa = PBXGroup; + children = ( + FC7F0CF2EA5DF59C59D9995890DA5C47 /* IQKeyboardCore */, + 6E897F35E5E27028AC58B14B552FBC8D /* IQKeyboardCore-IQKeyboardCore */, + A8E950A16D00F649C54FFB30F81D7842 /* IQKeyboardManagerSwift */, + 8D8069D3964814114ACEC3084C010B59 /* IQKeyboardManagerSwift-IQKeyboardManagerSwift */, + FEF9AC89E9C4BD37AC0AB78B535D1CFC /* IQKeyboardNotification */, + 120BD4C670EF00F4D5A40AA4B863A7AE /* IQKeyboardNotification-IQKeyboardNotification */, + 15848DEC7727A809830E7F6FC1B6CE0F /* IQKeyboardReturnManager */, + 110BD425B6CAD6801539E2C6AB6E0662 /* IQKeyboardReturnManager-IQKeyboardReturnManager */, + B4B1A58096F15199A14069C5D6AA1C99 /* IQKeyboardToolbar */, + A16FD016E18EACCF6B23F219F2E236FE /* IQKeyboardToolbar-IQKeyboardToolbar */, + FA727BF5D9541C98C22C9ECC911576E2 /* IQKeyboardToolbarManager */, + 80A40EDA3AF0499BDBCFF09467BB49AD /* IQKeyboardToolbarManager-IQKeyboardToolbarManager */, + 06E5B413FEA5A600D76636DA132F8FB9 /* IQTextInputViewNotification */, + F956E149F5B195BB7833F97FC6211AE8 /* IQTextInputViewNotification-IQTextInputViewNotification */, + 0DFD4541FF9DAA31A2FC2A7F6D03ED22 /* IQTextView */, + 847044E56CBBCE1235A6F3CEF3F9F607 /* IQTextView-IQTextView */, 5BD109278933E8C2F269E5DCEC3A5376 /* Pods-suixinkan */, 1B7465A72120AF417FD5F1F34AD33AD4 /* Pods-suixinkanTests */, ); name = Products; sourceTree = ""; }; - C111D316B9ED9498A7739F61CB9C3958 /* Targets Support Files */ = { + A78720AC6CD420805C4A2600D7324F49 /* IQKeyboardToolbarManager */ = { isa = PBXGroup; children = ( - C7D8EE410ED114D2A14E9F97869A8B54 /* Pods-suixinkan */, - DD51156B35FBCA6A32E3B025718A7857 /* Pods-suixinkanTests */, + 80DCD72F7A8519A9463BFC22D8AD02A4 /* IQKeyboardManager+ToolbarManager.swift */, + 18BB99887E76717DB51BAD581A6B441E /* IQKeyboardManager+ToolbarManagerDeprecated.swift */, ); - name = "Targets Support Files"; + name = IQKeyboardToolbarManager; sourceTree = ""; }; - C7D8EE410ED114D2A14E9F97869A8B54 /* Pods-suixinkan */ = { + AD697BC3CAC82CFFDFF36ABBF72A892A /* IQTextInputViewNotification */ = { isa = PBXGroup; children = ( - 8C64DEFEB1E7F2C66D9E36F704EB2EDA /* Pods-suixinkan.modulemap */, - 069E056FF5EF11FB955BE3C9637228BF /* Pods-suixinkan-acknowledgements.markdown */, - 44674EC1944BB8CC20D1FB811A28DA3F /* Pods-suixinkan-acknowledgements.plist */, - BF228B17BC7260C40143BD13BD131504 /* Pods-suixinkan-dummy.m */, - D49628F6F87CD3F4A82F10BBA92C44A3 /* Pods-suixinkan-Info.plist */, - 9EABEC92964633D02091EEB81DAC2A28 /* Pods-suixinkan-resources.sh */, - CE36A961B0F78784EC9BFE7F48C84F82 /* Pods-suixinkan-umbrella.h */, - 61B7C8006610229F8A3485704A3944CF /* Pods-suixinkan.debug.xcconfig */, - 2D9188A08F7F86FBF3EBB3CD93699D53 /* Pods-suixinkan.release.xcconfig */, + 4F9CC787EDE5D230D3BB2F2DA0ABEB99 /* IQTextInputViewInfo.swift */, + 6183432F20DA00F9E0A8AD4AB8569CFF /* IQTextInputViewNotification.swift */, + 4DEB3AF830AF7A52701E4DBBAEEEEA84 /* Resources */, + C425D0E77EEB1BC73487B9725155488A /* Support Files */, ); - name = "Pods-suixinkan"; - path = "Target Support Files/Pods-suixinkan"; + name = IQTextInputViewNotification; + path = IQTextInputViewNotification; + sourceTree = ""; + }; + AF12AE217E744DEA262698C35F4E0DC3 /* Support Files */ = { + isa = PBXGroup; + children = ( + DB242392E0DA91FC494C540963C98671 /* IQKeyboardReturnManager.modulemap */, + E609D1C2E46F6003B156E9308AED0D51 /* IQKeyboardReturnManager-dummy.m */, + CBB1595694C12097336B6C3153E13F3E /* IQKeyboardReturnManager-Info.plist */, + 30C5F8B8EB3DD6C77EEE1A267B5CEB7D /* IQKeyboardReturnManager-prefix.pch */, + B5277185841774F1173A60C70BEEAB43 /* IQKeyboardReturnManager-umbrella.h */, + 11E57560E05A7E18A4833A108BBF77A7 /* IQKeyboardReturnManager.debug.xcconfig */, + 93FDE424FD40693C3039FAD46BC403D0 /* IQKeyboardReturnManager.release.xcconfig */, + BBEF1E405BF9FA8B45933C2D48DB8041 /* ResourceBundle-IQKeyboardReturnManager-IQKeyboardReturnManager-Info.plist */, + ); + name = "Support Files"; + path = "../Target Support Files/IQKeyboardReturnManager"; + sourceTree = ""; + }; + B3967D96E5272628782C2813BE991FE0 /* Support Files */ = { + isa = PBXGroup; + children = ( + 2BB0CDECDB237E2314A53B64D3B8695F /* AMapSearch-NO-IDFA.debug.xcconfig */, + FEB025BC24D3D782961E682E32501DBC /* AMapSearch-NO-IDFA.release.xcconfig */, + ); + name = "Support Files"; + path = "../Target Support Files/AMapSearch-NO-IDFA"; + sourceTree = ""; + }; + C425D0E77EEB1BC73487B9725155488A /* Support Files */ = { + isa = PBXGroup; + children = ( + 2CFE6D95F9C535675CB301C388874D7E /* IQTextInputViewNotification.modulemap */, + D27223F0D62482873E0DD988417E334F /* IQTextInputViewNotification-dummy.m */, + 0B4AC58FF4324A3FA8F73CA4DA10DD58 /* IQTextInputViewNotification-Info.plist */, + 6AE0AF60D0E6264EA8879C056FEFF333 /* IQTextInputViewNotification-prefix.pch */, + 0F7D7AA57F77A17CD3D74D75AEBA7070 /* IQTextInputViewNotification-umbrella.h */, + 56B3624858B660D9DDBBEB280A080869 /* IQTextInputViewNotification.debug.xcconfig */, + E6331A013B3E21E1E47C71660B6B2455 /* IQTextInputViewNotification.release.xcconfig */, + 2F4C42E98F4D9427C292F65FE6F0B5C8 /* ResourceBundle-IQTextInputViewNotification-IQTextInputViewNotification-Info.plist */, + ); + name = "Support Files"; + path = "../Target Support Files/IQTextInputViewNotification"; + sourceTree = ""; + }; + C7B977B4D90F762C1ECB177B8C893DBB /* Frameworks */ = { + isa = PBXGroup; + children = ( + 3151C16FF6B76C248C269F94E4996F57 /* UMCommon.xcframework */, + ); + name = Frameworks; + sourceTree = ""; + }; + CB28A15B5F2FE35CF0B09C163C51735E /* Core */ = { + isa = PBXGroup; + children = ( + F1B8186A80AC5E0814DA1D966D3E40BF /* IQActiveConfiguration.swift */, + 4FDF616BAC83E63DB1F6D89BD0C25949 /* IQKeyboardManager.swift */, + 26AA0168FEE4652E795A487F2D628BA0 /* IQKeyboardManager+ActiveConfiguration.swift */, + C318D1B54A3D843401F9DA4933592E1B /* IQKeyboardManager+Debug.swift */, + 49E3CA5E36443AE3EFB66EE0A3530956 /* IQKeyboardManager+Deprecated.swift */, + A338431F5EE59F889439480E11F55A35 /* IQKeyboardManager+Internal.swift */, + 9E4BF580BDA53A23D79EE15962CCF36C /* IQKeyboardManager+Position.swift */, + AFA40485EE83F94DDC2D4C718DE4758D /* IQRootControllerConfiguration.swift */, + A3B88D3B9242AE15CCC3E92D2613A589 /* IQScrollViewConfiguration.swift */, + 7EC30B9EBF71A33CFE3B7A50F7A262A1 /* UICollectionView+IndexPaths.swift */, + 73E69C62CB648A1F39A51A68FCE70203 /* UIScrollView+IQKeyboardManagerExtension.swift */, + C4C53D4D2AA9A89E5F58608BDE976D61 /* UIScrollView+IQKeyboardManagerExtensionObjc.swift */, + 30C3AD78BD7F4CF62CFCE4A94DE54DED /* UITableView+IndexPaths.swift */, + C0A209F6A3ED70A0B4E017DDC44D73C2 /* UIView+IQKeyboardManagerExtension.swift */, + F1B35C123F478E358FFB01C3A7721D04 /* UIView+IQKeyboardManagerExtensionObjc.swift */, + 6D9EBCEF6F3F2A232E2FD51767D24513 /* UIView+Parent.swift */, + 5E7C51C9D03E4F23E428C0C1AFFE32A7 /* UIView+ParentObjc.swift */, + 526DA4BEC1A96C86419B2B0A724CEAAC /* UIViewController+ParentContainer.swift */, + ); + name = Core; sourceTree = ""; }; CF1408CF629C7361332E53B88F7BD30C = { isa = PBXGroup; children = ( 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */, - D210D550F4EA176C3123ED886F8F87F5 /* Frameworks */, - 73F803CD52D81A3DCE3CA16B75828CF8 /* Pods */, - C0A54D8DDA8ED18D016C2F971E3440BD /* Products */, - C111D316B9ED9498A7739F61CB9C3958 /* Targets Support Files */, + 03C5C200A0787E300053CFA8F53CA094 /* Frameworks */, + 56AA605DE0B2046CB6EA7C01ADD6A9A5 /* Pods */, + A44383B435488DA9FDC1DB25CBBBCBA6 /* Products */, + D5B2884487651951A6FC723A46071B1E /* Targets Support Files */, ); sourceTree = ""; }; - D210D550F4EA176C3123ED886F8F87F5 /* Frameworks */ = { + D5B2884487651951A6FC723A46071B1E /* Targets Support Files */ = { isa = PBXGroup; children = ( - E4801F62A6B08CD9B5410329F1A18FDE /* iOS */, + 6AF4AB2CD95191F647218D6A24F8669C /* Pods-suixinkan */, + 06FC11260001589A2237273CF11C079C /* Pods-suixinkanTests */, ); - name = Frameworks; + name = "Targets Support Files"; sourceTree = ""; }; - D33759C7A54882359A0F550EB233BDEE /* AMap3DMap-NO-IDFA */ = { + DFF48BF1E45DA469D775743D7025F76B /* WechatOpenSDK-XCFramework */ = { isa = PBXGroup; children = ( - BF4E206010A80D9F4BD8AC654088FC62 /* MAAnimatedAnnotation.h */, - 24067F4DDEF17AFA8641D4550327134F /* MAAnnotation.h */, - BC6A8AE37A44303A7921B0F1E00000F0 /* MAAnnotationMoveAnimation.h */, - 7A8928E3841166C87F9104F3C7257ED1 /* MAAnnotationView.h */, - 081BB8B4C329A89813BAFEFD92F278DC /* MAArc.h */, - 607B12309D4BBE0A374F5681BC22567B /* MAArcRenderer.h */, - FDCF5C554E9F565E7A081E7D2D4D4267 /* MABaseEngineOverlay.h */, - BB6368DD0AABE98EED2B91B0BA922B8D /* MABaseOverlay.h */, - DEBCCADE7DDBA90A395DEF6DA0DB1549 /* MACircle.h */, - 9392453F7B8C8EC1DBC411A28840D283 /* MACircleRenderer.h */, - DC5BC1CE33C0778D3DF37DD68AF6A540 /* MAConfig.h */, - DE9CCDAE04DBF0C5163DC000763E8F22 /* MACustomBuildingOverlay.h */, - A41513919123C2DB492F2915452B99FB /* MACustomBuildingOverlayRenderer.h */, - 0CB65467D9BC6FB4CA43DBDEE8046DC8 /* MACustomCalloutView.h */, - 2BC8EBA3D7E41F9EA60264E82C2C3D54 /* MAGeodesicPolyline.h */, - A187CDD3DB66CAE55829663F7709D099 /* MAGeometry.h */, - 78B6815DC0004C618630DC5100B63C80 /* MAGroundOverlay.h */, - 664E58E6DDC2966578A2C9D32D9D8FFD /* MAGroundOverlayRenderer.h */, - E326873DD4D64984A558D4FDE649FB4A /* MAHeatMapTileOverlay.h */, - C163EE9A875637E6C1F824BA08BFE21B /* MAHeatMapVectorGridOverlay.h */, - 258B890CD915D0C02409050126A34A78 /* MAHeatMapVectorGridOverlayRenderer.h */, - CCCBE033D87F7E68F7F4F8A2604DB9FC /* MAHeatMapVectorOverlay.h */, - 05F51B66A225DC56F48A197D8DE3AB8E /* MAHeatMapVectorOverlayRender.h */, - C1DFE81417556E6F808D1284CF137ADE /* MAIndoorInfo.h */, - CAA8F759C5471E04D0EDCFD5BAE3E1F3 /* MALineDrawType.h */, - A847712EFCA54C3CF9E1B8503AE196D0 /* MAMapAccessibilityIdentifier.h */, - 45AB9E4A609CD01DF5027D580BD33218 /* MAMapCustomStyleOptions.h */, - 8D804F47730C24A80564C45691D62159 /* MAMapKit.h */, - 1BABD1E2BA172FF891B45D69723A8FA6 /* MAMapSnapshot.h */, - 0E97FA02BDFE7464E96DDDA67672EAB8 /* MAMapStatus.h */, - D0E173B83918C3601469EC66C94A97BE /* MAMapVersion.h */, - 0F67BAD007D9313441603E8FD0C72BDE /* MAMapView.h */, - 3F4A6FE6F5896BC28D894A3C56F4458B /* MAMapView+Resource.h */, - A64AFA54CDE002685FDDDBFF0A375A63 /* MAMultiColoredPolylineRenderer.h */, - 47DAF61B95087ADC814BD2F6DFD04D32 /* MAMultiPoint.h */, - 68FB23F98494515B5F635B2080AC2D74 /* MAMultiPointOverlay.h */, - C45073FF76FBFD70DE8060643C834BEE /* MAMultiPointOverlayRenderer.h */, - D49F2B29B08A21CE8044825FB0F690B6 /* MAMultiPolyline.h */, - 2EC3D8175A3DC6341FD9BA09E1108BD1 /* MAMultiTexturePolylineRenderer.h */, - 9DAF861C234DEFE0565960A25179B328 /* MAMVTTileOverlay.h */, - 05E4BFEB8A5EC2DC86095F225B502975 /* MAMVTTileOverlayRenderer.h */, - B3ED06C9CF721AE092A9ACEA19083CAC /* MAOfflineCity.h */, - 511E223F968C9463398F92B7634AA4C1 /* MAOfflineItem.h */, - F64961F52A461A351D3C2CF5AA5AB687 /* MAOfflineItemCommonCity.h */, - 3F99AF4BEDBB1A46A1B2DDA808C60C8A /* MAOfflineItemMunicipality.h */, - 56845156741368511567C6ED67855FBE /* MAOfflineItemNationWide.h */, - 311EEA5B46D1D7FAAA7E30958EBFE969 /* MAOfflineMap.h */, - 75399BCB7E0D56E144717DDCD6C7FBBC /* MAOfflineMapViewController.h */, - 57EF70D81C78649244E4B0F2BD22C385 /* MAOfflineProvince.h */, - 380659BF8742AC4FF0E4359B7E02FBEC /* MAOverlay.h */, - BF6A4572B83783CEDEC1AE7ABB74B145 /* MAOverlayPathRenderer.h */, - 3F6E024A4BC8B4F7C84F62B453336C6B /* MAOverlayRenderer.h */, - 87983C1BFF90B26765DB26FA52DC8FBE /* MAParticleOverlay.h */, - 495C8FA8FA1E743C3D041B5066D249A1 /* MAParticleOverlayOptions.h */, - 38F697EA154D9687F844A0F0C832E889 /* MAParticleOverlayRenderer.h */, - A54E3FB167D0EBC2D46C20A0F3D271F1 /* MAPathShowRange.h */, - DAB1615CF37670F70B385FD315D74635 /* MAPinAnnotationView.h */, - F66C83E664848DC373508F2C5D874901 /* MAPoiFilter.h */, - D3DF0EA33F3079DDA692A775FDC514CA /* MAPointAnnotation.h */, - 0D4EF6D40137F0A4CECF2C4CC617B5BA /* MAPolygon.h */, - 1733284B424C8D089B1C8E9C6167E533 /* MAPolygonRenderer.h */, - C4B9730FA8B1A82502EDF50DAEF161F7 /* MAPolyline.h */, - E5B7CC2B4D07007A9C53EDC66CCD5799 /* MAPolylineRenderer.h */, - C7114968961138953AAE2AD902FFD2A7 /* MARouteOverlay.h */, - E715DDE336E4E382EFE238BD6C30978D /* MARouteOverlayModel.h */, - 6A16CCC3A9F4BA44294C343AAA01EC6A /* MAShape.h */, - 5D2FAE9F6CE73F35242C57FADF198A4F /* MATerrainOverlay.h */, - 5B9FB578C59C2D6A42E4137C2BF6F3F4 /* MATerrainOverlayRenderer.h */, - 746BFCBA1ABA7DC28009805E10F58829 /* MATileOverlay.h */, - C78838CD3446DBC3B6C57416E5DF1601 /* MATileOverlayRenderer.h */, - 6DDB0F91BAEEA431301574B316329B0D /* MATouchPoi.h */, - D886BE5A9F5F18037B49BF5843A23557 /* MATraceLocation.h */, - 79F61EDF41457CD8F6AC99EEB203BDEF /* MATraceManager.h */, - 4F88C9D2A26698191E3F0BAB6E73C1D6 /* MAUserLocation.h */, - DE563497DD3BB9A6B51060C88124B030 /* MAUserLocationRepresentation.h */, - 3DD794182C921E59A62953E67C6E7BAD /* Frameworks */, - 701DD2AA6C7160AE06B46DD62ABCC15F /* Resources */, - EBB6A3C458125F3933DC713CFEBE57FA /* Support Files */, + 800B26A49CB600AD89767C4482FE6BF5 /* Frameworks */, + 80E3DF42C81B4A8C6BE9A0196EAA7E96 /* Support Files */, ); - name = "AMap3DMap-NO-IDFA"; - path = "AMap3DMap-NO-IDFA"; + name = "WechatOpenSDK-XCFramework"; + path = "WechatOpenSDK-XCFramework"; sourceTree = ""; }; - DD51156B35FBCA6A32E3B025718A7857 /* Pods-suixinkanTests */ = { + E5AD5B9A7945081BBCBE5777A465FB24 /* Support Files */ = { isa = PBXGroup; children = ( - 8954141270608938A38FD68585BFD293 /* Pods-suixinkanTests.modulemap */, - 668A9B1E2D7B1954AE52ABE25041CC36 /* Pods-suixinkanTests-acknowledgements.markdown */, - 930BB613D93B3F0743FE520201572148 /* Pods-suixinkanTests-acknowledgements.plist */, - BBC4E88072A58FC7DD14D5BC2316725E /* Pods-suixinkanTests-dummy.m */, - 0560C72601DFB7648983A59E3A8630CF /* Pods-suixinkanTests-Info.plist */, - 65EE9CD76EF8BD358253184A5FA8B069 /* Pods-suixinkanTests-umbrella.h */, - 3CE7B2EE0FE95BBD834825FA4D0571C5 /* Pods-suixinkanTests.debug.xcconfig */, - A1C2AE0D141F894C0C841BDB91EA7784 /* Pods-suixinkanTests.release.xcconfig */, + CA71240104373EBD4E663DD82D9B2B18 /* UMDevice-xcframeworks.sh */, + 821CFE722ABC9FDF53472054DEED7118 /* UMDevice.debug.xcconfig */, + 14A1F49D0B3C6F4A06FE802DFE3C86A5 /* UMDevice.release.xcconfig */, ); - name = "Pods-suixinkanTests"; - path = "Target Support Files/Pods-suixinkanTests"; + name = "Support Files"; + path = "../Target Support Files/UMDevice"; sourceTree = ""; }; - DFDAD4C6E0E87D50276AF58AF0CC7A7B /* Support Files */ = { + EB0DADA7EE5EE5E7E0D7E84F9ED29353 /* Resources */ = { isa = PBXGroup; children = ( - D3E4AF577ED21FFF5C6997614BE817AF /* UMAPM-xcframeworks.sh */, - D738B4EADCCC0969B2C74EDD60C54C5F /* UMAPM.debug.xcconfig */, - 2B1E1B290F1753A341C14CED0A6F3F4D /* UMAPM.release.xcconfig */, + 410D0EEAD5DDC79E3DC3911CE33BA2CA /* AMap.bundle */, + ); + name = Resources; + sourceTree = ""; + }; + EC18E061295BDAD5E1E82BD9FE903B65 /* Support Files */ = { + isa = PBXGroup; + children = ( + 7BCBC763937F56378DD43E852B2F5630 /* UMAPM-xcframeworks.sh */, + 530DCF2469E6370042646A66DA07F65B /* UMAPM.debug.xcconfig */, + AEF4F9351FE5B148A0234F5931DE6880 /* UMAPM.release.xcconfig */, ); name = "Support Files"; path = "../Target Support Files/UMAPM"; sourceTree = ""; }; - E4801F62A6B08CD9B5410329F1A18FDE /* iOS */ = { + ED2F580E29081C28DF63DF03D4B3E246 /* Resources */ = { isa = PBXGroup; children = ( - 384DDA2CB25005BD6479B5987C619DD4 /* Foundation.framework */, + FE5C672CF96BECD4AEF2D01E86D7A5BC /* PrivacyInfo.xcprivacy */, ); - name = iOS; + name = Resources; sourceTree = ""; }; - E9F17ABFD66E8A4813CAB917573983D8 /* Frameworks */ = { + F0CD363F7C4454C2EBAA68E4DA26AB89 /* Support Files */ = { isa = PBXGroup; children = ( - 5AE4ED04FC4934C3CFE1803544F7E599 /* WechatOpenSDK.xcframework */, + 5EC51B95CEAEB39AE17EE8C8A1315458 /* IQKeyboardToolbar.modulemap */, + 98C600FCCEF4A91D173BC8EFDC782856 /* IQKeyboardToolbar-dummy.m */, + 803FEE5356A6FBA7ED0EAAFC5BC123C9 /* IQKeyboardToolbar-Info.plist */, + 01FED2850C91917B5CF595B8834B8F2A /* IQKeyboardToolbar-prefix.pch */, + 6A7D9DC50C63535042164A35DFD40EC2 /* IQKeyboardToolbar-umbrella.h */, + 754436F7705D79991C66788AEA045C77 /* IQKeyboardToolbar.debug.xcconfig */, + A92E1DCC03BC5DAD5064EB3DBD227D12 /* IQKeyboardToolbar.release.xcconfig */, + 0EBA328CDD2131771C5A3F054677DEB7 /* ResourceBundle-IQKeyboardToolbar-IQKeyboardToolbar-Info.plist */, + ); + name = "Support Files"; + path = "../Target Support Files/IQKeyboardToolbar"; + sourceTree = ""; + }; + F1320EF8DE183C5CCF2AB1FE8E9EC450 /* Resources */ = { + isa = PBXGroup; + children = ( + EB59B9412536BB983F181D5769060818 /* PrivacyInfo.xcprivacy */, + ); + name = Resources; + sourceTree = ""; + }; + F1DC98103FEE2E8AD766AFD9E3FF4E13 /* AMap3DMap-NO-IDFA */ = { + isa = PBXGroup; + children = ( + 8AC85556DEF7C559A040F57C33A40633 /* MAAnimatedAnnotation.h */, + 3E8D11AD30BB130A5D5F5DD5EEA21C13 /* MAAnnotation.h */, + BACFC696F17A03CB80DEEF73E77302E2 /* MAAnnotationMoveAnimation.h */, + 93D0847F3C4AEFBCEB0F33321FA38F74 /* MAAnnotationView.h */, + 7117F9A1DF7F687A834B261182C1EA55 /* MAArc.h */, + 6E14BDA75AF00D9E7A51C5542367D0C5 /* MAArcRenderer.h */, + 41ADD30512AEB247C434B54400AA1B8E /* MABaseEngineOverlay.h */, + 98D4A05B914687A10BBD1D8F52BC1D96 /* MABaseOverlay.h */, + 95ADDDA73C96A467FAB58645AD894407 /* MACircle.h */, + C673BE82C521D6ADDBF2C4B8322DEA9D /* MACircleRenderer.h */, + 6FED7B503B038DD91ADA3CD3CBB7596A /* MAConfig.h */, + BE3E3BE5A00DCFFFB9F3E9CECCDF4C87 /* MACustomBuildingOverlay.h */, + 260A409C8A6E5DE46B3829489949BFA4 /* MACustomBuildingOverlayRenderer.h */, + B8AE791619AC35079A245E0E1C923B29 /* MACustomCalloutView.h */, + 678E22BC596467BFE77D6AC56DE6B506 /* MAGeodesicPolyline.h */, + 2650DFB5183D12166C27899A4BC4610E /* MAGeometry.h */, + B0B134BD54CAC0568CEFCAC7A2C4D501 /* MAGroundOverlay.h */, + B96511BAA4FE78A664B6E6551E3D01B4 /* MAGroundOverlayRenderer.h */, + ADCAC46CA8AEF179C511492B4BE969E5 /* MAHeatMapTileOverlay.h */, + 39E2B55991EB064699426C92C7A92A8B /* MAHeatMapVectorGridOverlay.h */, + E384C5E2E248308B68F0698C93BF3479 /* MAHeatMapVectorGridOverlayRenderer.h */, + 568F2B31726426E57A3F36BBBF5F42B8 /* MAHeatMapVectorOverlay.h */, + 1EC4F8706BDB476E1074145E1FEE2DBF /* MAHeatMapVectorOverlayRender.h */, + 3F08C2AB03A8CF8FCB8E3F1C3A781476 /* MAIndoorInfo.h */, + B80D6E12DED75CA167FDE0E093CE3EB2 /* MALineDrawType.h */, + 08CB266E76332AED0E3B48EEB055983F /* MAMapAccessibilityIdentifier.h */, + 8CCEBE1D4B4C8B5E5D13F95AB75BA1C1 /* MAMapCustomStyleOptions.h */, + 55417717066654E20173101D0149276F /* MAMapKit.h */, + EB7088E189876059E84BE697CCBE78A5 /* MAMapSnapshot.h */, + 4B2ADDFC7774B5BE010DDF66FAAB1D3B /* MAMapStatus.h */, + 3B39ED3B08A5738A4295207CF9495EEC /* MAMapVersion.h */, + 6C8B2C7235B11C85311CBBD9ACAD5C21 /* MAMapView.h */, + 648E27D8BEFDF4B6FECE1F3272B70252 /* MAMapView+Resource.h */, + 8BCE0C5C82A85BEE1FB8964A80995A91 /* MAMultiColoredPolylineRenderer.h */, + 1CB599AE97D1806104DE0A97F127E6FB /* MAMultiPoint.h */, + DAD6BC8BBA2DD3CF9E1D82EA8F20A6E0 /* MAMultiPointOverlay.h */, + 2D5732AE377676B0FE9DD3353BA83883 /* MAMultiPointOverlayRenderer.h */, + B45917D3D6E447F954940B2ED5C5CDE4 /* MAMultiPolyline.h */, + 59596161CD8354A2C07152FA9E27F084 /* MAMultiTexturePolylineRenderer.h */, + 7390E83941C265B7AC76FEEBD5F05C25 /* MAMVTTileOverlay.h */, + A0547FB017A5DFBA2C76B16823FB9F72 /* MAMVTTileOverlayRenderer.h */, + 6B27D89D91D9554E7D55DCA8850866D3 /* MAOfflineCity.h */, + F96D42DD35177EFC564FD68BA29A081C /* MAOfflineItem.h */, + 8B745529877AADD74BC646FB33E8D06D /* MAOfflineItemCommonCity.h */, + C6C125B834201C7BBEC16F597A39DA25 /* MAOfflineItemMunicipality.h */, + 5FA112782CA9F7A1FA52C5A334A9734F /* MAOfflineItemNationWide.h */, + DA3EC65D3A663DDC63A7683BECC5C515 /* MAOfflineMap.h */, + B67ADBF9B39B38C0214A82C1CEB92B7E /* MAOfflineMapViewController.h */, + FD8D404506B5F9F1593854C67CCD5315 /* MAOfflineProvince.h */, + 9C93DB51A175907CE39A60A4864E2588 /* MAOverlay.h */, + CC161540B34EC7C6D41CF8A75A119A1C /* MAOverlayPathRenderer.h */, + 7231AA5CB6E0767D9B4DAEC51CA29801 /* MAOverlayRenderer.h */, + D19D9A587ED9DDB9F0DA8FDAFBC59A5F /* MAParticleOverlay.h */, + 57D639F0A4D2DCE8A55EE9F3FB949A93 /* MAParticleOverlayOptions.h */, + 9B57A3B2533A44DCE9EAEA72C2166ADB /* MAParticleOverlayRenderer.h */, + D90BD86E814201A071022B5983022145 /* MAPathShowRange.h */, + D18EA77619DCFFEFD7E07DC6733B93F2 /* MAPinAnnotationView.h */, + A7CCCEC542C22890A5C1780CC936272D /* MAPoiFilter.h */, + DA90B2D41D40AD20F8B741334824D9B2 /* MAPointAnnotation.h */, + 675C87643DA15213B2237CB3F10145F9 /* MAPolygon.h */, + 99F6EE572187DA42701B0F5D6C460792 /* MAPolygonRenderer.h */, + 0E3937675CAA550D5CB90F0343F30691 /* MAPolyline.h */, + E0DCBA54D7EC5F8042CD6BBDD0919E88 /* MAPolylineRenderer.h */, + 45271BD948661C63407D83810E087058 /* MARouteOverlay.h */, + 5FB231080671A8D81B7D69851169AFF4 /* MARouteOverlayModel.h */, + 49AF7809713DA87B3E840B2C01FFFAE6 /* MAShape.h */, + 6B90DE7BD5C01A044C39F72CCC36A2E6 /* MATerrainOverlay.h */, + 98FF779CBB45904DCD621D23A2CA7B2E /* MATerrainOverlayRenderer.h */, + C6E875478190A65FCE880AF91BACA896 /* MATileOverlay.h */, + D697DA8AA4A63580A1F699C896FBFF90 /* MATileOverlayRenderer.h */, + B230C109EAD1B602ED3A4501735751A4 /* MATouchPoi.h */, + 3D078068106693825870F72C096C124A /* MATraceLocation.h */, + 4DB9C28692E9F990C88D2461FF36F728 /* MATraceManager.h */, + EE1151DDC70248708780391CF5A27282 /* MAUserLocation.h */, + ABA801F2197CA348789920AC30E34B52 /* MAUserLocationRepresentation.h */, + F976F8ED0ADC984BE90E3B1803B9B186 /* Frameworks */, + EB0DADA7EE5EE5E7E0D7E84F9ED29353 /* Resources */, + F42C5DD0708DA9376B736C591BBD1706 /* Support Files */, + ); + name = "AMap3DMap-NO-IDFA"; + path = "AMap3DMap-NO-IDFA"; + sourceTree = ""; + }; + F42C5DD0708DA9376B736C591BBD1706 /* Support Files */ = { + isa = PBXGroup; + children = ( + 2D1CB2C6953200669BA5206342981582 /* AMap3DMap-NO-IDFA.debug.xcconfig */, + 103108AC7A027FAA9D881105F432DFED /* AMap3DMap-NO-IDFA.release.xcconfig */, + ); + name = "Support Files"; + path = "../Target Support Files/AMap3DMap-NO-IDFA"; + sourceTree = ""; + }; + F976F8ED0ADC984BE90E3B1803B9B186 /* Frameworks */ = { + isa = PBXGroup; + children = ( + ED75EE1B72B6641B9064BDE79EECC082 /* MAMapKit.framework */, ); name = Frameworks; sourceTree = ""; }; - EBB6A3C458125F3933DC713CFEBE57FA /* Support Files */ = { + FE07A82F771683AB423C9860244A6FE6 /* Placeholderable */ = { isa = PBXGroup; children = ( - 125064997C0EDA842FA880F67BB3D06F /* AMap3DMap-NO-IDFA.debug.xcconfig */, - BBA147F6EAE0D76BC35E87FCF69C9C2D /* AMap3DMap-NO-IDFA.release.xcconfig */, + 49433A7414A4DAC29B5BF7295ADBC92D /* IQPlaceholderable.swift */, ); - name = "Support Files"; - path = "../Target Support Files/AMap3DMap-NO-IDFA"; + name = Placeholderable; + sourceTree = ""; + }; + FE39F1D628207BAE4D51BDA1F5799D8F /* Resign */ = { + isa = PBXGroup; + children = ( + C9DC6694ECD3E3A0881A97E842D83D49 /* IQKeyboardManager+Resign.swift */, + B381E333A40EB0E75671BF9FB617AC37 /* IQKeyboardManager+Resign_Deprecated.swift */, + E255579824F1D21C00ED5B029E99BDA6 /* IQKeyboardResignHandler.swift */, + E7606BACFB790485C35F7EC8C0871429 /* IQKeyboardResignHandler+Internal.swift */, + 1DCD55C5C01982AECFC7B1BE8AD51098 /* UIView+Resign.swift */, + 61C8B1DA3B268A12F02985D29EFC8C82 /* UIView+ResignObjc.swift */, + ); + name = Resign; sourceTree = ""; }; /* End PBXGroup section */ @@ -814,43 +1824,230 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - BDD4D0D2F378A1FF6B69A4B7B9541A62 /* Headers */ = { + 16687501924B4537FCC2C84BE3E585B8 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 854C28C6CC7D858B9645ED10D409AF6C /* Pods-suixinkan-umbrella.h in Headers */, + C13E73214F37BAE28B4F8AD6EFEECA95 /* IQKeyboardManagerSwift-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 329BF91C683B5253C061223AC3C65FC6 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 7199EAFCB9BFD43B5CF333627BBE6715 /* IQKeyboardToolbar-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 357596762C9671D2A6F3A3C4D70A5947 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + FC31BD8F5A7ABFAD5F87EFE19920F85C /* IQTextInputViewNotification-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 3B1AF30CF9C8E42E24DA5BEA63D1D465 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + FE0D3260BF27D388B0200F1AC8151619 /* IQKeyboardCore-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4B765DB9B0EFCE1D399CF6B41976C2E8 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + D3F608CA68128687287C578A5AE78032 /* IQKeyboardReturnManager-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7B598766D21FF0158281BF81FD8AE205 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + BE50FCAC87378A04725C360266735624 /* IQKeyboardToolbarManager-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B12812707A1E2A33F8774D10386318F2 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + C8ADA0B4C5E93DC1F608726FFB26AA95 /* Pods-suixinkan-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + CB5128E0663182203E644D43EC22FD6C /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + CE4289FB36C1751B29FF3A08BAB1303F /* IQKeyboardNotification-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + DD94DA5C0E999979A716CFC575A52DCF /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + CBF2EBCCBEA754DA8890D0A93C07B935 /* IQTextView-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ - 1DE17B7C77CD95CB67DF1197965B76AB /* Pods-suixinkan */ = { + 020993F16DA5986DACE118349EBCE9E5 /* IQKeyboardToolbarManager */ = { isa = PBXNativeTarget; - buildConfigurationList = 5D641A103C53ABF7AC3FDE4F6A159F62 /* Build configuration list for PBXNativeTarget "Pods-suixinkan" */; + buildConfigurationList = 5BF3AE1AD7C057CDE87FF62804308200 /* Build configuration list for PBXNativeTarget "IQKeyboardToolbarManager" */; buildPhases = ( - BDD4D0D2F378A1FF6B69A4B7B9541A62 /* Headers */, - F172A1B95C32954AA711E8EDD4DFF06B /* Sources */, - 8BD4903F809FAA786A7E5E69F62F63A5 /* Frameworks */, - 7C0E1A48BE53B1C311D97C652550C606 /* Resources */, + 7B598766D21FF0158281BF81FD8AE205 /* Headers */, + 0F864F2D953DE58F44408F41B14ECD82 /* Sources */, + 804587AB28EEEF0BEA2A61F7793D6397 /* Frameworks */, + 811541F71B0A907AEFFE7251061CAC09 /* Resources */, ); buildRules = ( ); dependencies = ( - 508BD9C74804FE09340D00029BA50402 /* PBXTargetDependency */, - 893469686E4BE480A26EDDA676C20422 /* PBXTargetDependency */, - 6C611DCC8170518F6D15BAF902FE9B3D /* PBXTargetDependency */, - 038C0F12DF18397FE75654A4A58EBFE1 /* PBXTargetDependency */, - C6207D906EF379F51AC9781645A73427 /* PBXTargetDependency */, - F41C3FE4AEBBE63D38E5D265A2DADB36 /* PBXTargetDependency */, - 42BC71A6B6E92FCA93067788C3AD6162 /* PBXTargetDependency */, - 928C950BECCEBEC3AA0B042EAA907D8D /* PBXTargetDependency */, + AB5A25CF018931839DC4BDD8289B35ED /* PBXTargetDependency */, + FB86DD25156516C16E8DB9CB80AFAEA0 /* PBXTargetDependency */, + EF792F8F077B3DD044CE5CE270FEF472 /* PBXTargetDependency */, + ); + name = IQKeyboardToolbarManager; + productName = IQKeyboardToolbarManager; + productReference = FA727BF5D9541C98C22C9ECC911576E2 /* IQKeyboardToolbarManager */; + productType = "com.apple.product-type.framework"; + }; + 0981F89DB5DA3FFCFFEBDE1F56287054 /* IQKeyboardReturnManager */ = { + isa = PBXNativeTarget; + buildConfigurationList = EF66756C5F5021DC6F5125F6AD1F7D11 /* Build configuration list for PBXNativeTarget "IQKeyboardReturnManager" */; + buildPhases = ( + 4B765DB9B0EFCE1D399CF6B41976C2E8 /* Headers */, + C66330402EBF18108182DA033F59C463 /* Sources */, + 2CF735AA78D038135F98198CADF6AD48 /* Frameworks */, + 8228B3A8066702A79F754BCBD77325D0 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + CF12C45973B67DCE4BA1A1BFE9D01B16 /* PBXTargetDependency */, + ABF9B92C6B3B3E5D2B202752DB24B229 /* PBXTargetDependency */, + ); + name = IQKeyboardReturnManager; + productName = IQKeyboardReturnManager; + productReference = 15848DEC7727A809830E7F6FC1B6CE0F /* IQKeyboardReturnManager */; + productType = "com.apple.product-type.framework"; + }; + 12890DE3ABBC2CA295E108358D85EE69 /* IQTextView */ = { + isa = PBXNativeTarget; + buildConfigurationList = 09A961DE894C0013BADB1F2A948F9CC6 /* Build configuration list for PBXNativeTarget "IQTextView" */; + buildPhases = ( + DD94DA5C0E999979A716CFC575A52DCF /* Headers */, + 57B1E60D47A68F03F6A945518193C950 /* Sources */, + A95A8379EABE849DDA48D1551FC97E26 /* Frameworks */, + 1085BC99061020647CF2C312BB04499C /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + C2AF20535E16E51D3D31CF850D223AE4 /* PBXTargetDependency */, + 61FE1EBA36961430C6DEFBA5FE675CD8 /* PBXTargetDependency */, + ); + name = IQTextView; + productName = IQTextView; + productReference = 0DFD4541FF9DAA31A2FC2A7F6D03ED22 /* IQTextView */; + productType = "com.apple.product-type.framework"; + }; + 1DE17B7C77CD95CB67DF1197965B76AB /* Pods-suixinkan */ = { + isa = PBXNativeTarget; + buildConfigurationList = 479309EC6EE72E40EA04B5DB51BCE182 /* Build configuration list for PBXNativeTarget "Pods-suixinkan" */; + buildPhases = ( + B12812707A1E2A33F8774D10386318F2 /* Headers */, + 93C05AA14F4D84D23D0EDCF6CFF524E3 /* Sources */, + 07115845B01AD888DDF1244A60D3A323 /* Frameworks */, + 62808C7F02363B33E6E1BA2C1017DE0C /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 0DDE5E5278D5178B7A0924B38242D430 /* PBXTargetDependency */, + 614D0A5D7D98B5CDE713F04E02E64808 /* PBXTargetDependency */, + 9ECD54016970787AC7070A20A812C0A7 /* PBXTargetDependency */, + 0C7DE72A13C209016ED1052F112C5D0A /* PBXTargetDependency */, + FEA026F72BEC2A47E8AFFE44EC19E38C /* PBXTargetDependency */, + FF029834E5B5CE9CEA6604E3851A3F7F /* PBXTargetDependency */, + 0660CD9A734A6F20F048B2954366EAFA /* PBXTargetDependency */, + B19AE932F30C91EC3BF4540887BFBAB0 /* PBXTargetDependency */, + F01A055C2F90B8EE80644CEF058F8066 /* PBXTargetDependency */, + 493CC09794495377CEA0D6511C08DF33 /* PBXTargetDependency */, + B2A28CD787E9C7550186DF91899269D0 /* PBXTargetDependency */, + 167B0DBE066A1A067E88EC863F96A6F4 /* PBXTargetDependency */, + 3AE2784D001B814322069BB3262DE2F0 /* PBXTargetDependency */, + CF356CCD553A10E2BD3E04C6849A91B1 /* PBXTargetDependency */, + 25E77A011AAD89186AB30BCAFCA91BAF /* PBXTargetDependency */, + D5FDDB8944CE089D7E48316F7D5132F6 /* PBXTargetDependency */, ); name = "Pods-suixinkan"; productName = Pods_suixinkan; productReference = 5BD109278933E8C2F269E5DCEC3A5376 /* Pods-suixinkan */; productType = "com.apple.product-type.framework"; }; + 283C1F2EA88CD4413165801A6748A48E /* IQTextInputViewNotification */ = { + isa = PBXNativeTarget; + buildConfigurationList = 3B8D996F70ECB5ABAA0D27F0682F29FC /* Build configuration list for PBXNativeTarget "IQTextInputViewNotification" */; + buildPhases = ( + 357596762C9671D2A6F3A3C4D70A5947 /* Headers */, + 941C8CA8A16D7C687C7AC206284CEC67 /* Sources */, + A19AA0BC524C3B2FBEF2E496A062D9E6 /* Frameworks */, + BD785E16CFDB86644197D72405420DE8 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 4F77936C23D9D16C8DAA0790EEBA67DD /* PBXTargetDependency */, + 4A32E9D21E2793EDC5E337B21ACFAC39 /* PBXTargetDependency */, + ); + name = IQTextInputViewNotification; + productName = IQTextInputViewNotification; + productReference = 06E5B413FEA5A600D76636DA132F8FB9 /* IQTextInputViewNotification */; + productType = "com.apple.product-type.framework"; + }; + 2B8FF445A5162845FAB9EC00FC92B694 /* IQKeyboardNotification-IQKeyboardNotification */ = { + isa = PBXNativeTarget; + buildConfigurationList = 6412B4AF0006867B0CD0DC861955DE47 /* Build configuration list for PBXNativeTarget "IQKeyboardNotification-IQKeyboardNotification" */; + buildPhases = ( + 45100CED92550C022393EE1BA5E6019A /* Sources */, + D5799B6FAE6FF6E60C3D5EA3E382E384 /* Frameworks */, + 4205A960735B52ADADF83031A02D57DE /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "IQKeyboardNotification-IQKeyboardNotification"; + productName = IQKeyboardNotification; + productReference = 120BD4C670EF00F4D5A40AA4B863A7AE /* IQKeyboardNotification-IQKeyboardNotification */; + productType = "com.apple.product-type.bundle"; + }; + 4502C7427440BEB17A50C0BF6E638A85 /* IQTextInputViewNotification-IQTextInputViewNotification */ = { + isa = PBXNativeTarget; + buildConfigurationList = 4A1B7E3CD60374893FA0F1F54CB8AFA9 /* Build configuration list for PBXNativeTarget "IQTextInputViewNotification-IQTextInputViewNotification" */; + buildPhases = ( + 47DEE4EBDBC25DDA5BE8251AD17CAC94 /* Sources */, + 2F79635F5C7B42BA46F46BE3484AB18C /* Frameworks */, + E41BEF6C3363CE29D97CF7D4E9B505CA /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "IQTextInputViewNotification-IQTextInputViewNotification"; + productName = IQTextInputViewNotification; + productReference = F956E149F5B195BB7833F97FC6211AE8 /* IQTextInputViewNotification-IQTextInputViewNotification */; + productType = "com.apple.product-type.bundle"; + }; 508CB5D3E96E222654C51F13079FC2CD /* Pods-suixinkanTests */ = { isa = PBXNativeTarget; buildConfigurationList = 9D12533D25351890E8822DC48F49289E /* Build configuration list for PBXNativeTarget "Pods-suixinkanTests" */; @@ -863,13 +2060,197 @@ buildRules = ( ); dependencies = ( - B26EEB93D2DA6C57FF71DBE337CF2E85 /* PBXTargetDependency */, + B46F7B9127B65649076D1E1768F7BAA9 /* PBXTargetDependency */, ); name = "Pods-suixinkanTests"; productName = Pods_suixinkanTests; productReference = 1B7465A72120AF417FD5F1F34AD33AD4 /* Pods-suixinkanTests */; productType = "com.apple.product-type.framework"; }; + 7C5613175BBC4BF67E36DB4FBEBC01D0 /* IQKeyboardToolbarManager-IQKeyboardToolbarManager */ = { + isa = PBXNativeTarget; + buildConfigurationList = C95B0CE9F4170BB1B59616D3385E2F61 /* Build configuration list for PBXNativeTarget "IQKeyboardToolbarManager-IQKeyboardToolbarManager" */; + buildPhases = ( + 267715213DAC3BE94223942D1A751FAD /* Sources */, + 12ED6423A2314290914AA821F798D467 /* Frameworks */, + 7D22C468847DF7D5F954CA5DC0964A98 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "IQKeyboardToolbarManager-IQKeyboardToolbarManager"; + productName = IQKeyboardToolbarManager; + productReference = 80A40EDA3AF0499BDBCFF09467BB49AD /* IQKeyboardToolbarManager-IQKeyboardToolbarManager */; + productType = "com.apple.product-type.bundle"; + }; + 88810798DA63A2F6611B0970EA276DEC /* IQKeyboardReturnManager-IQKeyboardReturnManager */ = { + isa = PBXNativeTarget; + buildConfigurationList = 3E3B87D26AEC563F28EB5043B31C00F8 /* Build configuration list for PBXNativeTarget "IQKeyboardReturnManager-IQKeyboardReturnManager" */; + buildPhases = ( + A8669F868C101009C067C3F42C8EF10A /* Sources */, + BDB7DB0EADADCCFDB4ED5ABDE9E25C63 /* Frameworks */, + 3D874099554BAE97B4A27479EF694A6A /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "IQKeyboardReturnManager-IQKeyboardReturnManager"; + productName = IQKeyboardReturnManager; + productReference = 110BD425B6CAD6801539E2C6AB6E0662 /* IQKeyboardReturnManager-IQKeyboardReturnManager */; + productType = "com.apple.product-type.bundle"; + }; + 982A68D37F5DCBC1FC1FDC0BB2F0EB8E /* IQKeyboardManagerSwift-IQKeyboardManagerSwift */ = { + isa = PBXNativeTarget; + buildConfigurationList = C6C67350850E663003A14D5A7997572B /* Build configuration list for PBXNativeTarget "IQKeyboardManagerSwift-IQKeyboardManagerSwift" */; + buildPhases = ( + 59B0780942D8903C679C73CAE173C5FD /* Sources */, + 60DE610A8A18555DA5115D0E361E6099 /* Frameworks */, + F6A1AAF6286CE6E28CBC499CA5A2D307 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "IQKeyboardManagerSwift-IQKeyboardManagerSwift"; + productName = IQKeyboardManagerSwift; + productReference = 8D8069D3964814114ACEC3084C010B59 /* IQKeyboardManagerSwift-IQKeyboardManagerSwift */; + productType = "com.apple.product-type.bundle"; + }; + A26E6FD851C20D652B2755C1464A9990 /* IQKeyboardNotification */ = { + isa = PBXNativeTarget; + buildConfigurationList = B5C8C509357117AE775409F0B0EB3F56 /* Build configuration list for PBXNativeTarget "IQKeyboardNotification" */; + buildPhases = ( + CB5128E0663182203E644D43EC22FD6C /* Headers */, + B7F91E30C8FAA5D17AD3187205E15012 /* Sources */, + B855C4F681B3FC1558DD24942FD56363 /* Frameworks */, + E05DFE06F92A6A18EC23B753A5EBAECA /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + FA34A11251951FBED3032D1E332C4075 /* PBXTargetDependency */, + ); + name = IQKeyboardNotification; + productName = IQKeyboardNotification; + productReference = FEF9AC89E9C4BD37AC0AB78B535D1CFC /* IQKeyboardNotification */; + productType = "com.apple.product-type.framework"; + }; + A6602BCAA6F4F932A586C41D0B7E019C /* IQTextView-IQTextView */ = { + isa = PBXNativeTarget; + buildConfigurationList = 0FEAC1E425E68CB15470BB3984E9D409 /* Build configuration list for PBXNativeTarget "IQTextView-IQTextView" */; + buildPhases = ( + 4607AF0653A8B8EF7315A982EFAEEE90 /* Sources */, + 9DC2AACE799ED8E921CF9B390F2EB6E5 /* Frameworks */, + A11CC2CEFC94F1345C72C79F78F8758C /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "IQTextView-IQTextView"; + productName = IQTextView; + productReference = 847044E56CBBCE1235A6F3CEF3F9F607 /* IQTextView-IQTextView */; + productType = "com.apple.product-type.bundle"; + }; + B247F77A0CD5E19C8187A9BA1EB58C09 /* IQKeyboardToolbar-IQKeyboardToolbar */ = { + isa = PBXNativeTarget; + buildConfigurationList = 878CD092AEF27E8EED6C6763E470039A /* Build configuration list for PBXNativeTarget "IQKeyboardToolbar-IQKeyboardToolbar" */; + buildPhases = ( + 310FBC59D9CD4D0179902B6806409BD9 /* Sources */, + 0EA478E8AC9EAC80FC161EA42B1F04F0 /* Frameworks */, + 60DDE4FDBE750EC4A7362589CF833106 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "IQKeyboardToolbar-IQKeyboardToolbar"; + productName = IQKeyboardToolbar; + productReference = A16FD016E18EACCF6B23F219F2E236FE /* IQKeyboardToolbar-IQKeyboardToolbar */; + productType = "com.apple.product-type.bundle"; + }; + B490E7485944099E16C9CBD79119D1D4 /* IQKeyboardManagerSwift */ = { + isa = PBXNativeTarget; + buildConfigurationList = 689FB5F7F35F7669022E8D9965E2938D /* Build configuration list for PBXNativeTarget "IQKeyboardManagerSwift" */; + buildPhases = ( + 16687501924B4537FCC2C84BE3E585B8 /* Headers */, + 8E8D8751848E4B107A0592666D532931 /* Sources */, + 140AE9DAFF20F8CF75AF4889E8910941 /* Frameworks */, + 15FAA77CA2CA84F3BE5CC7B2C394ECBB /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + BB45BC2D0701986251CEE255D93BB852 /* PBXTargetDependency */, + 99F78666F5CCF0DCA18E46B956425D11 /* PBXTargetDependency */, + E4307F5E687227DD0025466424F6F929 /* PBXTargetDependency */, + 33AC21D5642A8025BB3CBF63536F5928 /* PBXTargetDependency */, + 81BCD7E13A85F41028F3EE2E93DCCC41 /* PBXTargetDependency */, + C298DE3E27FDEE5214D0C0A8D7675592 /* PBXTargetDependency */, + ); + name = IQKeyboardManagerSwift; + productName = IQKeyboardManagerSwift; + productReference = A8E950A16D00F649C54FFB30F81D7842 /* IQKeyboardManagerSwift */; + productType = "com.apple.product-type.framework"; + }; + EEE261386011CDF271BE289F73FF5959 /* IQKeyboardCore-IQKeyboardCore */ = { + isa = PBXNativeTarget; + buildConfigurationList = DCAE6EDEEE8A32B61D5F03101D8DF626 /* Build configuration list for PBXNativeTarget "IQKeyboardCore-IQKeyboardCore" */; + buildPhases = ( + 7B6724661926821B69E125B58BEC207E /* Sources */, + D4DB6A9A63E531CD85F5BFFB32C568F8 /* Frameworks */, + E566CFE4F21B478C94CE9999D80A5CE3 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "IQKeyboardCore-IQKeyboardCore"; + productName = IQKeyboardCore; + productReference = 6E897F35E5E27028AC58B14B552FBC8D /* IQKeyboardCore-IQKeyboardCore */; + productType = "com.apple.product-type.bundle"; + }; + F4FE17428FD0E607723A44F17231B7A1 /* IQKeyboardToolbar */ = { + isa = PBXNativeTarget; + buildConfigurationList = 3C16768E28C01F1BDC49DD706ABF5A67 /* Build configuration list for PBXNativeTarget "IQKeyboardToolbar" */; + buildPhases = ( + 329BF91C683B5253C061223AC3C65FC6 /* Headers */, + C36E610F0D9B35E121054DAB280109F1 /* Sources */, + 560496BF063B615D209DF99AF1664550 /* Frameworks */, + 724EA8138E0EC27B703AC9D5D3F40422 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 20AD1620ADA766DA495B9B83652AAF2E /* PBXTargetDependency */, + 22898D4EC1FEC445764E272E9FB96CB9 /* PBXTargetDependency */, + ); + name = IQKeyboardToolbar; + productName = IQKeyboardToolbar; + productReference = B4B1A58096F15199A14069C5D6AA1C99 /* IQKeyboardToolbar */; + productType = "com.apple.product-type.framework"; + }; + F9A1BF709B7BA4C24A83664EB1E1C7D4 /* IQKeyboardCore */ = { + isa = PBXNativeTarget; + buildConfigurationList = B2130418C2FAD0A1E2FD872758AD609B /* Build configuration list for PBXNativeTarget "IQKeyboardCore" */; + buildPhases = ( + 3B1AF30CF9C8E42E24DA5BEA63D1D465 /* Headers */, + BF6F1816B0325207E7310ABC9FD05174 /* Sources */, + D07B79E83A18E3018EFA8CE654EF97CB /* Frameworks */, + 30325A914D6527C8259F46363D6D7531 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + E9201A9ED89377B19B83D2CE0BE9E06E /* PBXTargetDependency */, + ); + name = IQKeyboardCore; + productName = IQKeyboardCore; + productReference = FC7F0CF2EA5DF59C59D9995890DA5C47 /* IQKeyboardCore */; + productType = "com.apple.product-type.framework"; + }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ @@ -890,7 +2271,7 @@ mainGroup = CF1408CF629C7361332E53B88F7BD30C; minimizedProjectReferenceProxies = 0; preferredProjectObjectVersion = 77; - productRefGroup = C0A54D8DDA8ED18D016C2F971E3440BD /* Products */; + productRefGroup = A44383B435488DA9FDC1DB25CBBBCBA6 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( @@ -898,6 +2279,22 @@ 9B182CB4E1716E9070813D3C59736001 /* AMapFoundation-NO-IDFA */, 4BD4E22D3419D68A85BDD6119CB37C6C /* AMapLocation-NO-IDFA */, 4F1379598302C9160590B3650C10E1A5 /* AMapSearch-NO-IDFA */, + F9A1BF709B7BA4C24A83664EB1E1C7D4 /* IQKeyboardCore */, + EEE261386011CDF271BE289F73FF5959 /* IQKeyboardCore-IQKeyboardCore */, + B490E7485944099E16C9CBD79119D1D4 /* IQKeyboardManagerSwift */, + 982A68D37F5DCBC1FC1FDC0BB2F0EB8E /* IQKeyboardManagerSwift-IQKeyboardManagerSwift */, + A26E6FD851C20D652B2755C1464A9990 /* IQKeyboardNotification */, + 2B8FF445A5162845FAB9EC00FC92B694 /* IQKeyboardNotification-IQKeyboardNotification */, + 0981F89DB5DA3FFCFFEBDE1F56287054 /* IQKeyboardReturnManager */, + 88810798DA63A2F6611B0970EA276DEC /* IQKeyboardReturnManager-IQKeyboardReturnManager */, + F4FE17428FD0E607723A44F17231B7A1 /* IQKeyboardToolbar */, + B247F77A0CD5E19C8187A9BA1EB58C09 /* IQKeyboardToolbar-IQKeyboardToolbar */, + 020993F16DA5986DACE118349EBCE9E5 /* IQKeyboardToolbarManager */, + 7C5613175BBC4BF67E36DB4FBEBC01D0 /* IQKeyboardToolbarManager-IQKeyboardToolbarManager */, + 283C1F2EA88CD4413165801A6748A48E /* IQTextInputViewNotification */, + 4502C7427440BEB17A50C0BF6E638A85 /* IQTextInputViewNotification-IQTextInputViewNotification */, + 12890DE3ABBC2CA295E108358D85EE69 /* IQTextView */, + A6602BCAA6F4F932A586C41D0B7E019C /* IQTextView-IQTextView */, 1DE17B7C77CD95CB67DF1197965B76AB /* Pods-suixinkan */, 508CB5D3E96E222654C51F13079FC2CD /* Pods-suixinkanTests */, F1E09035B7675D89EC69B16728E2833E /* UMAPM */, @@ -909,6 +2306,46 @@ /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ + 1085BC99061020647CF2C312BB04499C /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 3AFBD37DF163254F6695A0CF8105B741 /* IQTextView-IQTextView in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 15FAA77CA2CA84F3BE5CC7B2C394ECBB /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + DCCD3E35C57D99BB47B7CF853C5A9748 /* IQKeyboardManagerSwift-IQKeyboardManagerSwift in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 30325A914D6527C8259F46363D6D7531 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 6DE9FD143CBC24075601F8FE2ADC4115 /* IQKeyboardCore-IQKeyboardCore in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 3D874099554BAE97B4A27479EF694A6A /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + EE58D262313604F9499EF080BB7570E2 /* PrivacyInfo.xcprivacy in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4205A960735B52ADADF83031A02D57DE /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + B709C2DB9B3599F3904D99978DFE31BE /* PrivacyInfo.xcprivacy in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 4995BF6BC2129E05D351581B0A223B59 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -916,16 +2353,121 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 7C0E1A48BE53B1C311D97C652550C606 /* Resources */ = { + 60DDE4FDBE750EC4A7362589CF833106 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + DEE20091E649C632B6EE2FD421214811 /* PrivacyInfo.xcprivacy in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 62808C7F02363B33E6E1BA2C1017DE0C /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; + 724EA8138E0EC27B703AC9D5D3F40422 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + A9A9B3D2801DD30DA93C8F20A506CCED /* IQKeyboardToolbar-IQKeyboardToolbar in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7D22C468847DF7D5F954CA5DC0964A98 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + F95C52480DA8BDDB020022F7FD010453 /* PrivacyInfo.xcprivacy in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 811541F71B0A907AEFFE7251061CAC09 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + C313DB17200D1B45E8C337318BA05813 /* IQKeyboardToolbarManager-IQKeyboardToolbarManager in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 8228B3A8066702A79F754BCBD77325D0 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + AE2A39A6A21769A88C36DA4A6ACF2A40 /* IQKeyboardReturnManager-IQKeyboardReturnManager in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A11CC2CEFC94F1345C72C79F78F8758C /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + FB53E4A87D410605B4F27174DF76FF4D /* PrivacyInfo.xcprivacy in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + BD785E16CFDB86644197D72405420DE8 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 3EE43A1A7294F331DA0172D3DA2DE250 /* IQTextInputViewNotification-IQTextInputViewNotification in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + E05DFE06F92A6A18EC23B753A5EBAECA /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 576EBE7A8D8A0C1E332CC7479B95B08A /* IQKeyboardNotification-IQKeyboardNotification in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + E41BEF6C3363CE29D97CF7D4E9B505CA /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + E928EA2BF42B4F59378A201F124A24DC /* PrivacyInfo.xcprivacy in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + E566CFE4F21B478C94CE9999D80A5CE3 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + EE075828CDE3D146F5E1C6534F99B52C /* PrivacyInfo.xcprivacy in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F6A1AAF6286CE6E28CBC499CA5A2D307 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8B932FE2562968B4AD79FB11FF1F31F0 /* PrivacyInfo.xcprivacy in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ + 1FBBEABC5CD4F9D8B761ABFBC501A335 /* [CP] Copy XCFrameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/UMDevice/UMDevice-xcframeworks-input-files.xcfilelist", + ); + name = "[CP] Copy XCFrameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/UMDevice/UMDevice-xcframeworks-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/UMDevice/UMDevice-xcframeworks.sh\"\n"; + showEnvVarsInLog = 0; + }; 47CF44479ABE0A5C18DEDA0F07935DF1 /* [CP] Copy XCFrameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -960,7 +2502,7 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/WechatOpenSDK-XCFramework/WechatOpenSDK-XCFramework-xcframeworks.sh\"\n"; showEnvVarsInLog = 0; }; - EF0E3FC9B6EE1A9C908433C323228B7C /* [CP] Copy XCFrameworks */ = { + FBE5DA9F98D23090BE0A41FECC364DF2 /* [CP] Copy XCFrameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -977,26 +2519,145 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/UMCommon/UMCommon-xcframeworks.sh\"\n"; showEnvVarsInLog = 0; }; - EFB006F9E64CF4C9C37AA7A9DEC5BE68 /* [CP] Copy XCFrameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/UMDevice/UMDevice-xcframeworks-input-files.xcfilelist", - ); - name = "[CP] Copy XCFrameworks"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/UMDevice/UMDevice-xcframeworks-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/UMDevice/UMDevice-xcframeworks.sh\"\n"; - showEnvVarsInLog = 0; - }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ + 0F864F2D953DE58F44408F41B14ECD82 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 99E2272BA8CC1502E45DC65CBFBCBCD4 /* Array+Sort.swift in Sources */, + 70C33A3C8A6F1EC98EEB3887921E1346 /* IQDeepResponderContainerView.swift in Sources */, + 9B0D1C2CD421BD42B4585E158EA8FE59 /* IQKeyboardToolbarConfiguration.swift in Sources */, + 57B5DEB0C98D408C28CEE2B381C1964D /* IQKeyboardToolbarConstants.swift in Sources */, + 03B31AAA8FE764D9264C465B87FF5958 /* IQKeyboardToolbarManager.swift in Sources */, + FB7CE812CC13A8D408545AB087AAB154 /* IQKeyboardToolbarManager+Action.swift in Sources */, + B596B09A2EFFA3DFCC75D0CB687464CC /* IQKeyboardToolbarManager+Debug.swift in Sources */, + 696AD590527FF3A1B986BF7974851C45 /* IQKeyboardToolbarManager+Deprecated.swift in Sources */, + 698B6FF2D3EB35756E187675DB447A0D /* IQKeyboardToolbarManager+Internal.swift in Sources */, + 066ED3786057BC51273F52D91A507355 /* IQKeyboardToolbarManager+Toolbar.swift in Sources */, + 9493F02F394A370868EFE569ABB2C1A2 /* IQKeyboardToolbarManager-dummy.m in Sources */, + BAB572B2D91EB9FE4085013E8BCF11A2 /* UIView+Responders.swift in Sources */, + 01F707D90E40C64CEF6B0130CD6A178E /* UIView+RespondersObjc.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 267715213DAC3BE94223942D1A751FAD /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 310FBC59D9CD4D0179902B6806409BD9 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 45100CED92550C022393EE1BA5E6019A /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4607AF0653A8B8EF7315A982EFAEEE90 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 47DEE4EBDBC25DDA5BE8251AD17CAC94 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 57B1E60D47A68F03F6A945518193C950 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 540CFC9075EC06780C6F934353584833 /* IQTextView.swift in Sources */, + 1DFA9FF0E56B7211CC945955627F680B /* IQTextView+Placeholderable.swift in Sources */, + EE2DEE5FC0FCE377B0B91053D1EEE1C4 /* IQTextView-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 59B0780942D8903C679C73CAE173C5FD /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7B6724661926821B69E125B58BEC207E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 8E8D8751848E4B107A0592666D532931 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 737ED0AA4A3560B77672478137FD3077 /* IQActiveConfiguration.swift in Sources */, + 709D0EF3CAC21F2C46996DC012F853CA /* IQKeyboardAppearanceConfiguration.swift in Sources */, + 82EE52834AB7023FE255776D547678BF /* IQKeyboardAppearanceManager.swift in Sources */, + D3ABAF6EDA21C1A1BA048EBE771A3C34 /* IQKeyboardAppearanceManager+Internal.swift in Sources */, + 986DC523CD4D441E2FEC4D3310F3B6AF /* IQKeyboardManager.swift in Sources */, + 6CC5606CD458DDB113E3F74401F34970 /* IQKeyboardManager+ActiveConfiguration.swift in Sources */, + 2E2E33A7CE9A23D5A01049599E8ED1B4 /* IQKeyboardManager+Appearance.swift in Sources */, + 69657BED56A2DDAE4D94D0FF7F296F48 /* IQKeyboardManager+Appearance_Deprecated.swift in Sources */, + 25C8C1DC571620C676F59FEBA032B95F /* IQKeyboardManager+Debug.swift in Sources */, + B552868FC458E31F528E3AD3A483D677 /* IQKeyboardManager+Deprecated.swift in Sources */, + 8B39ADF4DB39DD5A427D89AA15826EE3 /* IQKeyboardManager+Internal.swift in Sources */, + 13B75C893C5241E8C6D4A8A7C1FE56C9 /* IQKeyboardManager+Position.swift in Sources */, + 07609DBC62C85DFEEECD636C0653127E /* IQKeyboardManager+Resign.swift in Sources */, + E1C18171B224E80E6F9E87A2F1BFC47C /* IQKeyboardManager+Resign_Deprecated.swift in Sources */, + 9A6363832DBE2489783687308B9FC759 /* IQKeyboardManager+ToolbarManager.swift in Sources */, + 802C058F68EEFCECDA6841FA9FF5F7AB /* IQKeyboardManager+ToolbarManagerDeprecated.swift in Sources */, + 6C1E1FB34F5E4795759BBA858F006598 /* IQKeyboardManagerSwift-dummy.m in Sources */, + A896B59D4DE9C73E1B26FD3778930977 /* IQKeyboardResignHandler.swift in Sources */, + BEC863764D1B70E42F25A95161D8FA16 /* IQKeyboardResignHandler+Internal.swift in Sources */, + EFC13162E3A35D0EC2C76C2B23E5A09C /* IQRootControllerConfiguration.swift in Sources */, + 4C35AD6D6C1964E0B62736D44627D9BF /* IQScrollViewConfiguration.swift in Sources */, + 3BDC0695F069416FED48F824C55F90AB /* UICollectionView+IndexPaths.swift in Sources */, + DAE95FD71F66232D13925E728762532B /* UIScrollView+IQKeyboardManagerExtension.swift in Sources */, + F73E398751F521AA064471055F9D76B8 /* UIScrollView+IQKeyboardManagerExtensionObjc.swift in Sources */, + E519794B26536386633E398EE481A94F /* UITableView+IndexPaths.swift in Sources */, + 50A311C55B25BE8EA6B5C20EDAF6E231 /* UIView+IQKeyboardManagerExtension.swift in Sources */, + F2DD24E632D6EA8129EF60E0A4AFD91C /* UIView+IQKeyboardManagerExtensionObjc.swift in Sources */, + 1A0ED97718867A07C7020B8BBD889B25 /* UIView+Parent.swift in Sources */, + 3AA85F341A703A0E91707613BC1FBB2F /* UIView+ParentObjc.swift in Sources */, + DEF9DEE9A4E977FD0789D15512C400B6 /* UIView+Resign.swift in Sources */, + E16CD42A35F0C4177E59F6ABF0D54E18 /* UIView+ResignObjc.swift in Sources */, + 9CD18FBC522BC9FAF825298EE13E385A /* UIViewController+ParentContainer.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 93C05AA14F4D84D23D0EDCF6CFF524E3 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 94D1ED5D39A994EBD9DDDFC5494EE2D4 /* Pods-suixinkan-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 941C8CA8A16D7C687C7AC206284CEC67 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 7CC8EFB6010B9B87FEEDE9150EE5F617 /* IQTextInputViewInfo.swift in Sources */, + 9B2C0863AD3BAB0F877DC1F340119AA0 /* IQTextInputViewNotification.swift in Sources */, + C51D4A9FE595DCE7457E080705A98F11 /* IQTextInputViewNotification-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; A4CA8592159F27EC0C6DAAF8D354D51C /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -1005,107 +2666,320 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - F172A1B95C32954AA711E8EDD4DFF06B /* Sources */ = { + A8669F868C101009C067C3F42C8EF10A /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 38345B1EC1DA5F3668EE44701253E92A /* Pods-suixinkan-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B7F91E30C8FAA5D17AD3187205E15012 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + B4E63E50E80BA0DE0FDC0222727DBD11 /* IQKeyboardInfo.swift in Sources */, + 7E3D82D0DF9EE0F14DA44AC251B45E27 /* IQKeyboardNotification.swift in Sources */, + 8E9854AD5BEB1529B0C974C729FBC812 /* IQKeyboardNotification-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + BF6F1816B0325207E7310ABC9FD05174 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + C945CB4EC42271D435BF23E7749BE6BF /* IQKeyboardConstants.swift in Sources */, + 01216C042B056FFF0FC7EE32A002C38A /* IQKeyboardCore-dummy.m in Sources */, + 378BD5280F6C07B11CF30B253D824972 /* IQKeyboardExtended.swift in Sources */, + A39FE5F72261B202CC63722A7B357206 /* IQTextInputView.swift in Sources */, + E1734E56DB48E6F238408C9A232C7051 /* UIView+Hierarchy.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + C36E610F0D9B35E121054DAB280109F1 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 4E012E4A4CE4435DF6D829CB6904687D /* IQBarButtonItem.swift in Sources */, + EFA0B9BD4DB27C2114AFA46A63F19D79 /* IQBarButtonItemConfiguration.swift in Sources */, + 6BB50CA0467930C6314FD196D4D7E3D4 /* IQInvocation.swift in Sources */, + 2C9181EF6A244D525D5CDE45CC776350 /* IQKeyboardToolbar.swift in Sources */, + 054617E019D116086EBE9EE351830049 /* IQKeyboardToolbar-dummy.m in Sources */, + DFC69465EAE2C498CA6ABDEFADD9C2F2 /* IQKeyboardToolbarPlaceholderConfiguration.swift in Sources */, + F9F4D20D5371CB1BD4FC03401DC7B980 /* IQPlaceholderable.swift in Sources */, + BF67A2DCA85E702041E48BC18DB39DEF /* IQTitleBarButtonItem.swift in Sources */, + 62CD171ED278181D9297D4FC844F7023 /* UIView+IQKeyboardExtension.swift in Sources */, + 16A2854239094F2F08D7D8A0579E7CA4 /* UIView+IQKeyboardExtensionDeprecated.swift in Sources */, + 371EE3B1682699E7C9A8F2835032478E /* UIView+IQKeyboardExtensionObjc.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + C66330402EBF18108182DA033F59C463 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BD2157407D719E3B22097A99592F1434 /* IQKeyboardReturnManager.swift in Sources */, + 01772F3F31A552C1898094C34995FBFF /* IQKeyboardReturnManager+UITextFieldDelegate.swift in Sources */, + 0722BBD7A89C873C7C0E877B434244D8 /* IQKeyboardReturnManager+UITextViewDelegate.swift in Sources */, + 13AAA3B389AEE7BFD334A90B67B9509B /* IQKeyboardReturnManager-dummy.m in Sources */, + D59795F3072DB898B23C7ECAB9648A40 /* IQTextInputViewInfoModel.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 038C0F12DF18397FE75654A4A58EBFE1 /* PBXTargetDependency */ = { + 0660CD9A734A6F20F048B2954366EAFA /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = IQKeyboardNotification; + target = A26E6FD851C20D652B2755C1464A9990 /* IQKeyboardNotification */; + targetProxy = BE77FABD96B18CC818A1B8048B62AD9A /* PBXContainerItemProxy */; + }; + 0C7DE72A13C209016ED1052F112C5D0A /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = "AMapSearch-NO-IDFA"; target = 4F1379598302C9160590B3650C10E1A5 /* AMapSearch-NO-IDFA */; - targetProxy = 2F48F1B754086F0F2514AA521AB8B493 /* PBXContainerItemProxy */; + targetProxy = D6F6A7863C357AB39376EC52209E2A0D /* PBXContainerItemProxy */; }; - 21EC4402F23CC89322584C4190C64981 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = UMDevice; - target = CEB9AD2C3CFC208BFBE1F22F5EC3E1FC /* UMDevice */; - targetProxy = 3D12EEA2C94F5E7D1A04E3DCB8056418 /* PBXContainerItemProxy */; - }; - 29F474965F0AB7D17DB4A3D89EA9E86F /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "AMapFoundation-NO-IDFA"; - target = 9B182CB4E1716E9070813D3C59736001 /* AMapFoundation-NO-IDFA */; - targetProxy = 067A6759ACA9A549384C729E1010EEB2 /* PBXContainerItemProxy */; - }; - 39E8D398FFF9E2EF5EFCC030000214A6 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "AMapFoundation-NO-IDFA"; - target = 9B182CB4E1716E9070813D3C59736001 /* AMapFoundation-NO-IDFA */; - targetProxy = ADE47395DAB29611CE948513B2F0F2E5 /* PBXContainerItemProxy */; - }; - 42BC71A6B6E92FCA93067788C3AD6162 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = UMDevice; - target = CEB9AD2C3CFC208BFBE1F22F5EC3E1FC /* UMDevice */; - targetProxy = A9B64CB2E1958A4EBD9D7B1E35942161 /* PBXContainerItemProxy */; - }; - 4EB0F71C76E065029AE9C426A2B43B81 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = UMCommon; - target = 09FABB7D06BB8D3958515FB15B4E7971 /* UMCommon */; - targetProxy = 849BA746108EE0BE0F41CAF99BCF009C /* PBXContainerItemProxy */; - }; - 508BD9C74804FE09340D00029BA50402 /* PBXTargetDependency */ = { + 0DDE5E5278D5178B7A0924B38242D430 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = "AMap3DMap-NO-IDFA"; target = B44FB02BD2D3FEAD1F36808AD405A543 /* AMap3DMap-NO-IDFA */; - targetProxy = C0AB8415F3749D034999E1F84151D767 /* PBXContainerItemProxy */; + targetProxy = 3FA7EE33E2A4A9317A1A9BD1271CAD9A /* PBXContainerItemProxy */; }; - 6C611DCC8170518F6D15BAF902FE9B3D /* PBXTargetDependency */ = { + 0F7A67AD8E9321DD125EDE4532C7B621 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = "AMapLocation-NO-IDFA"; - target = 4BD4E22D3419D68A85BDD6119CB37C6C /* AMapLocation-NO-IDFA */; - targetProxy = 33B5943FAAD2EDE37C3C94F327FA50BC /* PBXContainerItemProxy */; + name = UMDevice; + target = CEB9AD2C3CFC208BFBE1F22F5EC3E1FC /* UMDevice */; + targetProxy = 604C23F4D8288FC7F99E40CC6B0A5AFB /* PBXContainerItemProxy */; }; - 893469686E4BE480A26EDDA676C20422 /* PBXTargetDependency */ = { + 167B0DBE066A1A067E88EC863F96A6F4 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = IQTextView; + target = 12890DE3ABBC2CA295E108358D85EE69 /* IQTextView */; + targetProxy = 86E020E02CC1A1EB70F0897B32D2077B /* PBXContainerItemProxy */; + }; + 20AD1620ADA766DA495B9B83652AAF2E /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = IQKeyboardCore; + target = F9A1BF709B7BA4C24A83664EB1E1C7D4 /* IQKeyboardCore */; + targetProxy = 48703231ACE2850477BE5A954C22D39D /* PBXContainerItemProxy */; + }; + 22898D4EC1FEC445764E272E9FB96CB9 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "IQKeyboardToolbar-IQKeyboardToolbar"; + target = B247F77A0CD5E19C8187A9BA1EB58C09 /* IQKeyboardToolbar-IQKeyboardToolbar */; + targetProxy = 7554BF75E0EABA51787581741F2C0977 /* PBXContainerItemProxy */; + }; + 25E77A011AAD89186AB30BCAFCA91BAF /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = UMDevice; + target = CEB9AD2C3CFC208BFBE1F22F5EC3E1FC /* UMDevice */; + targetProxy = B39953252EDD987C1A35C366900690CF /* PBXContainerItemProxy */; + }; + 33555EC29BF8027B235703241C066690 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = "AMapFoundation-NO-IDFA"; target = 9B182CB4E1716E9070813D3C59736001 /* AMapFoundation-NO-IDFA */; - targetProxy = BD91D75C44C68F52A94B116B7D1294F4 /* PBXContainerItemProxy */; + targetProxy = F37D3A96D9C3BBF6C882CF3CD02C632D /* PBXContainerItemProxy */; }; - 928C950BECCEBEC3AA0B042EAA907D8D /* PBXTargetDependency */ = { + 33AC21D5642A8025BB3CBF63536F5928 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = "WechatOpenSDK-XCFramework"; - target = 7F18C31A804695333763EEC303E265D7 /* WechatOpenSDK-XCFramework */; - targetProxy = 24A06925FD6662781797D78547B19FC7 /* PBXContainerItemProxy */; + name = IQKeyboardToolbarManager; + target = 020993F16DA5986DACE118349EBCE9E5 /* IQKeyboardToolbarManager */; + targetProxy = ACB2B6CE324FAA2F107B41B1B30FD3A3 /* PBXContainerItemProxy */; }; - AF80A180C5B3841DFC72A45C419B14BC /* PBXTargetDependency */ = { + 35ADED26003EA4A70C9A299D7FE29C82 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = "AMapFoundation-NO-IDFA"; target = 9B182CB4E1716E9070813D3C59736001 /* AMapFoundation-NO-IDFA */; - targetProxy = 991CAE88F0A4725CB8E8F174974E5B98 /* PBXContainerItemProxy */; + targetProxy = D93021E90DCA27E33FA08E04B32E8653 /* PBXContainerItemProxy */; }; - B26EEB93D2DA6C57FF71DBE337CF2E85 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "Pods-suixinkan"; - target = 1DE17B7C77CD95CB67DF1197965B76AB /* Pods-suixinkan */; - targetProxy = F7B6C2F4ACE4C28AB6488EF406B7E9D1 /* PBXContainerItemProxy */; - }; - C6207D906EF379F51AC9781645A73427 /* PBXTargetDependency */ = { + 3AE2784D001B814322069BB3262DE2F0 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = UMAPM; target = F1E09035B7675D89EC69B16728E2833E /* UMAPM */; - targetProxy = E0029779384156C3352043F0C3AFFE56 /* PBXContainerItemProxy */; + targetProxy = DC2DD867ABEA019EFC6E98A0B2815AE6 /* PBXContainerItemProxy */; }; - F41C3FE4AEBBE63D38E5D265A2DADB36 /* PBXTargetDependency */ = { + 493CC09794495377CEA0D6511C08DF33 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = IQKeyboardToolbarManager; + target = 020993F16DA5986DACE118349EBCE9E5 /* IQKeyboardToolbarManager */; + targetProxy = EE4EF75722C69B32AF324E46C1BBA7D1 /* PBXContainerItemProxy */; + }; + 4A32E9D21E2793EDC5E337B21ACFAC39 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "IQTextInputViewNotification-IQTextInputViewNotification"; + target = 4502C7427440BEB17A50C0BF6E638A85 /* IQTextInputViewNotification-IQTextInputViewNotification */; + targetProxy = ED4A999B5C1FBCC9415B78F1A4FDC18A /* PBXContainerItemProxy */; + }; + 4F77936C23D9D16C8DAA0790EEBA67DD /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = IQKeyboardCore; + target = F9A1BF709B7BA4C24A83664EB1E1C7D4 /* IQKeyboardCore */; + targetProxy = 4ED0FC63512556305238B4F8A655BFC3 /* PBXContainerItemProxy */; + }; + 614D0A5D7D98B5CDE713F04E02E64808 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "AMapFoundation-NO-IDFA"; + target = 9B182CB4E1716E9070813D3C59736001 /* AMapFoundation-NO-IDFA */; + targetProxy = BCC15AB291C526956A6ADA2EB049BB6C /* PBXContainerItemProxy */; + }; + 61FE1EBA36961430C6DEFBA5FE675CD8 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "IQTextView-IQTextView"; + target = A6602BCAA6F4F932A586C41D0B7E019C /* IQTextView-IQTextView */; + targetProxy = 11F6CAD234D50E3B19009ACDB7B04828 /* PBXContainerItemProxy */; + }; + 81BCD7E13A85F41028F3EE2E93DCCC41 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = IQTextInputViewNotification; + target = 283C1F2EA88CD4413165801A6748A48E /* IQTextInputViewNotification */; + targetProxy = CEBE80C066C9BF2161D89833D0CC119A /* PBXContainerItemProxy */; + }; + 99F78666F5CCF0DCA18E46B956425D11 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = IQKeyboardNotification; + target = A26E6FD851C20D652B2755C1464A9990 /* IQKeyboardNotification */; + targetProxy = 072E4E27975479BDD58563BEB3D24683 /* PBXContainerItemProxy */; + }; + 9ECD54016970787AC7070A20A812C0A7 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "AMapLocation-NO-IDFA"; + target = 4BD4E22D3419D68A85BDD6119CB37C6C /* AMapLocation-NO-IDFA */; + targetProxy = B1369EF2BD3C2C080B0E2339B47E2F81 /* PBXContainerItemProxy */; + }; + AB5A25CF018931839DC4BDD8289B35ED /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = IQKeyboardToolbar; + target = F4FE17428FD0E607723A44F17231B7A1 /* IQKeyboardToolbar */; + targetProxy = 49BBC9B14F79A04BA8DD9B0BB90A9B9C /* PBXContainerItemProxy */; + }; + ABF9B92C6B3B3E5D2B202752DB24B229 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "IQKeyboardReturnManager-IQKeyboardReturnManager"; + target = 88810798DA63A2F6611B0970EA276DEC /* IQKeyboardReturnManager-IQKeyboardReturnManager */; + targetProxy = 3466093273143BEB58E4CBBC579B64F6 /* PBXContainerItemProxy */; + }; + B19AE932F30C91EC3BF4540887BFBAB0 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = IQKeyboardReturnManager; + target = 0981F89DB5DA3FFCFFEBDE1F56287054 /* IQKeyboardReturnManager */; + targetProxy = 64DDDAE98CDB07AA875EF2F8785EDD43 /* PBXContainerItemProxy */; + }; + B2A28CD787E9C7550186DF91899269D0 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = IQTextInputViewNotification; + target = 283C1F2EA88CD4413165801A6748A48E /* IQTextInputViewNotification */; + targetProxy = E9B4E5C8009A9E93DFFE3687E7A7C298 /* PBXContainerItemProxy */; + }; + B46F7B9127B65649076D1E1768F7BAA9 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "Pods-suixinkan"; + target = 1DE17B7C77CD95CB67DF1197965B76AB /* Pods-suixinkan */; + targetProxy = A68BA12EA1172EA196C307EFD226E3FA /* PBXContainerItemProxy */; + }; + BB45BC2D0701986251CEE255D93BB852 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "IQKeyboardManagerSwift-IQKeyboardManagerSwift"; + target = 982A68D37F5DCBC1FC1FDC0BB2F0EB8E /* IQKeyboardManagerSwift-IQKeyboardManagerSwift */; + targetProxy = 80C7A425A8BEDEEB907E1C0D59EE09CF /* PBXContainerItemProxy */; + }; + C298DE3E27FDEE5214D0C0A8D7675592 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = IQTextView; + target = 12890DE3ABBC2CA295E108358D85EE69 /* IQTextView */; + targetProxy = 6B5EB24E9DAD48FA4C5EA18A140601A6 /* PBXContainerItemProxy */; + }; + C2AF20535E16E51D3D31CF850D223AE4 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = IQKeyboardToolbar; + target = F4FE17428FD0E607723A44F17231B7A1 /* IQKeyboardToolbar */; + targetProxy = D9CD489745F094398AC7EE56A075E972 /* PBXContainerItemProxy */; + }; + CF12C45973B67DCE4BA1A1BFE9D01B16 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = IQKeyboardCore; + target = F9A1BF709B7BA4C24A83664EB1E1C7D4 /* IQKeyboardCore */; + targetProxy = B93EAD193D88C9A60662E10DBCFCEA88 /* PBXContainerItemProxy */; + }; + CF356CCD553A10E2BD3E04C6849A91B1 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = UMCommon; target = 09FABB7D06BB8D3958515FB15B4E7971 /* UMCommon */; - targetProxy = 21C4E3AF810B766F005A0D66D3AB059F /* PBXContainerItemProxy */; + targetProxy = 5CE52FF97D512708CA7A47A2B3D62E76 /* PBXContainerItemProxy */; + }; + D479FCE32A53C8D1560C1DC682887585 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = UMCommon; + target = 09FABB7D06BB8D3958515FB15B4E7971 /* UMCommon */; + targetProxy = 4B1EBB18B5B15E617B246B4FF5DAF0BC /* PBXContainerItemProxy */; + }; + D5FDDB8944CE089D7E48316F7D5132F6 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "WechatOpenSDK-XCFramework"; + target = 7F18C31A804695333763EEC303E265D7 /* WechatOpenSDK-XCFramework */; + targetProxy = DFC2204E567402299825907959EB082C /* PBXContainerItemProxy */; + }; + E4307F5E687227DD0025466424F6F929 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = IQKeyboardReturnManager; + target = 0981F89DB5DA3FFCFFEBDE1F56287054 /* IQKeyboardReturnManager */; + targetProxy = DD14992E69F497F71BA00CD9DD122987 /* PBXContainerItemProxy */; + }; + E9201A9ED89377B19B83D2CE0BE9E06E /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "IQKeyboardCore-IQKeyboardCore"; + target = EEE261386011CDF271BE289F73FF5959 /* IQKeyboardCore-IQKeyboardCore */; + targetProxy = 88A05DB4A06DCD769D9535B118AA4542 /* PBXContainerItemProxy */; + }; + EF792F8F077B3DD044CE5CE270FEF472 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = IQTextInputViewNotification; + target = 283C1F2EA88CD4413165801A6748A48E /* IQTextInputViewNotification */; + targetProxy = 96B3FE193BFA13D2A4F33193086413A0 /* PBXContainerItemProxy */; + }; + EFD4EFE6FD52288812EE28A45E4AF5D9 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "AMapFoundation-NO-IDFA"; + target = 9B182CB4E1716E9070813D3C59736001 /* AMapFoundation-NO-IDFA */; + targetProxy = 852A1D21D2CE860CC83410BBFD84880C /* PBXContainerItemProxy */; + }; + F01A055C2F90B8EE80644CEF058F8066 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = IQKeyboardToolbar; + target = F4FE17428FD0E607723A44F17231B7A1 /* IQKeyboardToolbar */; + targetProxy = 0D2EB4A67CE62F8166C4AEE9F28A2794 /* PBXContainerItemProxy */; + }; + FA34A11251951FBED3032D1E332C4075 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "IQKeyboardNotification-IQKeyboardNotification"; + target = 2B8FF445A5162845FAB9EC00FC92B694 /* IQKeyboardNotification-IQKeyboardNotification */; + targetProxy = 2FE8AB43E3CB0161C772ED070487B9E4 /* PBXContainerItemProxy */; + }; + FB86DD25156516C16E8DB9CB80AFAEA0 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "IQKeyboardToolbarManager-IQKeyboardToolbarManager"; + target = 7C5613175BBC4BF67E36DB4FBEBC01D0 /* IQKeyboardToolbarManager-IQKeyboardToolbarManager */; + targetProxy = 1FFB29A77F93BDAC1566FEC554B6C293 /* PBXContainerItemProxy */; + }; + FEA026F72BEC2A47E8AFFE44EC19E38C /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = IQKeyboardCore; + target = F9A1BF709B7BA4C24A83664EB1E1C7D4 /* IQKeyboardCore */; + targetProxy = BD04367E23147103AA5A3FD785ABF923 /* PBXContainerItemProxy */; + }; + FF029834E5B5CE9CEA6604E3851A3F7F /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = IQKeyboardManagerSwift; + target = B490E7485944099E16C9CBD79119D1D4 /* IQKeyboardManagerSwift */; + targetProxy = C42BE70475DBB73A4D64287452A8476B /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ 0606EC124017CF52B54FEB3096BC7E75 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 3CE7B2EE0FE95BBD834825FA4D0571C5 /* Pods-suixinkanTests.debug.xcconfig */; + baseConfigurationReference = CF9B73BD5A7EF49C515CE054315DBC4E /* Pods-suixinkanTests.debug.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; CLANG_ENABLE_OBJC_WEAK = NO; @@ -1142,11 +3016,10 @@ }; name = Debug; }; - 0BCAF1F8602AC6A8045A87C66CB12623 /* Debug */ = { + 13787BFD30D1D0E6AEEB4A9803E18282 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 61B7C8006610229F8A3485704A3944CF /* Pods-suixinkan.debug.xcconfig */; + baseConfigurationReference = 11E57560E05A7E18A4833A108BBF77A7 /* IQKeyboardReturnManager.debug.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; CLANG_ENABLE_OBJC_WEAK = NO; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -1157,8 +3030,9 @@ DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_MODULE_VERIFIER = NO; - ENABLE_USER_SCRIPT_SANDBOXING = NO; - INFOPLIST_FILE = "Target Support Files/Pods-suixinkan/Pods-suixinkan-Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/IQKeyboardReturnManager/IQKeyboardReturnManager-prefix.pch"; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = "Target Support Files/IQKeyboardReturnManager/IQKeyboardReturnManager-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 16.0; LD_RUNPATH_SEARCH_PATHS = ( @@ -1166,41 +3040,61 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-suixinkan/Pods-suixinkan.modulemap"; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + MODULEMAP_FILE = "Target Support Files/IQKeyboardReturnManager/IQKeyboardReturnManager.modulemap"; + PRODUCT_MODULE_NAME = IQKeyboardReturnManager; + PRODUCT_NAME = IQKeyboardReturnManager; SDKROOT = iphoneos; SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_INSTALL_OBJC_HEADER = YES; + SWIFT_VERSION = 5.9; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; name = Debug; }; - 1896DE7FDF20E26D5F5B8876A51159FD /* Debug */ = { + 14186EA163D269814F35A04942635AF0 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = D738B4EADCCC0969B2C74EDD60C54C5F /* UMAPM.debug.xcconfig */; + baseConfigurationReference = 56B3624858B660D9DDBBEB280A080869 /* IQTextInputViewNotification.debug.xcconfig */; buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - ENABLE_USER_SCRIPT_SANDBOXING = NO; + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; + GCC_PREFIX_HEADER = "Target Support Files/IQTextInputViewNotification/IQTextInputViewNotification-prefix.pch"; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = "Target Support Files/IQTextInputViewNotification/IQTextInputViewNotification-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 16.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", + "@loader_path/Frameworks", ); + MODULEMAP_FILE = "Target Support Files/IQTextInputViewNotification/IQTextInputViewNotification.modulemap"; + PRODUCT_MODULE_NAME = IQTextInputViewNotification; + PRODUCT_NAME = IQTextInputViewNotification; SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_INSTALL_OBJC_HEADER = YES; + SWIFT_VERSION = 5.9; TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; }; name = Debug; }; - 238D81937753E4FF6C917AC763D81E11 /* Release */ = { + 179F8CB94915DBCD14F54A0607C9A2E2 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B1DCEAC5E67DFFADA00E8D6182638950 /* UMCommon.release.xcconfig */; + baseConfigurationReference = 14A1F49D0B3C6F4A06FE802DFE3C86A5 /* UMDevice.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -1216,9 +3110,9 @@ }; name = Release; }; - 27D4292B09C0A48EBA7BA9E64B9FB2A0 /* Debug */ = { + 1896DE7FDF20E26D5F5B8876A51159FD /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 7FA9E9DE9F0DB76774F19BF713363C1C /* UMDevice.debug.xcconfig */; + baseConfigurationReference = 530DCF2469E6370042646A66DA07F65B /* UMAPM.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -1233,6 +3127,79 @@ }; name = Debug; }; + 1EB11C22BE0EA9438D594256839A0EC6 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 3E3AD3EE750AEF229F3095AB516C9100 /* AMapFoundation-NO-IDFA.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 1EBEF86C0428D72A7DD1AA14913DEF1A /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = E6331A013B3E21E1E47C71660B6B2455 /* IQTextInputViewNotification.release.xcconfig */; + buildSettings = { + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; + GCC_PREFIX_HEADER = "Target Support Files/IQTextInputViewNotification/IQTextInputViewNotification-prefix.pch"; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = "Target Support Files/IQTextInputViewNotification/IQTextInputViewNotification-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/IQTextInputViewNotification/IQTextInputViewNotification.modulemap"; + PRODUCT_MODULE_NAME = IQTextInputViewNotification; + PRODUCT_NAME = IQTextInputViewNotification; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_INSTALL_OBJC_HEADER = YES; + SWIFT_VERSION = 5.9; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 217DEB1A9E02B5DEBA98608EDF57F427 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 93FDE424FD40693C3039FAD46BC403D0 /* IQKeyboardReturnManager.release.xcconfig */; + buildSettings = { + CODE_SIGNING_ALLOWED = NO; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/IQKeyboardReturnManager"; + IBSC_MODULE = IQKeyboardReturnManager; + INFOPLIST_FILE = "Target Support Files/IQKeyboardReturnManager/ResourceBundle-IQKeyboardReturnManager-IQKeyboardReturnManager-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + PRODUCT_NAME = IQKeyboardReturnManager; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = bundle; + }; + name = Release; + }; 30E0B9EFD9A5C45D0D351231E81B30B3 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { @@ -1295,99 +3262,10 @@ }; name = Release; }; - 344DE8D74E5226AF919F633EE4D55104 /* Debug */ = { + 320E6AB386A42EB3A6AEBCB1958DD04C /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = DED06228F2ED3100A01944BF056F3316 /* AMapFoundation-NO-IDFA.debug.xcconfig */; + baseConfigurationReference = 36D395D9E056DE9587ED95754452991E /* IQKeyboardManagerSwift.debug.xcconfig */; buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - ENABLE_USER_SCRIPT_SANDBOXING = NO; - IPHONEOS_DEPLOYMENT_TARGET = 16.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 37EB5EC7458274F33279CFB41B6EF232 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = A544FE588B3DA9A5527AB2104C1E3F6E /* UMDevice.release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - ENABLE_USER_SCRIPT_SANDBOXING = NO; - IPHONEOS_DEPLOYMENT_TARGET = 16.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 4211ACC895D2325D62E504C88FDE52F4 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 2B1E1B290F1753A341C14CED0A6F3F4D /* UMAPM.release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - ENABLE_USER_SCRIPT_SANDBOXING = NO; - IPHONEOS_DEPLOYMENT_TARGET = 16.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 49EBBE60492138920A951F8BD7CD4013 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = BBA147F6EAE0D76BC35E87FCF69C9C2D /* AMap3DMap-NO-IDFA.release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - ENABLE_USER_SCRIPT_SANDBOXING = NO; - IPHONEOS_DEPLOYMENT_TARGET = 16.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 535F4FAD82A3C67D930C230498439B31 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 8A2882BF8F5DC25616C1ED02D8BADE8B /* AMapSearch-NO-IDFA.debug.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - ENABLE_USER_SCRIPT_SANDBOXING = NO; - IPHONEOS_DEPLOYMENT_TARGET = 16.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 59C25D381C381A4E53F13543611D1E41 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = A1C2AE0D141F894C0C841BDB91EA7784 /* Pods-suixinkanTests.release.xcconfig */; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; CLANG_ENABLE_OBJC_WEAK = NO; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -1398,8 +3276,9 @@ DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_MODULE_VERIFIER = NO; - ENABLE_USER_SCRIPT_SANDBOXING = NO; - INFOPLIST_FILE = "Target Support Files/Pods-suixinkanTests/Pods-suixinkanTests-Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/IQKeyboardManagerSwift/IQKeyboardManagerSwift-prefix.pch"; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = "Target Support Files/IQKeyboardManagerSwift/IQKeyboardManagerSwift-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 16.0; LD_RUNPATH_SEARCH_PATHS = ( @@ -1407,15 +3286,52 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-suixinkanTests/Pods-suixinkanTests.modulemap"; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + MODULEMAP_FILE = "Target Support Files/IQKeyboardManagerSwift/IQKeyboardManagerSwift.modulemap"; + PRODUCT_MODULE_NAME = IQKeyboardManagerSwift; + PRODUCT_NAME = IQKeyboardManagerSwift; SDKROOT = iphoneos; SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_INSTALL_OBJC_HEADER = YES; + SWIFT_VERSION = 5.9; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 39FEA6E129AEF8E6B57327F300DE025A /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = D3C10F06C1B3364A705DEDC7CE316FFA /* IQKeyboardCore.release.xcconfig */; + buildSettings = { + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; + GCC_PREFIX_HEADER = "Target Support Files/IQKeyboardCore/IQKeyboardCore-prefix.pch"; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = "Target Support Files/IQKeyboardCore/IQKeyboardCore-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/IQKeyboardCore/IQKeyboardCore.modulemap"; + PRODUCT_MODULE_NAME = IQKeyboardCore; + PRODUCT_NAME = IQKeyboardCore; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_INSTALL_OBJC_HEADER = YES; + SWIFT_VERSION = 5.9; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; @@ -1423,26 +3339,9 @@ }; name = Release; }; - 67242DEBED91BA1150976B291F8587A1 /* Debug */ = { + 4211ACC895D2325D62E504C88FDE52F4 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = A36042A49C0F8540D18B799FFE9BAF4F /* UMCommon.debug.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - ENABLE_USER_SCRIPT_SANDBOXING = NO; - IPHONEOS_DEPLOYMENT_TARGET = 16.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 6E2DE0211827AD4360DBA1170B0EA537 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = CCEB62137B691B96014FCE7C2963DE89 /* AMapFoundation-NO-IDFA.release.xcconfig */; + baseConfigurationReference = AEF4F9351FE5B148A0234F5931DE6880 /* UMAPM.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -1458,13 +3357,51 @@ }; name = Release; }; - 7082C84E9F4F3C5661F4397D14D70B1D /* Release */ = { + 47E218F3444FD4FC882DB9137DFFAFA4 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 505E9C4F754A74BBF0BF433A1ABAB2D3 /* WechatOpenSDK-XCFramework.release.xcconfig */; + baseConfigurationReference = 56EBDABD8EC0E4FF033038CB98DC0DD8 /* IQTextView.release.xcconfig */; buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; + GCC_PREFIX_HEADER = "Target Support Files/IQTextView/IQTextView-prefix.pch"; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = "Target Support Files/IQTextView/IQTextView-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/IQTextView/IQTextView.modulemap"; + PRODUCT_MODULE_NAME = IQTextView; + PRODUCT_NAME = IQTextView; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_INSTALL_OBJC_HEADER = YES; + SWIFT_VERSION = 5.9; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 49EBBE60492138920A951F8BD7CD4013 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 103108AC7A027FAA9D881105F432DFED /* AMap3DMap-NO-IDFA.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; ENABLE_USER_SCRIPT_SANDBOXING = NO; IPHONEOS_DEPLOYMENT_TARGET = 16.0; LD_RUNPATH_SEARCH_PATHS = ( @@ -1477,9 +3414,9 @@ }; name = Release; }; - 750746DE9BF3773A59287F9A50E97153 /* Release */ = { + 4E4BAA4FCA3B4496402B2BC789DB87D9 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 2D9188A08F7F86FBF3EBB3CD93699D53 /* Pods-suixinkan.release.xcconfig */; + baseConfigurationReference = 081A933139371B97D5ABFD37B065516E /* Pods-suixinkan.release.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; CLANG_ENABLE_OBJC_WEAK = NO; @@ -1517,9 +3454,48 @@ }; name = Release; }; - A5889394557E95B280BBA784CBC27862 /* Debug */ = { + 5226EF635C7080C4E520EA3C532C6D7F /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B97A4D37BDFE1DD115297273C4F4AAA7 /* AMapLocation-NO-IDFA.debug.xcconfig */; + baseConfigurationReference = A92E1DCC03BC5DAD5064EB3DBD227D12 /* IQKeyboardToolbar.release.xcconfig */; + buildSettings = { + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; + GCC_PREFIX_HEADER = "Target Support Files/IQKeyboardToolbar/IQKeyboardToolbar-prefix.pch"; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = "Target Support Files/IQKeyboardToolbar/IQKeyboardToolbar-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/IQKeyboardToolbar/IQKeyboardToolbar.modulemap"; + PRODUCT_MODULE_NAME = IQKeyboardToolbar; + PRODUCT_NAME = IQKeyboardToolbar; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_INSTALL_OBJC_HEADER = YES; + SWIFT_VERSION = 5.9; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 535F4FAD82A3C67D930C230498439B31 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 2BB0CDECDB237E2314A53B64D3B8695F /* AMapSearch-NO-IDFA.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -1534,9 +3510,402 @@ }; name = Debug; }; + 59C25D381C381A4E53F13543611D1E41 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 38B439905141423BD2DADBBD5EFC72DE /* Pods-suixinkanTests.release.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + INFOPLIST_FILE = "Target Support Files/Pods-suixinkanTests/Pods-suixinkanTests-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-suixinkanTests/Pods-suixinkanTests.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 5F80B619FE770C8758FE91DA44F96A04 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 99252666C73C321ECC501FF47D66FA88 /* IQKeyboardManagerSwift.release.xcconfig */; + buildSettings = { + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; + GCC_PREFIX_HEADER = "Target Support Files/IQKeyboardManagerSwift/IQKeyboardManagerSwift-prefix.pch"; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = "Target Support Files/IQKeyboardManagerSwift/IQKeyboardManagerSwift-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/IQKeyboardManagerSwift/IQKeyboardManagerSwift.modulemap"; + PRODUCT_MODULE_NAME = IQKeyboardManagerSwift; + PRODUCT_NAME = IQKeyboardManagerSwift; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_INSTALL_OBJC_HEADER = YES; + SWIFT_VERSION = 5.9; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 6842DBB3371C60E90228D3554B879635 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = D3C10F06C1B3364A705DEDC7CE316FFA /* IQKeyboardCore.release.xcconfig */; + buildSettings = { + CODE_SIGNING_ALLOWED = NO; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/IQKeyboardCore"; + IBSC_MODULE = IQKeyboardCore; + INFOPLIST_FILE = "Target Support Files/IQKeyboardCore/ResourceBundle-IQKeyboardCore-IQKeyboardCore-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + PRODUCT_NAME = IQKeyboardCore; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = bundle; + }; + name = Release; + }; + 6FB5021FCB40B21C0A3B5860335D1609 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 115539E22DDDBEAA2759FD2CEE701673 /* IQKeyboardToolbarManager.release.xcconfig */; + buildSettings = { + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; + GCC_PREFIX_HEADER = "Target Support Files/IQKeyboardToolbarManager/IQKeyboardToolbarManager-prefix.pch"; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = "Target Support Files/IQKeyboardToolbarManager/IQKeyboardToolbarManager-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/IQKeyboardToolbarManager/IQKeyboardToolbarManager.modulemap"; + PRODUCT_MODULE_NAME = IQKeyboardToolbarManager; + PRODUCT_NAME = IQKeyboardToolbarManager; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_INSTALL_OBJC_HEADER = YES; + SWIFT_VERSION = 5.9; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 6FDB13D98FC7AC1DE844FE603293B93D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 754436F7705D79991C66788AEA045C77 /* IQKeyboardToolbar.debug.xcconfig */; + buildSettings = { + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; + GCC_PREFIX_HEADER = "Target Support Files/IQKeyboardToolbar/IQKeyboardToolbar-prefix.pch"; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = "Target Support Files/IQKeyboardToolbar/IQKeyboardToolbar-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/IQKeyboardToolbar/IQKeyboardToolbar.modulemap"; + PRODUCT_MODULE_NAME = IQKeyboardToolbar; + PRODUCT_NAME = IQKeyboardToolbar; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_INSTALL_OBJC_HEADER = YES; + SWIFT_VERSION = 5.9; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 7082C84E9F4F3C5661F4397D14D70B1D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 130EEB4090B9AF897D37B6DE8A064E66 /* WechatOpenSDK-XCFramework.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CLANG_ENABLE_OBJC_WEAK = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 7679456F4F3F0E01341F0903C1D64A2B /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = B3A9B2740ED243A88FDF2D9AE77E9392 /* Pods-suixinkan.debug.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + INFOPLIST_FILE = "Target Support Files/Pods-suixinkan/Pods-suixinkan-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-suixinkan/Pods-suixinkan.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 76DC530285C261D8796C0F053596CEBC /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = A4F5C6DCF130F9E43D080DCCD27C8F64 /* IQKeyboardNotification.release.xcconfig */; + buildSettings = { + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; + GCC_PREFIX_HEADER = "Target Support Files/IQKeyboardNotification/IQKeyboardNotification-prefix.pch"; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = "Target Support Files/IQKeyboardNotification/IQKeyboardNotification-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/IQKeyboardNotification/IQKeyboardNotification.modulemap"; + PRODUCT_MODULE_NAME = IQKeyboardNotification; + PRODUCT_NAME = IQKeyboardNotification; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_INSTALL_OBJC_HEADER = YES; + SWIFT_VERSION = 5.9; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 915789DDAAF18031FE26D51A9A069E47 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = A92E1DCC03BC5DAD5064EB3DBD227D12 /* IQKeyboardToolbar.release.xcconfig */; + buildSettings = { + CODE_SIGNING_ALLOWED = NO; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/IQKeyboardToolbar"; + IBSC_MODULE = IQKeyboardToolbar; + INFOPLIST_FILE = "Target Support Files/IQKeyboardToolbar/ResourceBundle-IQKeyboardToolbar-IQKeyboardToolbar-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + PRODUCT_NAME = IQKeyboardToolbar; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = bundle; + }; + name = Release; + }; + 929F4EB89E11DBFF9F5C7B3CCDE55735 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 56B3624858B660D9DDBBEB280A080869 /* IQTextInputViewNotification.debug.xcconfig */; + buildSettings = { + CODE_SIGNING_ALLOWED = NO; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/IQTextInputViewNotification"; + IBSC_MODULE = IQTextInputViewNotification; + INFOPLIST_FILE = "Target Support Files/IQTextInputViewNotification/ResourceBundle-IQTextInputViewNotification-IQTextInputViewNotification-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + PRODUCT_NAME = IQTextInputViewNotification; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = bundle; + }; + name = Debug; + }; + 94D513F2AC859672A49F414A115FF97E /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 45AED264113ACD57ECAF26F0F85FFB62 /* IQTextView.debug.xcconfig */; + buildSettings = { + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; + GCC_PREFIX_HEADER = "Target Support Files/IQTextView/IQTextView-prefix.pch"; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = "Target Support Files/IQTextView/IQTextView-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/IQTextView/IQTextView.modulemap"; + PRODUCT_MODULE_NAME = IQTextView; + PRODUCT_NAME = IQTextView; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_INSTALL_OBJC_HEADER = YES; + SWIFT_VERSION = 5.9; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 9C507EE5EEBD2ACD845BA61CC5305BF0 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 30A8A01383C393C5CB8F8FC240A24C39 /* IQKeyboardNotification.debug.xcconfig */; + buildSettings = { + CODE_SIGNING_ALLOWED = NO; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/IQKeyboardNotification"; + IBSC_MODULE = IQKeyboardNotification; + INFOPLIST_FILE = "Target Support Files/IQKeyboardNotification/ResourceBundle-IQKeyboardNotification-IQKeyboardNotification-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + PRODUCT_NAME = IQKeyboardNotification; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = bundle; + }; + name = Debug; + }; + A5889394557E95B280BBA784CBC27862 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = FB67DEAA461320EAF30858AB02394A00 /* AMapLocation-NO-IDFA.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + A6DA467465F855950B3F59F89EBD2DF6 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 3CFBB99CC351EABA5DE1217CF1B40C3E /* IQKeyboardCore.debug.xcconfig */; + buildSettings = { + CODE_SIGNING_ALLOWED = NO; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/IQKeyboardCore"; + IBSC_MODULE = IQKeyboardCore; + INFOPLIST_FILE = "Target Support Files/IQKeyboardCore/ResourceBundle-IQKeyboardCore-IQKeyboardCore-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + PRODUCT_NAME = IQKeyboardCore; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = bundle; + }; + name = Debug; + }; A8894230A204E1888695F3677A130967 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 93364FC6486AA57E263ACEAB802CA297 /* WechatOpenSDK-XCFramework.debug.xcconfig */; + baseConfigurationReference = 155001DC0189CD12099F5DA44FFC98CB /* WechatOpenSDK-XCFramework.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -1552,9 +3921,98 @@ }; name = Debug; }; + B7466AF4B11E52A5B2E89BD96174704E /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 115539E22DDDBEAA2759FD2CEE701673 /* IQKeyboardToolbarManager.release.xcconfig */; + buildSettings = { + CODE_SIGNING_ALLOWED = NO; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/IQKeyboardToolbarManager"; + IBSC_MODULE = IQKeyboardToolbarManager; + INFOPLIST_FILE = "Target Support Files/IQKeyboardToolbarManager/ResourceBundle-IQKeyboardToolbarManager-IQKeyboardToolbarManager-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + PRODUCT_NAME = IQKeyboardToolbarManager; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = bundle; + }; + name = Release; + }; + BA18725FEB88510E94F592B8594E2508 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 45AED264113ACD57ECAF26F0F85FFB62 /* IQTextView.debug.xcconfig */; + buildSettings = { + CODE_SIGNING_ALLOWED = NO; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/IQTextView"; + IBSC_MODULE = IQTextView; + INFOPLIST_FILE = "Target Support Files/IQTextView/ResourceBundle-IQTextView-IQTextView-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + PRODUCT_NAME = IQTextView; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = bundle; + }; + name = Debug; + }; + BFF73E25B3FE43E16F9677392D14F5B8 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = EB9605D36291EF1F46BB4C697286ABCC /* IQKeyboardToolbarManager.debug.xcconfig */; + buildSettings = { + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; + GCC_PREFIX_HEADER = "Target Support Files/IQKeyboardToolbarManager/IQKeyboardToolbarManager-prefix.pch"; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = "Target Support Files/IQKeyboardToolbarManager/IQKeyboardToolbarManager-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/IQKeyboardToolbarManager/IQKeyboardToolbarManager.modulemap"; + PRODUCT_MODULE_NAME = IQKeyboardToolbarManager; + PRODUCT_NAME = IQKeyboardToolbarManager; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_INSTALL_OBJC_HEADER = YES; + SWIFT_VERSION = 5.9; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + CA28C3F0D5D8F443AB021AEFDE52B961 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = BC19393AED11092453E09C8483EF87E8 /* UMCommon.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; CA5F2D3465D7CF173F604FC5D9E07ED5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 3D27E75D0D982BBB14DF16A6604AF8CD /* AMapSearch-NO-IDFA.release.xcconfig */; + baseConfigurationReference = FEB025BC24D3D782961E682E32501DBC /* AMapSearch-NO-IDFA.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -1570,9 +4028,134 @@ }; name = Release; }; + CC1F8FA68402D02B36D3F9D3560CA16E /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 93FDE424FD40693C3039FAD46BC403D0 /* IQKeyboardReturnManager.release.xcconfig */; + buildSettings = { + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; + GCC_PREFIX_HEADER = "Target Support Files/IQKeyboardReturnManager/IQKeyboardReturnManager-prefix.pch"; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = "Target Support Files/IQKeyboardReturnManager/IQKeyboardReturnManager-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/IQKeyboardReturnManager/IQKeyboardReturnManager.modulemap"; + PRODUCT_MODULE_NAME = IQKeyboardReturnManager; + PRODUCT_NAME = IQKeyboardReturnManager; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_INSTALL_OBJC_HEADER = YES; + SWIFT_VERSION = 5.9; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + CC35FB5CB48213AED5CC603DA1BAFDD5 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 36D395D9E056DE9587ED95754452991E /* IQKeyboardManagerSwift.debug.xcconfig */; + buildSettings = { + CODE_SIGNING_ALLOWED = NO; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/IQKeyboardManagerSwift"; + IBSC_MODULE = IQKeyboardManagerSwift; + INFOPLIST_FILE = "Target Support Files/IQKeyboardManagerSwift/ResourceBundle-IQKeyboardManagerSwift-IQKeyboardManagerSwift-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + PRODUCT_NAME = IQKeyboardManagerSwift; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = bundle; + }; + name = Debug; + }; + D4BF72183DD4D9F4AE09896220600665 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 56EBDABD8EC0E4FF033038CB98DC0DD8 /* IQTextView.release.xcconfig */; + buildSettings = { + CODE_SIGNING_ALLOWED = NO; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/IQTextView"; + IBSC_MODULE = IQTextView; + INFOPLIST_FILE = "Target Support Files/IQTextView/ResourceBundle-IQTextView-IQTextView-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + PRODUCT_NAME = IQTextView; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = bundle; + }; + name = Release; + }; D80C09B5C3E12110BB1B81C6C2F5466A /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = FA44E234FE67D2FC43874714AB8D64CE /* AMapLocation-NO-IDFA.release.xcconfig */; + baseConfigurationReference = DBAE89D8B5BD6A232B2C07F2A94C0743 /* AMapLocation-NO-IDFA.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + D981E95A4B807876274C652DF6B519C7 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 821CFE722ABC9FDF53472054DEED7118 /* UMDevice.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + DC1524E223ABCDE55EBAFA5DBFDF7A19 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = E6331A013B3E21E1E47C71660B6B2455 /* IQTextInputViewNotification.release.xcconfig */; + buildSettings = { + CODE_SIGNING_ALLOWED = NO; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/IQTextInputViewNotification"; + IBSC_MODULE = IQTextInputViewNotification; + INFOPLIST_FILE = "Target Support Files/IQTextInputViewNotification/ResourceBundle-IQTextInputViewNotification-IQTextInputViewNotification-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + PRODUCT_NAME = IQTextInputViewNotification; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = bundle; + }; + name = Release; + }; + DC7A740D30681C593DB29563306F29AC /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9BC7FD73096F0E682B997CB07C344AC1 /* AMapFoundation-NO-IDFA.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -1590,7 +4173,7 @@ }; DD7C8FFCC688D270EB22589A35ABBC73 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 125064997C0EDA842FA880F67BB3D06F /* AMap3DMap-NO-IDFA.debug.xcconfig */; + baseConfigurationReference = 2D1CB2C6953200669BA5206342981582 /* AMap3DMap-NO-IDFA.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -1605,6 +4188,130 @@ }; name = Debug; }; + DEB39EDBACC2813F7B832DC04E6BC3F1 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 30A8A01383C393C5CB8F8FC240A24C39 /* IQKeyboardNotification.debug.xcconfig */; + buildSettings = { + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; + GCC_PREFIX_HEADER = "Target Support Files/IQKeyboardNotification/IQKeyboardNotification-prefix.pch"; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = "Target Support Files/IQKeyboardNotification/IQKeyboardNotification-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/IQKeyboardNotification/IQKeyboardNotification.modulemap"; + PRODUCT_MODULE_NAME = IQKeyboardNotification; + PRODUCT_NAME = IQKeyboardNotification; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_INSTALL_OBJC_HEADER = YES; + SWIFT_VERSION = 5.9; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + E30C95C4A403F88BA4C0368E1294ADA4 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 11E57560E05A7E18A4833A108BBF77A7 /* IQKeyboardReturnManager.debug.xcconfig */; + buildSettings = { + CODE_SIGNING_ALLOWED = NO; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/IQKeyboardReturnManager"; + IBSC_MODULE = IQKeyboardReturnManager; + INFOPLIST_FILE = "Target Support Files/IQKeyboardReturnManager/ResourceBundle-IQKeyboardReturnManager-IQKeyboardReturnManager-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + PRODUCT_NAME = IQKeyboardReturnManager; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = bundle; + }; + name = Debug; + }; + EADE9E5E19348252045E7D72A340C1C3 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = A4F5C6DCF130F9E43D080DCCD27C8F64 /* IQKeyboardNotification.release.xcconfig */; + buildSettings = { + CODE_SIGNING_ALLOWED = NO; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/IQKeyboardNotification"; + IBSC_MODULE = IQKeyboardNotification; + INFOPLIST_FILE = "Target Support Files/IQKeyboardNotification/ResourceBundle-IQKeyboardNotification-IQKeyboardNotification-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + PRODUCT_NAME = IQKeyboardNotification; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = bundle; + }; + name = Release; + }; + EF6D14ECC1CB0A8614BA45F26A2F93BE /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 99252666C73C321ECC501FF47D66FA88 /* IQKeyboardManagerSwift.release.xcconfig */; + buildSettings = { + CODE_SIGNING_ALLOWED = NO; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/IQKeyboardManagerSwift"; + IBSC_MODULE = IQKeyboardManagerSwift; + INFOPLIST_FILE = "Target Support Files/IQKeyboardManagerSwift/ResourceBundle-IQKeyboardManagerSwift-IQKeyboardManagerSwift-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + PRODUCT_NAME = IQKeyboardManagerSwift; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = bundle; + }; + name = Release; + }; + F2AC8A64F662242C44D078D2B56F7890 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = E29E0B8D2C7E2C5C20F9676EB54B2910 /* UMCommon.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + F2EB0953E468D8733111E6AFC012C0DF /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 754436F7705D79991C66788AEA045C77 /* IQKeyboardToolbar.debug.xcconfig */; + buildSettings = { + CODE_SIGNING_ALLOWED = NO; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/IQKeyboardToolbar"; + IBSC_MODULE = IQKeyboardToolbar; + INFOPLIST_FILE = "Target Support Files/IQKeyboardToolbar/ResourceBundle-IQKeyboardToolbar-IQKeyboardToolbar-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + PRODUCT_NAME = IQKeyboardToolbar; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = bundle; + }; + name = Debug; + }; F4FF6A0D1970CA9705974E3CB2134802 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -1671,9 +4378,118 @@ }; name = Debug; }; + F81ECC274BD61641856A50D07FD9CA42 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = EB9605D36291EF1F46BB4C697286ABCC /* IQKeyboardToolbarManager.debug.xcconfig */; + buildSettings = { + CODE_SIGNING_ALLOWED = NO; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/IQKeyboardToolbarManager"; + IBSC_MODULE = IQKeyboardToolbarManager; + INFOPLIST_FILE = "Target Support Files/IQKeyboardToolbarManager/ResourceBundle-IQKeyboardToolbarManager-IQKeyboardToolbarManager-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + PRODUCT_NAME = IQKeyboardToolbarManager; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = bundle; + }; + name = Debug; + }; + FD4D1EB782183AD18FE4C7DDDDE0785C /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 3CFBB99CC351EABA5DE1217CF1B40C3E /* IQKeyboardCore.debug.xcconfig */; + buildSettings = { + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; + GCC_PREFIX_HEADER = "Target Support Files/IQKeyboardCore/IQKeyboardCore-prefix.pch"; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = "Target Support Files/IQKeyboardCore/IQKeyboardCore-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/IQKeyboardCore/IQKeyboardCore.modulemap"; + PRODUCT_MODULE_NAME = IQKeyboardCore; + PRODUCT_NAME = IQKeyboardCore; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_INSTALL_OBJC_HEADER = YES; + SWIFT_VERSION = 5.9; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ + 09A961DE894C0013BADB1F2A948F9CC6 /* Build configuration list for PBXNativeTarget "IQTextView" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 94D513F2AC859672A49F414A115FF97E /* Debug */, + 47E218F3444FD4FC882DB9137DFFAFA4 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 0FEAC1E425E68CB15470BB3984E9D409 /* Build configuration list for PBXNativeTarget "IQTextView-IQTextView" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + BA18725FEB88510E94F592B8594E2508 /* Debug */, + D4BF72183DD4D9F4AE09896220600665 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 3B8D996F70ECB5ABAA0D27F0682F29FC /* Build configuration list for PBXNativeTarget "IQTextInputViewNotification" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 14186EA163D269814F35A04942635AF0 /* Debug */, + 1EBEF86C0428D72A7DD1AA14913DEF1A /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 3C16768E28C01F1BDC49DD706ABF5A67 /* Build configuration list for PBXNativeTarget "IQKeyboardToolbar" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 6FDB13D98FC7AC1DE844FE603293B93D /* Debug */, + 5226EF635C7080C4E520EA3C532C6D7F /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 3E3B87D26AEC563F28EB5043B31C00F8 /* Build configuration list for PBXNativeTarget "IQKeyboardReturnManager-IQKeyboardReturnManager" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + E30C95C4A403F88BA4C0368E1294ADA4 /* Debug */, + 217DEB1A9E02B5DEBA98608EDF57F427 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 479309EC6EE72E40EA04B5DB51BCE182 /* Build configuration list for PBXNativeTarget "Pods-suixinkan" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 7679456F4F3F0E01341F0903C1D64A2B /* Debug */, + 4E4BAA4FCA3B4496402B2BC789DB87D9 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -1683,6 +4499,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + 4A1B7E3CD60374893FA0F1F54CB8AFA9 /* Build configuration list for PBXNativeTarget "IQTextInputViewNotification-IQTextInputViewNotification" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 929F4EB89E11DBFF9F5C7B3CCDE55735 /* Debug */, + DC1524E223ABCDE55EBAFA5DBFDF7A19 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; 4BB6DBB059282CDC5130B3610AC32982 /* Build configuration list for PBXAggregateTarget "AMapLocation-NO-IDFA" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -1692,20 +4517,38 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 4BD363A7955A50B752C0F2EE46DF82FA /* Build configuration list for PBXAggregateTarget "UMCommon" */ = { + 5BF3AE1AD7C057CDE87FF62804308200 /* Build configuration list for PBXNativeTarget "IQKeyboardToolbarManager" */ = { isa = XCConfigurationList; buildConfigurations = ( - 67242DEBED91BA1150976B291F8587A1 /* Debug */, - 238D81937753E4FF6C917AC763D81E11 /* Release */, + BFF73E25B3FE43E16F9677392D14F5B8 /* Debug */, + 6FB5021FCB40B21C0A3B5860335D1609 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 5D641A103C53ABF7AC3FDE4F6A159F62 /* Build configuration list for PBXNativeTarget "Pods-suixinkan" */ = { + 6412B4AF0006867B0CD0DC861955DE47 /* Build configuration list for PBXNativeTarget "IQKeyboardNotification-IQKeyboardNotification" */ = { isa = XCConfigurationList; buildConfigurations = ( - 0BCAF1F8602AC6A8045A87C66CB12623 /* Debug */, - 750746DE9BF3773A59287F9A50E97153 /* Release */, + 9C507EE5EEBD2ACD845BA61CC5305BF0 /* Debug */, + EADE9E5E19348252045E7D72A340C1C3 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 644D892EDFA6381DC82D71DC5C2F8D6F /* Build configuration list for PBXAggregateTarget "UMCommon" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + CA28C3F0D5D8F443AB021AEFDE52B961 /* Debug */, + F2AC8A64F662242C44D078D2B56F7890 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 689FB5F7F35F7669022E8D9965E2938D /* Build configuration list for PBXNativeTarget "IQKeyboardManagerSwift" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 320E6AB386A42EB3A6AEBCB1958DD04C /* Debug */, + 5F80B619FE770C8758FE91DA44F96A04 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -1728,11 +4571,11 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 946C13012BDBDC56DC9D26E19BA9D129 /* Build configuration list for PBXAggregateTarget "AMapFoundation-NO-IDFA" */ = { + 878CD092AEF27E8EED6C6763E470039A /* Build configuration list for PBXNativeTarget "IQKeyboardToolbar-IQKeyboardToolbar" */ = { isa = XCConfigurationList; buildConfigurations = ( - 344DE8D74E5226AF919F633EE4D55104 /* Debug */, - 6E2DE0211827AD4360DBA1170B0EA537 /* Release */, + F2EB0953E468D8733111E6AFC012C0DF /* Debug */, + 915789DDAAF18031FE26D51A9A069E47 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -1764,11 +4607,74 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - B9E2AB2044DB991A9B55D980CEBF2D9A /* Build configuration list for PBXAggregateTarget "UMDevice" */ = { + B2130418C2FAD0A1E2FD872758AD609B /* Build configuration list for PBXNativeTarget "IQKeyboardCore" */ = { isa = XCConfigurationList; buildConfigurations = ( - 27D4292B09C0A48EBA7BA9E64B9FB2A0 /* Debug */, - 37EB5EC7458274F33279CFB41B6EF232 /* Release */, + FD4D1EB782183AD18FE4C7DDDDE0785C /* Debug */, + 39FEA6E129AEF8E6B57327F300DE025A /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + B4B24BD4D38051C4B3F72F56A9E471F1 /* Build configuration list for PBXAggregateTarget "UMDevice" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + D981E95A4B807876274C652DF6B519C7 /* Debug */, + 179F8CB94915DBCD14F54A0607C9A2E2 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + B5C8C509357117AE775409F0B0EB3F56 /* Build configuration list for PBXNativeTarget "IQKeyboardNotification" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + DEB39EDBACC2813F7B832DC04E6BC3F1 /* Debug */, + 76DC530285C261D8796C0F053596CEBC /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + C6C67350850E663003A14D5A7997572B /* Build configuration list for PBXNativeTarget "IQKeyboardManagerSwift-IQKeyboardManagerSwift" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + CC35FB5CB48213AED5CC603DA1BAFDD5 /* Debug */, + EF6D14ECC1CB0A8614BA45F26A2F93BE /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + C95B0CE9F4170BB1B59616D3385E2F61 /* Build configuration list for PBXNativeTarget "IQKeyboardToolbarManager-IQKeyboardToolbarManager" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + F81ECC274BD61641856A50D07FD9CA42 /* Debug */, + B7466AF4B11E52A5B2E89BD96174704E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + D55DE508D232101A9401C119066B1179 /* Build configuration list for PBXAggregateTarget "AMapFoundation-NO-IDFA" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1EB11C22BE0EA9438D594256839A0EC6 /* Debug */, + DC7A740D30681C593DB29563306F29AC /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + DCAE6EDEEE8A32B61D5F03101D8DF626 /* Build configuration list for PBXNativeTarget "IQKeyboardCore-IQKeyboardCore" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A6DA467465F855950B3F59F89EBD2DF6 /* Debug */, + 6842DBB3371C60E90228D3554B879635 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + EF66756C5F5021DC6F5125F6AD1F7D11 /* Build configuration list for PBXNativeTarget "IQKeyboardReturnManager" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 13787BFD30D1D0E6AEEB4A9803E18282 /* Debug */, + CC1F8FA68402D02B36D3F9D3560CA16E /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; diff --git a/Pods/Target Support Files/IQKeyboardCore/IQKeyboardCore-Info.plist b/Pods/Target Support Files/IQKeyboardCore/IQKeyboardCore-Info.plist new file mode 100644 index 0000000..ffaf313 --- /dev/null +++ b/Pods/Target Support Files/IQKeyboardCore/IQKeyboardCore-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + ${PODS_DEVELOPMENT_LANGUAGE} + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0.9 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/IQKeyboardCore/IQKeyboardCore-dummy.m b/Pods/Target Support Files/IQKeyboardCore/IQKeyboardCore-dummy.m new file mode 100644 index 0000000..aee0796 --- /dev/null +++ b/Pods/Target Support Files/IQKeyboardCore/IQKeyboardCore-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_IQKeyboardCore : NSObject +@end +@implementation PodsDummy_IQKeyboardCore +@end diff --git a/Pods/Target Support Files/IQKeyboardCore/IQKeyboardCore-prefix.pch b/Pods/Target Support Files/IQKeyboardCore/IQKeyboardCore-prefix.pch new file mode 100644 index 0000000..beb2a24 --- /dev/null +++ b/Pods/Target Support Files/IQKeyboardCore/IQKeyboardCore-prefix.pch @@ -0,0 +1,12 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + diff --git a/Pods/Target Support Files/IQKeyboardCore/IQKeyboardCore-umbrella.h b/Pods/Target Support Files/IQKeyboardCore/IQKeyboardCore-umbrella.h new file mode 100644 index 0000000..64dd2f1 --- /dev/null +++ b/Pods/Target Support Files/IQKeyboardCore/IQKeyboardCore-umbrella.h @@ -0,0 +1,16 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + + +FOUNDATION_EXPORT double IQKeyboardCoreVersionNumber; +FOUNDATION_EXPORT const unsigned char IQKeyboardCoreVersionString[]; + diff --git a/Pods/Target Support Files/IQKeyboardCore/IQKeyboardCore.debug.xcconfig b/Pods/Target Support Files/IQKeyboardCore/IQKeyboardCore.debug.xcconfig new file mode 100644 index 0000000..403cebe --- /dev/null +++ b/Pods/Target Support Files/IQKeyboardCore/IQKeyboardCore.debug.xcconfig @@ -0,0 +1,16 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardCore +ENABLE_USER_SCRIPT_SANDBOXING = NO +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift +OTHER_LDFLAGS = $(inherited) -framework "UIKit" +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/IQKeyboardCore +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/IQKeyboardCore/IQKeyboardCore.modulemap b/Pods/Target Support Files/IQKeyboardCore/IQKeyboardCore.modulemap new file mode 100644 index 0000000..cca043f --- /dev/null +++ b/Pods/Target Support Files/IQKeyboardCore/IQKeyboardCore.modulemap @@ -0,0 +1,6 @@ +framework module IQKeyboardCore { + umbrella header "IQKeyboardCore-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/IQKeyboardCore/IQKeyboardCore.release.xcconfig b/Pods/Target Support Files/IQKeyboardCore/IQKeyboardCore.release.xcconfig new file mode 100644 index 0000000..403cebe --- /dev/null +++ b/Pods/Target Support Files/IQKeyboardCore/IQKeyboardCore.release.xcconfig @@ -0,0 +1,16 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardCore +ENABLE_USER_SCRIPT_SANDBOXING = NO +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift +OTHER_LDFLAGS = $(inherited) -framework "UIKit" +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/IQKeyboardCore +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/IQKeyboardCore/ResourceBundle-IQKeyboardCore-IQKeyboardCore-Info.plist b/Pods/Target Support Files/IQKeyboardCore/ResourceBundle-IQKeyboardCore-IQKeyboardCore-Info.plist new file mode 100644 index 0000000..f3e3ebc --- /dev/null +++ b/Pods/Target Support Files/IQKeyboardCore/ResourceBundle-IQKeyboardCore-IQKeyboardCore-Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + ${PODS_DEVELOPMENT_LANGUAGE} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0.9 + CFBundleSignature + ???? + CFBundleVersion + 1 + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/IQKeyboardManagerSwift/IQKeyboardManagerSwift-Info.plist b/Pods/Target Support Files/IQKeyboardManagerSwift/IQKeyboardManagerSwift-Info.plist new file mode 100644 index 0000000..887ab3b --- /dev/null +++ b/Pods/Target Support Files/IQKeyboardManagerSwift/IQKeyboardManagerSwift-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + ${PODS_DEVELOPMENT_LANGUAGE} + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 8.0.3 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/IQKeyboardManagerSwift/IQKeyboardManagerSwift-dummy.m b/Pods/Target Support Files/IQKeyboardManagerSwift/IQKeyboardManagerSwift-dummy.m new file mode 100644 index 0000000..7937f27 --- /dev/null +++ b/Pods/Target Support Files/IQKeyboardManagerSwift/IQKeyboardManagerSwift-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_IQKeyboardManagerSwift : NSObject +@end +@implementation PodsDummy_IQKeyboardManagerSwift +@end diff --git a/Pods/Target Support Files/IQKeyboardManagerSwift/IQKeyboardManagerSwift-prefix.pch b/Pods/Target Support Files/IQKeyboardManagerSwift/IQKeyboardManagerSwift-prefix.pch new file mode 100644 index 0000000..beb2a24 --- /dev/null +++ b/Pods/Target Support Files/IQKeyboardManagerSwift/IQKeyboardManagerSwift-prefix.pch @@ -0,0 +1,12 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + diff --git a/Pods/Target Support Files/IQKeyboardManagerSwift/IQKeyboardManagerSwift-umbrella.h b/Pods/Target Support Files/IQKeyboardManagerSwift/IQKeyboardManagerSwift-umbrella.h new file mode 100644 index 0000000..e95b398 --- /dev/null +++ b/Pods/Target Support Files/IQKeyboardManagerSwift/IQKeyboardManagerSwift-umbrella.h @@ -0,0 +1,16 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + + +FOUNDATION_EXPORT double IQKeyboardManagerSwiftVersionNumber; +FOUNDATION_EXPORT const unsigned char IQKeyboardManagerSwiftVersionString[]; + diff --git a/Pods/Target Support Files/IQKeyboardManagerSwift/IQKeyboardManagerSwift.debug.xcconfig b/Pods/Target Support Files/IQKeyboardManagerSwift/IQKeyboardManagerSwift.debug.xcconfig new file mode 100644 index 0000000..442dd02 --- /dev/null +++ b/Pods/Target Support Files/IQKeyboardManagerSwift/IQKeyboardManagerSwift.debug.xcconfig @@ -0,0 +1,17 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManagerSwift +ENABLE_USER_SCRIPT_SANDBOXING = NO +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardCore" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardNotification" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardReturnManager" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbar" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbarManager" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextInputViewNotification" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextView" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift +OTHER_LDFLAGS = $(inherited) -framework "Combine" -framework "IQKeyboardNotification" -framework "IQKeyboardReturnManager" -framework "IQKeyboardToolbarManager" -framework "IQTextInputViewNotification" -framework "IQTextView" -framework "UIKit" +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/IQKeyboardManagerSwift +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/IQKeyboardManagerSwift/IQKeyboardManagerSwift.modulemap b/Pods/Target Support Files/IQKeyboardManagerSwift/IQKeyboardManagerSwift.modulemap new file mode 100644 index 0000000..6d9b343 --- /dev/null +++ b/Pods/Target Support Files/IQKeyboardManagerSwift/IQKeyboardManagerSwift.modulemap @@ -0,0 +1,6 @@ +framework module IQKeyboardManagerSwift { + umbrella header "IQKeyboardManagerSwift-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/IQKeyboardManagerSwift/IQKeyboardManagerSwift.release.xcconfig b/Pods/Target Support Files/IQKeyboardManagerSwift/IQKeyboardManagerSwift.release.xcconfig new file mode 100644 index 0000000..442dd02 --- /dev/null +++ b/Pods/Target Support Files/IQKeyboardManagerSwift/IQKeyboardManagerSwift.release.xcconfig @@ -0,0 +1,17 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManagerSwift +ENABLE_USER_SCRIPT_SANDBOXING = NO +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardCore" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardNotification" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardReturnManager" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbar" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbarManager" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextInputViewNotification" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextView" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift +OTHER_LDFLAGS = $(inherited) -framework "Combine" -framework "IQKeyboardNotification" -framework "IQKeyboardReturnManager" -framework "IQKeyboardToolbarManager" -framework "IQTextInputViewNotification" -framework "IQTextView" -framework "UIKit" +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/IQKeyboardManagerSwift +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/IQKeyboardManagerSwift/ResourceBundle-IQKeyboardManagerSwift-IQKeyboardManagerSwift-Info.plist b/Pods/Target Support Files/IQKeyboardManagerSwift/ResourceBundle-IQKeyboardManagerSwift-IQKeyboardManagerSwift-Info.plist new file mode 100644 index 0000000..5e6b488 --- /dev/null +++ b/Pods/Target Support Files/IQKeyboardManagerSwift/ResourceBundle-IQKeyboardManagerSwift-IQKeyboardManagerSwift-Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + ${PODS_DEVELOPMENT_LANGUAGE} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + BNDL + CFBundleShortVersionString + 8.0.3 + CFBundleSignature + ???? + CFBundleVersion + 1 + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/IQKeyboardNotification/IQKeyboardNotification-Info.plist b/Pods/Target Support Files/IQKeyboardNotification/IQKeyboardNotification-Info.plist new file mode 100644 index 0000000..3ee67e6 --- /dev/null +++ b/Pods/Target Support Files/IQKeyboardNotification/IQKeyboardNotification-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + ${PODS_DEVELOPMENT_LANGUAGE} + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0.7 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/IQKeyboardNotification/IQKeyboardNotification-dummy.m b/Pods/Target Support Files/IQKeyboardNotification/IQKeyboardNotification-dummy.m new file mode 100644 index 0000000..8a83ede --- /dev/null +++ b/Pods/Target Support Files/IQKeyboardNotification/IQKeyboardNotification-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_IQKeyboardNotification : NSObject +@end +@implementation PodsDummy_IQKeyboardNotification +@end diff --git a/Pods/Target Support Files/IQKeyboardNotification/IQKeyboardNotification-prefix.pch b/Pods/Target Support Files/IQKeyboardNotification/IQKeyboardNotification-prefix.pch new file mode 100644 index 0000000..beb2a24 --- /dev/null +++ b/Pods/Target Support Files/IQKeyboardNotification/IQKeyboardNotification-prefix.pch @@ -0,0 +1,12 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + diff --git a/Pods/Target Support Files/IQKeyboardNotification/IQKeyboardNotification-umbrella.h b/Pods/Target Support Files/IQKeyboardNotification/IQKeyboardNotification-umbrella.h new file mode 100644 index 0000000..16fb1ef --- /dev/null +++ b/Pods/Target Support Files/IQKeyboardNotification/IQKeyboardNotification-umbrella.h @@ -0,0 +1,16 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + + +FOUNDATION_EXPORT double IQKeyboardNotificationVersionNumber; +FOUNDATION_EXPORT const unsigned char IQKeyboardNotificationVersionString[]; + diff --git a/Pods/Target Support Files/IQKeyboardNotification/IQKeyboardNotification.debug.xcconfig b/Pods/Target Support Files/IQKeyboardNotification/IQKeyboardNotification.debug.xcconfig new file mode 100644 index 0000000..dd36b8a --- /dev/null +++ b/Pods/Target Support Files/IQKeyboardNotification/IQKeyboardNotification.debug.xcconfig @@ -0,0 +1,16 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardNotification +ENABLE_USER_SCRIPT_SANDBOXING = NO +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift +OTHER_LDFLAGS = $(inherited) -framework "Combine" -framework "UIKit" +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/IQKeyboardNotification +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/IQKeyboardNotification/IQKeyboardNotification.modulemap b/Pods/Target Support Files/IQKeyboardNotification/IQKeyboardNotification.modulemap new file mode 100644 index 0000000..dc8f8c4 --- /dev/null +++ b/Pods/Target Support Files/IQKeyboardNotification/IQKeyboardNotification.modulemap @@ -0,0 +1,6 @@ +framework module IQKeyboardNotification { + umbrella header "IQKeyboardNotification-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/IQKeyboardNotification/IQKeyboardNotification.release.xcconfig b/Pods/Target Support Files/IQKeyboardNotification/IQKeyboardNotification.release.xcconfig new file mode 100644 index 0000000..dd36b8a --- /dev/null +++ b/Pods/Target Support Files/IQKeyboardNotification/IQKeyboardNotification.release.xcconfig @@ -0,0 +1,16 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardNotification +ENABLE_USER_SCRIPT_SANDBOXING = NO +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift +OTHER_LDFLAGS = $(inherited) -framework "Combine" -framework "UIKit" +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/IQKeyboardNotification +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/IQKeyboardNotification/ResourceBundle-IQKeyboardNotification-IQKeyboardNotification-Info.plist b/Pods/Target Support Files/IQKeyboardNotification/ResourceBundle-IQKeyboardNotification-IQKeyboardNotification-Info.plist new file mode 100644 index 0000000..76603d6 --- /dev/null +++ b/Pods/Target Support Files/IQKeyboardNotification/ResourceBundle-IQKeyboardNotification-IQKeyboardNotification-Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + ${PODS_DEVELOPMENT_LANGUAGE} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0.7 + CFBundleSignature + ???? + CFBundleVersion + 1 + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/IQKeyboardReturnManager/IQKeyboardReturnManager-Info.plist b/Pods/Target Support Files/IQKeyboardReturnManager/IQKeyboardReturnManager-Info.plist new file mode 100644 index 0000000..4a83d81 --- /dev/null +++ b/Pods/Target Support Files/IQKeyboardReturnManager/IQKeyboardReturnManager-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + ${PODS_DEVELOPMENT_LANGUAGE} + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0.6 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/IQKeyboardReturnManager/IQKeyboardReturnManager-dummy.m b/Pods/Target Support Files/IQKeyboardReturnManager/IQKeyboardReturnManager-dummy.m new file mode 100644 index 0000000..c4b85c8 --- /dev/null +++ b/Pods/Target Support Files/IQKeyboardReturnManager/IQKeyboardReturnManager-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_IQKeyboardReturnManager : NSObject +@end +@implementation PodsDummy_IQKeyboardReturnManager +@end diff --git a/Pods/Target Support Files/IQKeyboardReturnManager/IQKeyboardReturnManager-prefix.pch b/Pods/Target Support Files/IQKeyboardReturnManager/IQKeyboardReturnManager-prefix.pch new file mode 100644 index 0000000..beb2a24 --- /dev/null +++ b/Pods/Target Support Files/IQKeyboardReturnManager/IQKeyboardReturnManager-prefix.pch @@ -0,0 +1,12 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + diff --git a/Pods/Target Support Files/IQKeyboardReturnManager/IQKeyboardReturnManager-umbrella.h b/Pods/Target Support Files/IQKeyboardReturnManager/IQKeyboardReturnManager-umbrella.h new file mode 100644 index 0000000..5b8c1c9 --- /dev/null +++ b/Pods/Target Support Files/IQKeyboardReturnManager/IQKeyboardReturnManager-umbrella.h @@ -0,0 +1,16 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + + +FOUNDATION_EXPORT double IQKeyboardReturnManagerVersionNumber; +FOUNDATION_EXPORT const unsigned char IQKeyboardReturnManagerVersionString[]; + diff --git a/Pods/Target Support Files/IQKeyboardReturnManager/IQKeyboardReturnManager.debug.xcconfig b/Pods/Target Support Files/IQKeyboardReturnManager/IQKeyboardReturnManager.debug.xcconfig new file mode 100644 index 0000000..d9412d0 --- /dev/null +++ b/Pods/Target Support Files/IQKeyboardReturnManager/IQKeyboardReturnManager.debug.xcconfig @@ -0,0 +1,17 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardReturnManager +ENABLE_USER_SCRIPT_SANDBOXING = NO +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardCore" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift +OTHER_LDFLAGS = $(inherited) -framework "IQKeyboardCore" -framework "UIKit" +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/IQKeyboardReturnManager +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/IQKeyboardReturnManager/IQKeyboardReturnManager.modulemap b/Pods/Target Support Files/IQKeyboardReturnManager/IQKeyboardReturnManager.modulemap new file mode 100644 index 0000000..5c7882e --- /dev/null +++ b/Pods/Target Support Files/IQKeyboardReturnManager/IQKeyboardReturnManager.modulemap @@ -0,0 +1,6 @@ +framework module IQKeyboardReturnManager { + umbrella header "IQKeyboardReturnManager-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/IQKeyboardReturnManager/IQKeyboardReturnManager.release.xcconfig b/Pods/Target Support Files/IQKeyboardReturnManager/IQKeyboardReturnManager.release.xcconfig new file mode 100644 index 0000000..d9412d0 --- /dev/null +++ b/Pods/Target Support Files/IQKeyboardReturnManager/IQKeyboardReturnManager.release.xcconfig @@ -0,0 +1,17 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardReturnManager +ENABLE_USER_SCRIPT_SANDBOXING = NO +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardCore" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift +OTHER_LDFLAGS = $(inherited) -framework "IQKeyboardCore" -framework "UIKit" +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/IQKeyboardReturnManager +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/IQKeyboardReturnManager/ResourceBundle-IQKeyboardReturnManager-IQKeyboardReturnManager-Info.plist b/Pods/Target Support Files/IQKeyboardReturnManager/ResourceBundle-IQKeyboardReturnManager-IQKeyboardReturnManager-Info.plist new file mode 100644 index 0000000..3e781f1 --- /dev/null +++ b/Pods/Target Support Files/IQKeyboardReturnManager/ResourceBundle-IQKeyboardReturnManager-IQKeyboardReturnManager-Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + ${PODS_DEVELOPMENT_LANGUAGE} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0.6 + CFBundleSignature + ???? + CFBundleVersion + 1 + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/IQKeyboardToolbar/IQKeyboardToolbar-Info.plist b/Pods/Target Support Files/IQKeyboardToolbar/IQKeyboardToolbar-Info.plist new file mode 100644 index 0000000..066e06e --- /dev/null +++ b/Pods/Target Support Files/IQKeyboardToolbar/IQKeyboardToolbar-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + ${PODS_DEVELOPMENT_LANGUAGE} + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.1.5 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/IQKeyboardToolbar/IQKeyboardToolbar-dummy.m b/Pods/Target Support Files/IQKeyboardToolbar/IQKeyboardToolbar-dummy.m new file mode 100644 index 0000000..509d066 --- /dev/null +++ b/Pods/Target Support Files/IQKeyboardToolbar/IQKeyboardToolbar-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_IQKeyboardToolbar : NSObject +@end +@implementation PodsDummy_IQKeyboardToolbar +@end diff --git a/Pods/Target Support Files/IQKeyboardToolbar/IQKeyboardToolbar-prefix.pch b/Pods/Target Support Files/IQKeyboardToolbar/IQKeyboardToolbar-prefix.pch new file mode 100644 index 0000000..beb2a24 --- /dev/null +++ b/Pods/Target Support Files/IQKeyboardToolbar/IQKeyboardToolbar-prefix.pch @@ -0,0 +1,12 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + diff --git a/Pods/Target Support Files/IQKeyboardToolbar/IQKeyboardToolbar-umbrella.h b/Pods/Target Support Files/IQKeyboardToolbar/IQKeyboardToolbar-umbrella.h new file mode 100644 index 0000000..9697a17 --- /dev/null +++ b/Pods/Target Support Files/IQKeyboardToolbar/IQKeyboardToolbar-umbrella.h @@ -0,0 +1,16 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + + +FOUNDATION_EXPORT double IQKeyboardToolbarVersionNumber; +FOUNDATION_EXPORT const unsigned char IQKeyboardToolbarVersionString[]; + diff --git a/Pods/Target Support Files/IQKeyboardToolbar/IQKeyboardToolbar.debug.xcconfig b/Pods/Target Support Files/IQKeyboardToolbar/IQKeyboardToolbar.debug.xcconfig new file mode 100644 index 0000000..5b10c65 --- /dev/null +++ b/Pods/Target Support Files/IQKeyboardToolbar/IQKeyboardToolbar.debug.xcconfig @@ -0,0 +1,17 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbar +ENABLE_USER_SCRIPT_SANDBOXING = NO +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardCore" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift +OTHER_LDFLAGS = $(inherited) -framework "IQKeyboardCore" -framework "UIKit" +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/IQKeyboardToolbar +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/IQKeyboardToolbar/IQKeyboardToolbar.modulemap b/Pods/Target Support Files/IQKeyboardToolbar/IQKeyboardToolbar.modulemap new file mode 100644 index 0000000..01b12d5 --- /dev/null +++ b/Pods/Target Support Files/IQKeyboardToolbar/IQKeyboardToolbar.modulemap @@ -0,0 +1,6 @@ +framework module IQKeyboardToolbar { + umbrella header "IQKeyboardToolbar-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/IQKeyboardToolbar/IQKeyboardToolbar.release.xcconfig b/Pods/Target Support Files/IQKeyboardToolbar/IQKeyboardToolbar.release.xcconfig new file mode 100644 index 0000000..5b10c65 --- /dev/null +++ b/Pods/Target Support Files/IQKeyboardToolbar/IQKeyboardToolbar.release.xcconfig @@ -0,0 +1,17 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbar +ENABLE_USER_SCRIPT_SANDBOXING = NO +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardCore" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift +OTHER_LDFLAGS = $(inherited) -framework "IQKeyboardCore" -framework "UIKit" +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/IQKeyboardToolbar +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/IQKeyboardToolbar/ResourceBundle-IQKeyboardToolbar-IQKeyboardToolbar-Info.plist b/Pods/Target Support Files/IQKeyboardToolbar/ResourceBundle-IQKeyboardToolbar-IQKeyboardToolbar-Info.plist new file mode 100644 index 0000000..e1da07f --- /dev/null +++ b/Pods/Target Support Files/IQKeyboardToolbar/ResourceBundle-IQKeyboardToolbar-IQKeyboardToolbar-Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + ${PODS_DEVELOPMENT_LANGUAGE} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.1.5 + CFBundleSignature + ???? + CFBundleVersion + 1 + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/IQKeyboardToolbarManager/IQKeyboardToolbarManager-Info.plist b/Pods/Target Support Files/IQKeyboardToolbarManager/IQKeyboardToolbarManager-Info.plist new file mode 100644 index 0000000..7711a6e --- /dev/null +++ b/Pods/Target Support Files/IQKeyboardToolbarManager/IQKeyboardToolbarManager-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + ${PODS_DEVELOPMENT_LANGUAGE} + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.1.6 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/IQKeyboardToolbarManager/IQKeyboardToolbarManager-dummy.m b/Pods/Target Support Files/IQKeyboardToolbarManager/IQKeyboardToolbarManager-dummy.m new file mode 100644 index 0000000..16aad41 --- /dev/null +++ b/Pods/Target Support Files/IQKeyboardToolbarManager/IQKeyboardToolbarManager-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_IQKeyboardToolbarManager : NSObject +@end +@implementation PodsDummy_IQKeyboardToolbarManager +@end diff --git a/Pods/Target Support Files/IQKeyboardToolbarManager/IQKeyboardToolbarManager-prefix.pch b/Pods/Target Support Files/IQKeyboardToolbarManager/IQKeyboardToolbarManager-prefix.pch new file mode 100644 index 0000000..beb2a24 --- /dev/null +++ b/Pods/Target Support Files/IQKeyboardToolbarManager/IQKeyboardToolbarManager-prefix.pch @@ -0,0 +1,12 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + diff --git a/Pods/Target Support Files/IQKeyboardToolbarManager/IQKeyboardToolbarManager-umbrella.h b/Pods/Target Support Files/IQKeyboardToolbarManager/IQKeyboardToolbarManager-umbrella.h new file mode 100644 index 0000000..afc8d95 --- /dev/null +++ b/Pods/Target Support Files/IQKeyboardToolbarManager/IQKeyboardToolbarManager-umbrella.h @@ -0,0 +1,16 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + + +FOUNDATION_EXPORT double IQKeyboardToolbarManagerVersionNumber; +FOUNDATION_EXPORT const unsigned char IQKeyboardToolbarManagerVersionString[]; + diff --git a/Pods/Target Support Files/IQKeyboardToolbarManager/IQKeyboardToolbarManager.debug.xcconfig b/Pods/Target Support Files/IQKeyboardToolbarManager/IQKeyboardToolbarManager.debug.xcconfig new file mode 100644 index 0000000..4bbb2c8 --- /dev/null +++ b/Pods/Target Support Files/IQKeyboardToolbarManager/IQKeyboardToolbarManager.debug.xcconfig @@ -0,0 +1,17 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbarManager +ENABLE_USER_SCRIPT_SANDBOXING = NO +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardCore" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbar" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextInputViewNotification" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift +OTHER_LDFLAGS = $(inherited) -framework "Combine" -framework "IQKeyboardToolbar" -framework "IQTextInputViewNotification" -framework "UIKit" +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/IQKeyboardToolbarManager +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/IQKeyboardToolbarManager/IQKeyboardToolbarManager.modulemap b/Pods/Target Support Files/IQKeyboardToolbarManager/IQKeyboardToolbarManager.modulemap new file mode 100644 index 0000000..3c41440 --- /dev/null +++ b/Pods/Target Support Files/IQKeyboardToolbarManager/IQKeyboardToolbarManager.modulemap @@ -0,0 +1,6 @@ +framework module IQKeyboardToolbarManager { + umbrella header "IQKeyboardToolbarManager-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/IQKeyboardToolbarManager/IQKeyboardToolbarManager.release.xcconfig b/Pods/Target Support Files/IQKeyboardToolbarManager/IQKeyboardToolbarManager.release.xcconfig new file mode 100644 index 0000000..4bbb2c8 --- /dev/null +++ b/Pods/Target Support Files/IQKeyboardToolbarManager/IQKeyboardToolbarManager.release.xcconfig @@ -0,0 +1,17 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbarManager +ENABLE_USER_SCRIPT_SANDBOXING = NO +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardCore" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbar" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextInputViewNotification" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift +OTHER_LDFLAGS = $(inherited) -framework "Combine" -framework "IQKeyboardToolbar" -framework "IQTextInputViewNotification" -framework "UIKit" +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/IQKeyboardToolbarManager +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/IQKeyboardToolbarManager/ResourceBundle-IQKeyboardToolbarManager-IQKeyboardToolbarManager-Info.plist b/Pods/Target Support Files/IQKeyboardToolbarManager/ResourceBundle-IQKeyboardToolbarManager-IQKeyboardToolbarManager-Info.plist new file mode 100644 index 0000000..43c6965 --- /dev/null +++ b/Pods/Target Support Files/IQKeyboardToolbarManager/ResourceBundle-IQKeyboardToolbarManager-IQKeyboardToolbarManager-Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + ${PODS_DEVELOPMENT_LANGUAGE} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.1.6 + CFBundleSignature + ???? + CFBundleVersion + 1 + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/IQTextInputViewNotification/IQTextInputViewNotification-Info.plist b/Pods/Target Support Files/IQTextInputViewNotification/IQTextInputViewNotification-Info.plist new file mode 100644 index 0000000..ffaf313 --- /dev/null +++ b/Pods/Target Support Files/IQTextInputViewNotification/IQTextInputViewNotification-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + ${PODS_DEVELOPMENT_LANGUAGE} + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0.9 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/IQTextInputViewNotification/IQTextInputViewNotification-dummy.m b/Pods/Target Support Files/IQTextInputViewNotification/IQTextInputViewNotification-dummy.m new file mode 100644 index 0000000..128bc16 --- /dev/null +++ b/Pods/Target Support Files/IQTextInputViewNotification/IQTextInputViewNotification-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_IQTextInputViewNotification : NSObject +@end +@implementation PodsDummy_IQTextInputViewNotification +@end diff --git a/Pods/Target Support Files/IQTextInputViewNotification/IQTextInputViewNotification-prefix.pch b/Pods/Target Support Files/IQTextInputViewNotification/IQTextInputViewNotification-prefix.pch new file mode 100644 index 0000000..beb2a24 --- /dev/null +++ b/Pods/Target Support Files/IQTextInputViewNotification/IQTextInputViewNotification-prefix.pch @@ -0,0 +1,12 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + diff --git a/Pods/Target Support Files/IQTextInputViewNotification/IQTextInputViewNotification-umbrella.h b/Pods/Target Support Files/IQTextInputViewNotification/IQTextInputViewNotification-umbrella.h new file mode 100644 index 0000000..1752c3d --- /dev/null +++ b/Pods/Target Support Files/IQTextInputViewNotification/IQTextInputViewNotification-umbrella.h @@ -0,0 +1,16 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + + +FOUNDATION_EXPORT double IQTextInputViewNotificationVersionNumber; +FOUNDATION_EXPORT const unsigned char IQTextInputViewNotificationVersionString[]; + diff --git a/Pods/Target Support Files/IQTextInputViewNotification/IQTextInputViewNotification.debug.xcconfig b/Pods/Target Support Files/IQTextInputViewNotification/IQTextInputViewNotification.debug.xcconfig new file mode 100644 index 0000000..903a091 --- /dev/null +++ b/Pods/Target Support Files/IQTextInputViewNotification/IQTextInputViewNotification.debug.xcconfig @@ -0,0 +1,17 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/IQTextInputViewNotification +ENABLE_USER_SCRIPT_SANDBOXING = NO +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardCore" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift +OTHER_LDFLAGS = $(inherited) -framework "Combine" -framework "IQKeyboardCore" -framework "UIKit" +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/IQTextInputViewNotification +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/IQTextInputViewNotification/IQTextInputViewNotification.modulemap b/Pods/Target Support Files/IQTextInputViewNotification/IQTextInputViewNotification.modulemap new file mode 100644 index 0000000..12b0bca --- /dev/null +++ b/Pods/Target Support Files/IQTextInputViewNotification/IQTextInputViewNotification.modulemap @@ -0,0 +1,6 @@ +framework module IQTextInputViewNotification { + umbrella header "IQTextInputViewNotification-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/IQTextInputViewNotification/IQTextInputViewNotification.release.xcconfig b/Pods/Target Support Files/IQTextInputViewNotification/IQTextInputViewNotification.release.xcconfig new file mode 100644 index 0000000..903a091 --- /dev/null +++ b/Pods/Target Support Files/IQTextInputViewNotification/IQTextInputViewNotification.release.xcconfig @@ -0,0 +1,17 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/IQTextInputViewNotification +ENABLE_USER_SCRIPT_SANDBOXING = NO +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardCore" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift +OTHER_LDFLAGS = $(inherited) -framework "Combine" -framework "IQKeyboardCore" -framework "UIKit" +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/IQTextInputViewNotification +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/IQTextInputViewNotification/ResourceBundle-IQTextInputViewNotification-IQTextInputViewNotification-Info.plist b/Pods/Target Support Files/IQTextInputViewNotification/ResourceBundle-IQTextInputViewNotification-IQTextInputViewNotification-Info.plist new file mode 100644 index 0000000..f3e3ebc --- /dev/null +++ b/Pods/Target Support Files/IQTextInputViewNotification/ResourceBundle-IQTextInputViewNotification-IQTextInputViewNotification-Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + ${PODS_DEVELOPMENT_LANGUAGE} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0.9 + CFBundleSignature + ???? + CFBundleVersion + 1 + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/IQTextView/IQTextView-Info.plist b/Pods/Target Support Files/IQTextView/IQTextView-Info.plist new file mode 100644 index 0000000..0b89d70 --- /dev/null +++ b/Pods/Target Support Files/IQTextView/IQTextView-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + ${PODS_DEVELOPMENT_LANGUAGE} + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0.5 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/IQTextView/IQTextView-dummy.m b/Pods/Target Support Files/IQTextView/IQTextView-dummy.m new file mode 100644 index 0000000..3ee207b --- /dev/null +++ b/Pods/Target Support Files/IQTextView/IQTextView-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_IQTextView : NSObject +@end +@implementation PodsDummy_IQTextView +@end diff --git a/Pods/Target Support Files/IQTextView/IQTextView-prefix.pch b/Pods/Target Support Files/IQTextView/IQTextView-prefix.pch new file mode 100644 index 0000000..beb2a24 --- /dev/null +++ b/Pods/Target Support Files/IQTextView/IQTextView-prefix.pch @@ -0,0 +1,12 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + diff --git a/Pods/Target Support Files/IQTextView/IQTextView-umbrella.h b/Pods/Target Support Files/IQTextView/IQTextView-umbrella.h new file mode 100644 index 0000000..6aa14c2 --- /dev/null +++ b/Pods/Target Support Files/IQTextView/IQTextView-umbrella.h @@ -0,0 +1,16 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + + +FOUNDATION_EXPORT double IQTextViewVersionNumber; +FOUNDATION_EXPORT const unsigned char IQTextViewVersionString[]; + diff --git a/Pods/Target Support Files/IQTextView/IQTextView.debug.xcconfig b/Pods/Target Support Files/IQTextView/IQTextView.debug.xcconfig new file mode 100644 index 0000000..765a884 --- /dev/null +++ b/Pods/Target Support Files/IQTextView/IQTextView.debug.xcconfig @@ -0,0 +1,17 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/IQTextView +ENABLE_USER_SCRIPT_SANDBOXING = NO +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardCore" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbar" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift +OTHER_LDFLAGS = $(inherited) -framework "IQKeyboardToolbar" -framework "UIKit" +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/IQTextView +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/IQTextView/IQTextView.modulemap b/Pods/Target Support Files/IQTextView/IQTextView.modulemap new file mode 100644 index 0000000..1a2cd91 --- /dev/null +++ b/Pods/Target Support Files/IQTextView/IQTextView.modulemap @@ -0,0 +1,6 @@ +framework module IQTextView { + umbrella header "IQTextView-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/IQTextView/IQTextView.release.xcconfig b/Pods/Target Support Files/IQTextView/IQTextView.release.xcconfig new file mode 100644 index 0000000..765a884 --- /dev/null +++ b/Pods/Target Support Files/IQTextView/IQTextView.release.xcconfig @@ -0,0 +1,17 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/IQTextView +ENABLE_USER_SCRIPT_SANDBOXING = NO +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardCore" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbar" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift +OTHER_LDFLAGS = $(inherited) -framework "IQKeyboardToolbar" -framework "UIKit" +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/IQTextView +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/IQTextView/ResourceBundle-IQTextView-IQTextView-Info.plist b/Pods/Target Support Files/IQTextView/ResourceBundle-IQTextView-IQTextView-Info.plist new file mode 100644 index 0000000..3efc7e9 --- /dev/null +++ b/Pods/Target Support Files/IQTextView/ResourceBundle-IQTextView-IQTextView-Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + ${PODS_DEVELOPMENT_LANGUAGE} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0.5 + CFBundleSignature + ???? + CFBundleVersion + 1 + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan-acknowledgements.markdown b/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan-acknowledgements.markdown index 8ad71de..3af9e33 100644 --- a/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan-acknowledgements.markdown +++ b/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan-acknowledgements.markdown @@ -21,6 +21,204 @@ Copyright © 2014 AutoNavi. All Rights Reserved. Copyright © 2014 AutoNavi. All Rights Reserved. +## IQKeyboardCore + +MIT License + +Copyright (c) 2024 Mohd 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: + +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. + + +## IQKeyboardManagerSwift + +MIT License + +Copyright (c) 2013-2023 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: + +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. + + +## IQKeyboardNotification + +MIT License + +Copyright (c) 2024 Mohd 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: + +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. + + +## IQKeyboardReturnManager + +MIT License + +Copyright (c) 2024 Mohd 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: + +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. + + +## IQKeyboardToolbar + +MIT License + +Copyright (c) 2024 Mohd 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: + +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. + + +## IQKeyboardToolbarManager + +MIT License + +Copyright (c) 2024 Mohd 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: + +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. + + +## IQTextInputViewNotification + +Copyright (c) 2024 hackiftekhar + +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 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. + + +## IQTextView + +MIT License + +Copyright (c) 2024 Mohd 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: + +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. + + ## UMAPM Copyright 2011 - 2020 umeng.com. All rights reserved. diff --git a/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan-acknowledgements.plist b/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan-acknowledgements.plist index a36acfe..c202573 100644 --- a/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan-acknowledgements.plist +++ b/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan-acknowledgements.plist @@ -56,6 +56,252 @@ Type PSGroupSpecifier + + FooterText + MIT License + +Copyright (c) 2024 Mohd 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: + +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. + + License + MIT + Title + IQKeyboardCore + Type + PSGroupSpecifier + + + FooterText + MIT License + +Copyright (c) 2013-2023 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: + +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. + + License + MIT + Title + IQKeyboardManagerSwift + Type + PSGroupSpecifier + + + FooterText + MIT License + +Copyright (c) 2024 Mohd 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: + +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. + + License + MIT + Title + IQKeyboardNotification + Type + PSGroupSpecifier + + + FooterText + MIT License + +Copyright (c) 2024 Mohd 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: + +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. + + License + MIT + Title + IQKeyboardReturnManager + Type + PSGroupSpecifier + + + FooterText + MIT License + +Copyright (c) 2024 Mohd 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: + +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. + + License + MIT + Title + IQKeyboardToolbar + Type + PSGroupSpecifier + + + FooterText + MIT License + +Copyright (c) 2024 Mohd 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: + +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. + + License + MIT + Title + IQKeyboardToolbarManager + Type + PSGroupSpecifier + + + FooterText + Copyright (c) 2024 hackiftekhar <ideviftekhar@gmail.com> + +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 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. + + License + MIT + Title + IQTextInputViewNotification + Type + PSGroupSpecifier + + + FooterText + MIT License + +Copyright (c) 2024 Mohd 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: + +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. + + License + MIT + Title + IQTextView + Type + PSGroupSpecifier + FooterText Copyright 2011 - 2020 umeng.com. All rights reserved. diff --git a/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan-frameworks-Debug-input-files.xcfilelist b/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan-frameworks-Debug-input-files.xcfilelist new file mode 100644 index 0000000..d1e0b2b --- /dev/null +++ b/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan-frameworks-Debug-input-files.xcfilelist @@ -0,0 +1,9 @@ +${PODS_ROOT}/Target Support Files/Pods-suixinkan/Pods-suixinkan-frameworks.sh +${BUILT_PRODUCTS_DIR}/IQKeyboardCore/IQKeyboardCore.framework +${BUILT_PRODUCTS_DIR}/IQKeyboardManagerSwift/IQKeyboardManagerSwift.framework +${BUILT_PRODUCTS_DIR}/IQKeyboardNotification/IQKeyboardNotification.framework +${BUILT_PRODUCTS_DIR}/IQKeyboardReturnManager/IQKeyboardReturnManager.framework +${BUILT_PRODUCTS_DIR}/IQKeyboardToolbar/IQKeyboardToolbar.framework +${BUILT_PRODUCTS_DIR}/IQKeyboardToolbarManager/IQKeyboardToolbarManager.framework +${BUILT_PRODUCTS_DIR}/IQTextInputViewNotification/IQTextInputViewNotification.framework +${BUILT_PRODUCTS_DIR}/IQTextView/IQTextView.framework \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan-frameworks-Debug-output-files.xcfilelist b/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan-frameworks-Debug-output-files.xcfilelist new file mode 100644 index 0000000..438c080 --- /dev/null +++ b/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan-frameworks-Debug-output-files.xcfilelist @@ -0,0 +1,8 @@ +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/IQKeyboardCore.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/IQKeyboardManagerSwift.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/IQKeyboardNotification.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/IQKeyboardReturnManager.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/IQKeyboardToolbar.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/IQKeyboardToolbarManager.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/IQTextInputViewNotification.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/IQTextView.framework \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan-frameworks-Release-input-files.xcfilelist b/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan-frameworks-Release-input-files.xcfilelist new file mode 100644 index 0000000..d1e0b2b --- /dev/null +++ b/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan-frameworks-Release-input-files.xcfilelist @@ -0,0 +1,9 @@ +${PODS_ROOT}/Target Support Files/Pods-suixinkan/Pods-suixinkan-frameworks.sh +${BUILT_PRODUCTS_DIR}/IQKeyboardCore/IQKeyboardCore.framework +${BUILT_PRODUCTS_DIR}/IQKeyboardManagerSwift/IQKeyboardManagerSwift.framework +${BUILT_PRODUCTS_DIR}/IQKeyboardNotification/IQKeyboardNotification.framework +${BUILT_PRODUCTS_DIR}/IQKeyboardReturnManager/IQKeyboardReturnManager.framework +${BUILT_PRODUCTS_DIR}/IQKeyboardToolbar/IQKeyboardToolbar.framework +${BUILT_PRODUCTS_DIR}/IQKeyboardToolbarManager/IQKeyboardToolbarManager.framework +${BUILT_PRODUCTS_DIR}/IQTextInputViewNotification/IQTextInputViewNotification.framework +${BUILT_PRODUCTS_DIR}/IQTextView/IQTextView.framework \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan-frameworks-Release-output-files.xcfilelist b/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan-frameworks-Release-output-files.xcfilelist new file mode 100644 index 0000000..438c080 --- /dev/null +++ b/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan-frameworks-Release-output-files.xcfilelist @@ -0,0 +1,8 @@ +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/IQKeyboardCore.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/IQKeyboardManagerSwift.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/IQKeyboardNotification.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/IQKeyboardReturnManager.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/IQKeyboardToolbar.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/IQKeyboardToolbarManager.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/IQTextInputViewNotification.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/IQTextView.framework \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan-frameworks.sh b/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan-frameworks.sh new file mode 100755 index 0000000..589b1b6 --- /dev/null +++ b/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan-frameworks.sh @@ -0,0 +1,200 @@ +#!/bin/sh +set -e +set -u +set -o pipefail + +function on_error { + echo "$(realpath -mq "${0}"):$1: error: Unexpected failure" +} +trap 'on_error $LINENO' ERR + +if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then + # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy + # frameworks to, so exit 0 (signalling the script phase was successful). + exit 0 +fi + +echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" +mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + +COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}" +SWIFT_STDLIB_PATH="${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" +BCSYMBOLMAP_DIR="BCSymbolMaps" + + +# This protects against multiple targets copying the same framework dependency at the same time. The solution +# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html +RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") + +# Copies and strips a vendored framework +install_framework() +{ + if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then + local source="${BUILT_PRODUCTS_DIR}/$1" + elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then + local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" + elif [ -r "$1" ]; then + local source="$1" + fi + + local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + + if [ -L "${source}" ]; then + echo "Symlinked..." + source="$(readlink -f "${source}")" + fi + + if [ -d "${source}/${BCSYMBOLMAP_DIR}" ]; then + # Locate and install any .bcsymbolmaps if present, and remove them from the .framework before the framework is copied + find "${source}/${BCSYMBOLMAP_DIR}" -name "*.bcsymbolmap"|while read f; do + echo "Installing $f" + install_bcsymbolmap "$f" "$destination" + rm "$f" + done + rmdir "${source}/${BCSYMBOLMAP_DIR}" + fi + + # Use filter instead of exclude so missing patterns don't throw errors. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" + + local basename + basename="$(basename -s .framework "$1")" + binary="${destination}/${basename}.framework/${basename}" + + if ! [ -r "$binary" ]; then + binary="${destination}/${basename}" + elif [ -L "${binary}" ]; then + echo "Destination binary is symlinked..." + dirname="$(dirname "${binary}")" + binary="${dirname}/$(readlink "${binary}")" + fi + + # Strip invalid architectures so "fat" simulator / device frameworks work on device + if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then + strip_invalid_archs "$binary" + fi + + # Resign the code if required by the build settings to avoid unstable apps + code_sign_if_enabled "${destination}/$(basename "$1")" + + # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. + if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then + local swift_runtime_libs + swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u) + for lib in $swift_runtime_libs; do + echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" + rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" + code_sign_if_enabled "${destination}/${lib}" + done + fi +} +# Copies and strips a vendored dSYM +install_dsym() { + local source="$1" + warn_missing_arch=${2:-true} + if [ -r "$source" ]; then + # Copy the dSYM into the targets temp dir. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DERIVED_FILES_DIR}" + + local basename + basename="$(basename -s .dSYM "$source")" + binary_name="$(ls "$source/Contents/Resources/DWARF")" + binary="${DERIVED_FILES_DIR}/${basename}.dSYM/Contents/Resources/DWARF/${binary_name}" + + # Strip invalid architectures from the dSYM. + if [[ "$(file "$binary")" == *"Mach-O "*"dSYM companion"* ]]; then + strip_invalid_archs "$binary" "$warn_missing_arch" + fi + if [[ $STRIP_BINARY_RETVAL == 0 ]]; then + # Move the stripped file into its final destination. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.dSYM" "${DWARF_DSYM_FOLDER_PATH}" + else + # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing. + mkdir -p "${DWARF_DSYM_FOLDER_PATH}" + touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.dSYM" + fi + fi +} + +# Used as a return value for each invocation of `strip_invalid_archs` function. +STRIP_BINARY_RETVAL=0 + +# Strip invalid architectures +strip_invalid_archs() { + binary="$1" + warn_missing_arch=${2:-true} + # Get architectures for current target binary + binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)" + # Intersect them with the architectures we are building for + intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)" + # If there are no archs supported by this binary then warn the user + if [[ -z "$intersected_archs" ]]; then + if [[ "$warn_missing_arch" == "true" ]]; then + echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." + fi + STRIP_BINARY_RETVAL=1 + return + fi + stripped="" + for arch in $binary_archs; do + if ! [[ "${ARCHS}" == *"$arch"* ]]; then + # Strip non-valid architectures in-place + lipo -remove "$arch" -output "$binary" "$binary" + stripped="$stripped $arch" + fi + done + if [[ "$stripped" ]]; then + echo "Stripped $binary of architectures:$stripped" + fi + STRIP_BINARY_RETVAL=0 +} + +# Copies the bcsymbolmap files of a vendored framework +install_bcsymbolmap() { + local bcsymbolmap_path="$1" + local destination="${BUILT_PRODUCTS_DIR}" + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}" +} + +# Signs a framework with the provided identity +code_sign_if_enabled() { + if [ -n "${EXPANDED_CODE_SIGN_IDENTITY:-}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then + # Use the current code_sign_identity + echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" + local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'" + + if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + code_sign_cmd="$code_sign_cmd &" + fi + echo "$code_sign_cmd" + eval "$code_sign_cmd" + fi +} + +if [[ "$CONFIGURATION" == "Debug" ]]; then + install_framework "${BUILT_PRODUCTS_DIR}/IQKeyboardCore/IQKeyboardCore.framework" + install_framework "${BUILT_PRODUCTS_DIR}/IQKeyboardManagerSwift/IQKeyboardManagerSwift.framework" + install_framework "${BUILT_PRODUCTS_DIR}/IQKeyboardNotification/IQKeyboardNotification.framework" + install_framework "${BUILT_PRODUCTS_DIR}/IQKeyboardReturnManager/IQKeyboardReturnManager.framework" + install_framework "${BUILT_PRODUCTS_DIR}/IQKeyboardToolbar/IQKeyboardToolbar.framework" + install_framework "${BUILT_PRODUCTS_DIR}/IQKeyboardToolbarManager/IQKeyboardToolbarManager.framework" + install_framework "${BUILT_PRODUCTS_DIR}/IQTextInputViewNotification/IQTextInputViewNotification.framework" + install_framework "${BUILT_PRODUCTS_DIR}/IQTextView/IQTextView.framework" +fi +if [[ "$CONFIGURATION" == "Release" ]]; then + install_framework "${BUILT_PRODUCTS_DIR}/IQKeyboardCore/IQKeyboardCore.framework" + install_framework "${BUILT_PRODUCTS_DIR}/IQKeyboardManagerSwift/IQKeyboardManagerSwift.framework" + install_framework "${BUILT_PRODUCTS_DIR}/IQKeyboardNotification/IQKeyboardNotification.framework" + install_framework "${BUILT_PRODUCTS_DIR}/IQKeyboardReturnManager/IQKeyboardReturnManager.framework" + install_framework "${BUILT_PRODUCTS_DIR}/IQKeyboardToolbar/IQKeyboardToolbar.framework" + install_framework "${BUILT_PRODUCTS_DIR}/IQKeyboardToolbarManager/IQKeyboardToolbarManager.framework" + install_framework "${BUILT_PRODUCTS_DIR}/IQTextInputViewNotification/IQTextInputViewNotification.framework" + install_framework "${BUILT_PRODUCTS_DIR}/IQTextView/IQTextView.framework" +fi +if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + wait +fi diff --git a/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan.debug.xcconfig b/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan.debug.xcconfig index 04645a4..10046ac 100644 --- a/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan.debug.xcconfig +++ b/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan.debug.xcconfig @@ -1,11 +1,16 @@ +ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES ARCHS = $(ARCHS_STANDARD) CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +ENABLE_USER_SCRIPT_SANDBOXING = NO EXCLUDED_ARCHS[sdk=iphonesimulator*] = arm64 -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/AMap3DMap-NO-IDFA" "${PODS_ROOT}/AMapFoundation-NO-IDFA" "${PODS_ROOT}/AMapLocation-NO-IDFA" "${PODS_ROOT}/AMapSearch-NO-IDFA" "${PODS_ROOT}/UMAPM/UMAPM_2.0.7" "${PODS_ROOT}/UMCommon/UMCommon_7.5.11" "${PODS_ROOT}/UMDevice/UMDevice_3.6.0" "${PODS_ROOT}/WechatOpenSDK-XCFramework" "${PODS_XCFRAMEWORKS_BUILD_DIR}/UMAPM" "${PODS_XCFRAMEWORKS_BUILD_DIR}/UMCommon" "${PODS_XCFRAMEWORKS_BUILD_DIR}/UMDevice" "${PODS_XCFRAMEWORKS_BUILD_DIR}/WechatOpenSDK-XCFramework" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardCore" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManagerSwift" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardNotification" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardReturnManager" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbar" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbarManager" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextInputViewNotification" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextView" "${PODS_ROOT}/AMap3DMap-NO-IDFA" "${PODS_ROOT}/AMapFoundation-NO-IDFA" "${PODS_ROOT}/AMapLocation-NO-IDFA" "${PODS_ROOT}/AMapSearch-NO-IDFA" "${PODS_ROOT}/UMAPM/UMAPM_2.0.7" "${PODS_ROOT}/UMCommon/UMCommon_7.5.11" "${PODS_ROOT}/UMDevice/UMDevice_3.6.0" "${PODS_ROOT}/WechatOpenSDK-XCFramework" "${PODS_XCFRAMEWORKS_BUILD_DIR}/UMAPM" "${PODS_XCFRAMEWORKS_BUILD_DIR}/UMCommon" "${PODS_XCFRAMEWORKS_BUILD_DIR}/UMDevice" "${PODS_XCFRAMEWORKS_BUILD_DIR}/WechatOpenSDK-XCFramework" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' -OTHER_LDFLAGS = $(inherited) -ObjC -l"c++" -l"sqlite3" -l"sqlite3.0" -l"z" -framework "AMapFoundationKit" -framework "AMapLocationKit" -framework "AMapSearchKit" -framework "CoreGraphics" -framework "CoreLocation" -framework "CoreTelephony" -framework "CoreText" -framework "ExternalAccessory" -framework "GLKit" -framework "MAMapKit" -framework "OpenGLES" -framework "QuartzCore" -framework "Security" -framework "SystemConfiguration" -framework "UIKit" -framework "UMAPM" -framework "UMCommon" -framework "UMDevice" -framework "WebKit" -framework "WechatOpenSDK" -OTHER_MODULE_VERIFIER_FLAGS = $(inherited) "-F${PODS_CONFIGURATION_BUILD_DIR}/AMap3DMap-NO-IDFA" "-F${PODS_CONFIGURATION_BUILD_DIR}/AMapFoundation-NO-IDFA" "-F${PODS_CONFIGURATION_BUILD_DIR}/AMapLocation-NO-IDFA" "-F${PODS_CONFIGURATION_BUILD_DIR}/AMapSearch-NO-IDFA" "-F${PODS_CONFIGURATION_BUILD_DIR}/UMAPM" "-F${PODS_CONFIGURATION_BUILD_DIR}/UMCommon" "-F${PODS_CONFIGURATION_BUILD_DIR}/UMDevice" "-F${PODS_CONFIGURATION_BUILD_DIR}/WechatOpenSDK-XCFramework" +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardCore/IQKeyboardCore.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManagerSwift/IQKeyboardManagerSwift.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardNotification/IQKeyboardNotification.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardReturnManager/IQKeyboardReturnManager.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbar/IQKeyboardToolbar.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbarManager/IQKeyboardToolbarManager.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextInputViewNotification/IQTextInputViewNotification.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextView/IQTextView.framework/Headers" +LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift '@executable_path/Frameworks' '@loader_path/Frameworks' +LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift +OTHER_LDFLAGS = $(inherited) -ObjC -l"c++" -l"sqlite3" -l"sqlite3.0" -l"z" -framework "AMapFoundationKit" -framework "AMapLocationKit" -framework "AMapSearchKit" -framework "Combine" -framework "CoreGraphics" -framework "CoreLocation" -framework "CoreTelephony" -framework "CoreText" -framework "ExternalAccessory" -framework "GLKit" -framework "IQKeyboardCore" -framework "IQKeyboardManagerSwift" -framework "IQKeyboardNotification" -framework "IQKeyboardReturnManager" -framework "IQKeyboardToolbar" -framework "IQKeyboardToolbarManager" -framework "IQTextInputViewNotification" -framework "IQTextView" -framework "MAMapKit" -framework "OpenGLES" -framework "QuartzCore" -framework "Security" -framework "SystemConfiguration" -framework "UIKit" -framework "UMAPM" -framework "UMCommon" -framework "UMDevice" -framework "WebKit" -framework "WechatOpenSDK" +OTHER_MODULE_VERIFIER_FLAGS = $(inherited) "-F${PODS_CONFIGURATION_BUILD_DIR}/AMap3DMap-NO-IDFA" "-F${PODS_CONFIGURATION_BUILD_DIR}/AMapFoundation-NO-IDFA" "-F${PODS_CONFIGURATION_BUILD_DIR}/AMapLocation-NO-IDFA" "-F${PODS_CONFIGURATION_BUILD_DIR}/AMapSearch-NO-IDFA" "-F${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardCore" "-F${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManagerSwift" "-F${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardNotification" "-F${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardReturnManager" "-F${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbar" "-F${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbarManager" "-F${PODS_CONFIGURATION_BUILD_DIR}/IQTextInputViewNotification" "-F${PODS_CONFIGURATION_BUILD_DIR}/IQTextView" "-F${PODS_CONFIGURATION_BUILD_DIR}/UMAPM" "-F${PODS_CONFIGURATION_BUILD_DIR}/UMCommon" "-F${PODS_CONFIGURATION_BUILD_DIR}/UMDevice" "-F${PODS_CONFIGURATION_BUILD_DIR}/WechatOpenSDK-XCFramework" +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_PODFILE_DIR_PATH = ${SRCROOT}/. diff --git a/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan.release.xcconfig b/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan.release.xcconfig index 04645a4..10046ac 100644 --- a/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan.release.xcconfig +++ b/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan.release.xcconfig @@ -1,11 +1,16 @@ +ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES ARCHS = $(ARCHS_STANDARD) CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +ENABLE_USER_SCRIPT_SANDBOXING = NO EXCLUDED_ARCHS[sdk=iphonesimulator*] = arm64 -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/AMap3DMap-NO-IDFA" "${PODS_ROOT}/AMapFoundation-NO-IDFA" "${PODS_ROOT}/AMapLocation-NO-IDFA" "${PODS_ROOT}/AMapSearch-NO-IDFA" "${PODS_ROOT}/UMAPM/UMAPM_2.0.7" "${PODS_ROOT}/UMCommon/UMCommon_7.5.11" "${PODS_ROOT}/UMDevice/UMDevice_3.6.0" "${PODS_ROOT}/WechatOpenSDK-XCFramework" "${PODS_XCFRAMEWORKS_BUILD_DIR}/UMAPM" "${PODS_XCFRAMEWORKS_BUILD_DIR}/UMCommon" "${PODS_XCFRAMEWORKS_BUILD_DIR}/UMDevice" "${PODS_XCFRAMEWORKS_BUILD_DIR}/WechatOpenSDK-XCFramework" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardCore" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManagerSwift" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardNotification" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardReturnManager" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbar" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbarManager" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextInputViewNotification" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextView" "${PODS_ROOT}/AMap3DMap-NO-IDFA" "${PODS_ROOT}/AMapFoundation-NO-IDFA" "${PODS_ROOT}/AMapLocation-NO-IDFA" "${PODS_ROOT}/AMapSearch-NO-IDFA" "${PODS_ROOT}/UMAPM/UMAPM_2.0.7" "${PODS_ROOT}/UMCommon/UMCommon_7.5.11" "${PODS_ROOT}/UMDevice/UMDevice_3.6.0" "${PODS_ROOT}/WechatOpenSDK-XCFramework" "${PODS_XCFRAMEWORKS_BUILD_DIR}/UMAPM" "${PODS_XCFRAMEWORKS_BUILD_DIR}/UMCommon" "${PODS_XCFRAMEWORKS_BUILD_DIR}/UMDevice" "${PODS_XCFRAMEWORKS_BUILD_DIR}/WechatOpenSDK-XCFramework" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' -OTHER_LDFLAGS = $(inherited) -ObjC -l"c++" -l"sqlite3" -l"sqlite3.0" -l"z" -framework "AMapFoundationKit" -framework "AMapLocationKit" -framework "AMapSearchKit" -framework "CoreGraphics" -framework "CoreLocation" -framework "CoreTelephony" -framework "CoreText" -framework "ExternalAccessory" -framework "GLKit" -framework "MAMapKit" -framework "OpenGLES" -framework "QuartzCore" -framework "Security" -framework "SystemConfiguration" -framework "UIKit" -framework "UMAPM" -framework "UMCommon" -framework "UMDevice" -framework "WebKit" -framework "WechatOpenSDK" -OTHER_MODULE_VERIFIER_FLAGS = $(inherited) "-F${PODS_CONFIGURATION_BUILD_DIR}/AMap3DMap-NO-IDFA" "-F${PODS_CONFIGURATION_BUILD_DIR}/AMapFoundation-NO-IDFA" "-F${PODS_CONFIGURATION_BUILD_DIR}/AMapLocation-NO-IDFA" "-F${PODS_CONFIGURATION_BUILD_DIR}/AMapSearch-NO-IDFA" "-F${PODS_CONFIGURATION_BUILD_DIR}/UMAPM" "-F${PODS_CONFIGURATION_BUILD_DIR}/UMCommon" "-F${PODS_CONFIGURATION_BUILD_DIR}/UMDevice" "-F${PODS_CONFIGURATION_BUILD_DIR}/WechatOpenSDK-XCFramework" +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardCore/IQKeyboardCore.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManagerSwift/IQKeyboardManagerSwift.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardNotification/IQKeyboardNotification.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardReturnManager/IQKeyboardReturnManager.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbar/IQKeyboardToolbar.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbarManager/IQKeyboardToolbarManager.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextInputViewNotification/IQTextInputViewNotification.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextView/IQTextView.framework/Headers" +LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift '@executable_path/Frameworks' '@loader_path/Frameworks' +LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift +OTHER_LDFLAGS = $(inherited) -ObjC -l"c++" -l"sqlite3" -l"sqlite3.0" -l"z" -framework "AMapFoundationKit" -framework "AMapLocationKit" -framework "AMapSearchKit" -framework "Combine" -framework "CoreGraphics" -framework "CoreLocation" -framework "CoreTelephony" -framework "CoreText" -framework "ExternalAccessory" -framework "GLKit" -framework "IQKeyboardCore" -framework "IQKeyboardManagerSwift" -framework "IQKeyboardNotification" -framework "IQKeyboardReturnManager" -framework "IQKeyboardToolbar" -framework "IQKeyboardToolbarManager" -framework "IQTextInputViewNotification" -framework "IQTextView" -framework "MAMapKit" -framework "OpenGLES" -framework "QuartzCore" -framework "Security" -framework "SystemConfiguration" -framework "UIKit" -framework "UMAPM" -framework "UMCommon" -framework "UMDevice" -framework "WebKit" -framework "WechatOpenSDK" +OTHER_MODULE_VERIFIER_FLAGS = $(inherited) "-F${PODS_CONFIGURATION_BUILD_DIR}/AMap3DMap-NO-IDFA" "-F${PODS_CONFIGURATION_BUILD_DIR}/AMapFoundation-NO-IDFA" "-F${PODS_CONFIGURATION_BUILD_DIR}/AMapLocation-NO-IDFA" "-F${PODS_CONFIGURATION_BUILD_DIR}/AMapSearch-NO-IDFA" "-F${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardCore" "-F${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManagerSwift" "-F${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardNotification" "-F${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardReturnManager" "-F${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbar" "-F${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbarManager" "-F${PODS_CONFIGURATION_BUILD_DIR}/IQTextInputViewNotification" "-F${PODS_CONFIGURATION_BUILD_DIR}/IQTextView" "-F${PODS_CONFIGURATION_BUILD_DIR}/UMAPM" "-F${PODS_CONFIGURATION_BUILD_DIR}/UMCommon" "-F${PODS_CONFIGURATION_BUILD_DIR}/UMDevice" "-F${PODS_CONFIGURATION_BUILD_DIR}/WechatOpenSDK-XCFramework" +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_PODFILE_DIR_PATH = ${SRCROOT}/. diff --git a/Pods/Target Support Files/Pods-suixinkanTests/Pods-suixinkanTests.debug.xcconfig b/Pods/Target Support Files/Pods-suixinkanTests/Pods-suixinkanTests.debug.xcconfig index c07427f..27fbd84 100644 --- a/Pods/Target Support Files/Pods-suixinkanTests/Pods-suixinkanTests.debug.xcconfig +++ b/Pods/Target Support Files/Pods-suixinkanTests/Pods-suixinkanTests.debug.xcconfig @@ -1,9 +1,11 @@ ARCHS = $(ARCHS_STANDARD) CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +ENABLE_USER_SCRIPT_SANDBOXING = NO EXCLUDED_ARCHS[sdk=iphonesimulator*] = arm64 -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/AMap3DMap-NO-IDFA" "${PODS_ROOT}/AMapFoundation-NO-IDFA" "${PODS_ROOT}/AMapLocation-NO-IDFA" "${PODS_ROOT}/AMapSearch-NO-IDFA" "${PODS_ROOT}/UMAPM/UMAPM_2.0.7" "${PODS_ROOT}/UMCommon/UMCommon_7.5.11" "${PODS_ROOT}/UMDevice/UMDevice_3.6.0" "${PODS_ROOT}/WechatOpenSDK-XCFramework" "${PODS_XCFRAMEWORKS_BUILD_DIR}/UMAPM" "${PODS_XCFRAMEWORKS_BUILD_DIR}/UMCommon" "${PODS_XCFRAMEWORKS_BUILD_DIR}/UMDevice" "${PODS_XCFRAMEWORKS_BUILD_DIR}/WechatOpenSDK-XCFramework" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardCore" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManagerSwift" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardNotification" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardReturnManager" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbar" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbarManager" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextInputViewNotification" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextView" "${PODS_ROOT}/AMap3DMap-NO-IDFA" "${PODS_ROOT}/AMapFoundation-NO-IDFA" "${PODS_ROOT}/AMapLocation-NO-IDFA" "${PODS_ROOT}/AMapSearch-NO-IDFA" "${PODS_ROOT}/UMAPM/UMAPM_2.0.7" "${PODS_ROOT}/UMCommon/UMCommon_7.5.11" "${PODS_ROOT}/UMDevice/UMDevice_3.6.0" "${PODS_ROOT}/WechatOpenSDK-XCFramework" "${PODS_XCFRAMEWORKS_BUILD_DIR}/UMAPM" "${PODS_XCFRAMEWORKS_BUILD_DIR}/UMCommon" "${PODS_XCFRAMEWORKS_BUILD_DIR}/UMDevice" "${PODS_XCFRAMEWORKS_BUILD_DIR}/WechatOpenSDK-XCFramework" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -OTHER_LDFLAGS = $(inherited) -l"c++" -l"sqlite3" -l"sqlite3.0" -l"z" -framework "CoreGraphics" -framework "CoreLocation" -framework "CoreTelephony" -framework "CoreText" -framework "ExternalAccessory" -framework "GLKit" -framework "OpenGLES" -framework "QuartzCore" -framework "Security" -framework "SystemConfiguration" -framework "UIKit" -framework "WebKit" +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardCore/IQKeyboardCore.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManagerSwift/IQKeyboardManagerSwift.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardNotification/IQKeyboardNotification.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardReturnManager/IQKeyboardReturnManager.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbar/IQKeyboardToolbar.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbarManager/IQKeyboardToolbarManager.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextInputViewNotification/IQTextInputViewNotification.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextView/IQTextView.framework/Headers" +OTHER_LDFLAGS = $(inherited) -l"c++" -l"sqlite3" -l"sqlite3.0" -l"z" -framework "Combine" -framework "CoreGraphics" -framework "CoreLocation" -framework "CoreTelephony" -framework "CoreText" -framework "ExternalAccessory" -framework "GLKit" -framework "IQKeyboardCore" -framework "IQKeyboardManagerSwift" -framework "IQKeyboardNotification" -framework "IQKeyboardReturnManager" -framework "IQKeyboardToolbar" -framework "IQKeyboardToolbarManager" -framework "IQTextInputViewNotification" -framework "IQTextView" -framework "OpenGLES" -framework "QuartzCore" -framework "Security" -framework "SystemConfiguration" -framework "UIKit" -framework "WebKit" PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_PODFILE_DIR_PATH = ${SRCROOT}/. diff --git a/Pods/Target Support Files/Pods-suixinkanTests/Pods-suixinkanTests.release.xcconfig b/Pods/Target Support Files/Pods-suixinkanTests/Pods-suixinkanTests.release.xcconfig index c07427f..27fbd84 100644 --- a/Pods/Target Support Files/Pods-suixinkanTests/Pods-suixinkanTests.release.xcconfig +++ b/Pods/Target Support Files/Pods-suixinkanTests/Pods-suixinkanTests.release.xcconfig @@ -1,9 +1,11 @@ ARCHS = $(ARCHS_STANDARD) CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +ENABLE_USER_SCRIPT_SANDBOXING = NO EXCLUDED_ARCHS[sdk=iphonesimulator*] = arm64 -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/AMap3DMap-NO-IDFA" "${PODS_ROOT}/AMapFoundation-NO-IDFA" "${PODS_ROOT}/AMapLocation-NO-IDFA" "${PODS_ROOT}/AMapSearch-NO-IDFA" "${PODS_ROOT}/UMAPM/UMAPM_2.0.7" "${PODS_ROOT}/UMCommon/UMCommon_7.5.11" "${PODS_ROOT}/UMDevice/UMDevice_3.6.0" "${PODS_ROOT}/WechatOpenSDK-XCFramework" "${PODS_XCFRAMEWORKS_BUILD_DIR}/UMAPM" "${PODS_XCFRAMEWORKS_BUILD_DIR}/UMCommon" "${PODS_XCFRAMEWORKS_BUILD_DIR}/UMDevice" "${PODS_XCFRAMEWORKS_BUILD_DIR}/WechatOpenSDK-XCFramework" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardCore" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManagerSwift" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardNotification" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardReturnManager" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbar" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbarManager" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextInputViewNotification" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextView" "${PODS_ROOT}/AMap3DMap-NO-IDFA" "${PODS_ROOT}/AMapFoundation-NO-IDFA" "${PODS_ROOT}/AMapLocation-NO-IDFA" "${PODS_ROOT}/AMapSearch-NO-IDFA" "${PODS_ROOT}/UMAPM/UMAPM_2.0.7" "${PODS_ROOT}/UMCommon/UMCommon_7.5.11" "${PODS_ROOT}/UMDevice/UMDevice_3.6.0" "${PODS_ROOT}/WechatOpenSDK-XCFramework" "${PODS_XCFRAMEWORKS_BUILD_DIR}/UMAPM" "${PODS_XCFRAMEWORKS_BUILD_DIR}/UMCommon" "${PODS_XCFRAMEWORKS_BUILD_DIR}/UMDevice" "${PODS_XCFRAMEWORKS_BUILD_DIR}/WechatOpenSDK-XCFramework" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -OTHER_LDFLAGS = $(inherited) -l"c++" -l"sqlite3" -l"sqlite3.0" -l"z" -framework "CoreGraphics" -framework "CoreLocation" -framework "CoreTelephony" -framework "CoreText" -framework "ExternalAccessory" -framework "GLKit" -framework "OpenGLES" -framework "QuartzCore" -framework "Security" -framework "SystemConfiguration" -framework "UIKit" -framework "WebKit" +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardCore/IQKeyboardCore.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManagerSwift/IQKeyboardManagerSwift.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardNotification/IQKeyboardNotification.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardReturnManager/IQKeyboardReturnManager.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbar/IQKeyboardToolbar.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbarManager/IQKeyboardToolbarManager.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextInputViewNotification/IQTextInputViewNotification.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextView/IQTextView.framework/Headers" +OTHER_LDFLAGS = $(inherited) -l"c++" -l"sqlite3" -l"sqlite3.0" -l"z" -framework "Combine" -framework "CoreGraphics" -framework "CoreLocation" -framework "CoreTelephony" -framework "CoreText" -framework "ExternalAccessory" -framework "GLKit" -framework "IQKeyboardCore" -framework "IQKeyboardManagerSwift" -framework "IQKeyboardNotification" -framework "IQKeyboardReturnManager" -framework "IQKeyboardToolbar" -framework "IQKeyboardToolbarManager" -framework "IQTextInputViewNotification" -framework "IQTextView" -framework "OpenGLES" -framework "QuartzCore" -framework "Security" -framework "SystemConfiguration" -framework "UIKit" -framework "WebKit" PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_PODFILE_DIR_PATH = ${SRCROOT}/. diff --git a/suixinkan.xcodeproj/project.pbxproj b/suixinkan.xcodeproj/project.pbxproj index 0f14a8b..5988958 100644 --- a/suixinkan.xcodeproj/project.pbxproj +++ b/suixinkan.xcodeproj/project.pbxproj @@ -59,11 +59,15 @@ }; 9A01B8E22FFB84950033C402 /* Vendor */ = { isa = PBXFileSystemSynchronizedRootGroup; + exceptions = ( + ); path = Vendor; sourceTree = ""; }; A1B2C3D42FFB84950033C305 /* suixinkanTests */ = { isa = PBXFileSystemSynchronizedRootGroup; + exceptions = ( + ); path = suixinkanTests; sourceTree = ""; }; @@ -149,6 +153,7 @@ 93FF17C32FFB84950033C304 /* Resources */, 9A01B8E12FFB84950033C401 /* Embed Aliyun NUI SDK */, D83AC0A37C1CDC54D21AB6C9 /* [CP] Copy Pods Resources */, + A1898ED462DD0E19BAF114B0 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -323,6 +328,23 @@ shellScript = "set -e\nif [ \"${PLATFORM_NAME}\" = \"iphonesimulator\" ]; then\n exit 0\nfi\nFRAMEWORK_SOURCE=\"${SRCROOT}/Vendor/AliyunNui/nuisdk.framework\"\nFRAMEWORK_DEST=\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\nmkdir -p \"${FRAMEWORK_DEST}\"\nrsync -a --delete \"${FRAMEWORK_SOURCE}\" \"${FRAMEWORK_DEST}/\"\nif [ -n \"${EXPANDED_CODE_SIGN_IDENTITY}\" ]; then\n /usr/bin/codesign --force --sign \"${EXPANDED_CODE_SIGN_IDENTITY}\" --preserve-metadata=identifier,entitlements,flags \"${FRAMEWORK_DEST}/nuisdk.framework\"\nfi\n"; showEnvVarsInLog = 0; }; + A1898ED462DD0E19BAF114B0 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-suixinkan/Pods-suixinkan-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-suixinkan/Pods-suixinkan-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-suixinkan/Pods-suixinkan-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; D83AC0A37C1CDC54D21AB6C9 /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -331,14 +353,10 @@ inputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-suixinkan/Pods-suixinkan-resources-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - ); name = "[CP] Copy Pods Resources"; outputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-suixinkan/Pods-suixinkan-resources-${CONFIGURATION}-output-files.xcfilelist", ); - outputPaths = ( - ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-suixinkan/Pods-suixinkan-resources.sh\"\n"; @@ -390,7 +408,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = suixinkan/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = "随心瞰商家版"; - INFOPLIST_KEY_NSCameraUsageDescription = "需要访问相机以扫描订单核销二维码,并连接有线相机进行旅拍相册传输"; + INFOPLIST_KEY_NSCameraUsageDescription = "需要访问相机以拍摄任务素材、扫描订单核销二维码,并连接有线相机进行旅拍相册传输"; INFOPLIST_KEY_NSLocationWhenInUseUsageDescription = "需要获取您的位置信息,用于位置上报、景区距离排序及多点位核销打卡"; INFOPLIST_KEY_NSPhotoLibraryAddUsageDescription = "需要保存收款二维码、排队打卡点小程序码和云盘图片视频到相册"; INFOPLIST_KEY_NSPhotoLibraryUsageDescription = "需要访问相册以选择头像、身份证、银行卡照片和云盘上传素材"; @@ -454,7 +472,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = suixinkan/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = "随心瞰商家版"; - INFOPLIST_KEY_NSCameraUsageDescription = "需要访问相机以扫描订单核销二维码,并连接有线相机进行旅拍相册传输"; + INFOPLIST_KEY_NSCameraUsageDescription = "需要访问相机以拍摄任务素材、扫描订单核销二维码,并连接有线相机进行旅拍相册传输"; INFOPLIST_KEY_NSLocationWhenInUseUsageDescription = "需要获取您的位置信息,用于位置上报、景区距离排序及多点位核销打卡"; INFOPLIST_KEY_NSPhotoLibraryAddUsageDescription = "需要保存收款二维码、排队打卡点小程序码和云盘图片视频到相册"; INFOPLIST_KEY_NSPhotoLibraryUsageDescription = "需要访问相册以选择头像、身份证、银行卡照片和云盘上传素材"; diff --git a/suixinkan/AppDelegate.swift b/suixinkan/AppDelegate.swift index 6667d00..a0d85cf 100644 --- a/suixinkan/AppDelegate.swift +++ b/suixinkan/AppDelegate.swift @@ -1,10 +1,8 @@ // // AppDelegate.swift // suixinkan -// -// Created by hanqiu on 2026/7/6. -// - +import IQKeyboardManagerSwift +import IQKeyboardToolbarManager import UIKit @main @@ -14,6 +12,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { @objc var window: UIWindow? func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + configureKeyboardManager() UmengBootstrap.configureIfNeeded() WeChatManager.shared.registerIfNeeded() if AppStore.shared.privacyAgreementAccepted, !AppStore.shared.token.isEmpty { @@ -36,5 +35,14 @@ class AppDelegate: UIResponder, UIApplicationDelegate { // Use this method to release any resources that were specific to the discarded scenes, as they will not return. } + private func configureKeyboardManager() { + IQKeyboardManager.shared.isEnabled = true + IQKeyboardManager.shared.keyboardDistance = 12 + IQKeyboardManager.shared.resignOnTouchOutside = true + IQKeyboardToolbarManager.shared.isEnabled = true + IQKeyboardToolbarManager.shared.toolbarConfiguration.useTextInputViewTintColor = true + IQKeyboardToolbarManager.shared.toolbarConfiguration.previousNextDisplayMode = .alwaysShow + IQKeyboardToolbarManager.shared.playInputClicks = false + } } diff --git a/suixinkan/Assets.xcassets/WildPhotographerReport/report_share_cover.imageset/Contents.json b/suixinkan/Assets.xcassets/WildPhotographerReport/report_share_cover.imageset/Contents.json index cd649df..89ce108 100644 --- a/suixinkan/Assets.xcassets/WildPhotographerReport/report_share_cover.imageset/Contents.json +++ b/suixinkan/Assets.xcassets/WildPhotographerReport/report_share_cover.imageset/Contents.json @@ -1,8 +1,17 @@ { "images" : [ { - "filename" : "report_share_cover.jpg", - "idiom" : "universal" + "filename" : "report_share_cover.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" } ], "info" : { diff --git a/suixinkan/Assets.xcassets/WildPhotographerReport/report_share_cover.imageset/report_share_cover.jpg b/suixinkan/Assets.xcassets/WildPhotographerReport/report_share_cover.imageset/report_share_cover.jpg deleted file mode 100644 index c8380c0..0000000 Binary files a/suixinkan/Assets.xcassets/WildPhotographerReport/report_share_cover.imageset/report_share_cover.jpg and /dev/null differ diff --git a/suixinkan/Assets.xcassets/WildPhotographerReport/report_share_cover.imageset/report_share_cover.png b/suixinkan/Assets.xcassets/WildPhotographerReport/report_share_cover.imageset/report_share_cover.png new file mode 100644 index 0000000..8c522b0 Binary files /dev/null and b/suixinkan/Assets.xcassets/WildPhotographerReport/report_share_cover.imageset/report_share_cover.png differ diff --git a/suixinkan/Features/Task/Models/TaskModels.swift b/suixinkan/Features/Task/Models/TaskModels.swift index 633a050..235e809 100644 --- a/suixinkan/Features/Task/Models/TaskModels.swift +++ b/suixinkan/Features/Task/Models/TaskModels.swift @@ -100,11 +100,12 @@ struct TaskFileItem: Sendable, Equatable, Hashable, Identifiable { let id: String let source: TaskFileSource let cloudFile: CloudFile? - let uploadFileName: String? + var uploadFileName: String? let uploadFileType: Int let uploadTaskId: String? var uploadFileUrl: String? var uploadCoverUrl: String? + var localPreviewData: Data? var remark: String var isUploading: Bool var uploadProgress: Int @@ -117,6 +118,7 @@ struct TaskFileItem: Sendable, Equatable, Hashable, Identifiable { uploadFileName: String? = nil, uploadFileType: Int = 0, uploadCoverUrl: String? = nil, + localPreviewData: Data? = nil, remark: String = "", uploadTaskId: String? = nil, isUploading: Bool = false, @@ -137,6 +139,7 @@ struct TaskFileItem: Sendable, Equatable, Hashable, Identifiable { self.uploadFileName = uploadFileName self.uploadFileType = uploadFileType self.uploadCoverUrl = uploadCoverUrl + self.localPreviewData = localPreviewData self.remark = remark self.uploadTaskId = uploadTaskId self.isUploading = isUploading diff --git a/suixinkan/Features/Task/ViewModels/TaskAddViewModel.swift b/suixinkan/Features/Task/ViewModels/TaskAddViewModel.swift index 90ff396..a3f015c 100644 --- a/suixinkan/Features/Task/ViewModels/TaskAddViewModel.swift +++ b/suixinkan/Features/Task/ViewModels/TaskAddViewModel.swift @@ -57,11 +57,7 @@ final class TaskAddViewModel { /// 更新自定义优先级小时文本。 func updateCustomUrgentHourText(_ text: String) { let trimmed = text.trimmingCharacters(in: .whitespacesAndNewlines) - guard let hour = Int(trimmed), hour > 0 else { - urgentHour = 1 - notifyStateChange() - return - } + guard let hour = Int(trimmed), hour > 0 else { return } urgentHour = hour notifyStateChange() } @@ -117,13 +113,38 @@ final class TaskAddViewModel { notifyStateChange() } + /// 本地文件读取完成后同步真实文件名与预览图。 + func prepareUpload(uploadTaskId: String, fileName: String, localPreviewData: Data?) { + selectedFiles = selectedFiles.map { item in + guard item.uploadTaskId == uploadTaskId else { return item } + var updated = item + updated.uploadFileName = fileName + updated.localPreviewData = localPreviewData + return updated + } + notifyStateChange() + } + /// 上传成功后更新文件 URL。 - func markUploadSucceeded(uploadTaskId: String, fileURL: String, coverURL: String? = nil, autoRemarkWhenSingle: Bool) { + func markUploadSucceeded( + uploadTaskId: String, + fileURL: String, + fileName: String? = nil, + coverURL: String? = nil, + localPreviewData: Data? = nil, + autoRemarkWhenSingle: Bool + ) { selectedFiles = selectedFiles.map { item in guard item.uploadTaskId == uploadTaskId else { return item } var updated = item updated.uploadFileUrl = fileURL + if let fileName, !fileName.isEmpty { + updated.uploadFileName = fileName + } updated.uploadCoverUrl = coverURL + if let localPreviewData { + updated.localPreviewData = localPreviewData + } updated.isUploading = false updated.uploadProgress = 100 return updated diff --git a/suixinkan/Features/WildPhotographerReport/ViewModels/WildPhotographerReportViewModels.swift b/suixinkan/Features/WildPhotographerReport/ViewModels/WildPhotographerReportViewModels.swift index 3ce8c50..7b108ca 100644 --- a/suixinkan/Features/WildPhotographerReport/ViewModels/WildPhotographerReportViewModels.swift +++ b/suixinkan/Features/WildPhotographerReport/ViewModels/WildPhotographerReportViewModels.swift @@ -1168,9 +1168,27 @@ final class WildReportRiskMapViewModel { ) } - /// 生成线索分享提示。 - func shareSelectedClue() { - _ = selectedClue + /// 拉取当前选中举报线索的小程序分享载荷。 + func shareSelectedClue(api: any WildPhotographerReportServing) async -> WeChatMiniProgramSharePayload? { + guard let marker = selectedMarker, + marker.kind == .wildPhotographer || marker.kind == .processingClue, + let reportID = reportID(fromMarkerID: marker.id) + else { + errorMessage = "请选择可分享的举报线索" + notifyStateChange() + return nil + } + + do { + let shareData = try await api.reportShare(id: String(reportID)) + return shareData.payload + } catch is CancellationError { + return nil + } catch { + errorMessage = error.localizedDescription + notifyStateChange() + return nil + } } /// 生成图片预览提示。 @@ -1371,6 +1389,12 @@ final class WildReportRiskMapViewModel { ) } + private func reportID(fromMarkerID markerID: String) -> Int? { + let parts = markerID.split(separator: "-", maxSplits: 1).map(String.init) + guard parts.count == 2, let id = Int(parts[1]), id >= 1 else { return nil } + return id + } + private func mergeDetail(_ detail: WildReportMarkerDetailResponse, intoMarkerID markerID: String) { guard let index = markers.firstIndex(where: { $0.id == markerID }), case .activeClue(let oldClue) = markers[index].detail diff --git a/suixinkan/UI/Common/KeyboardAvoidingDialogView.swift b/suixinkan/UI/Common/KeyboardAvoidingDialogView.swift index 2c9fad4..4fb6043 100644 --- a/suixinkan/UI/Common/KeyboardAvoidingDialogView.swift +++ b/suixinkan/UI/Common/KeyboardAvoidingDialogView.swift @@ -6,7 +6,7 @@ import SnapKit import UIKit -/// 自定义居中弹窗的键盘避让基类,负责在键盘弹出时同步移动内容卡片。 +/// 自定义居中弹窗的兼容基类,键盘避让由全局 `IQKeyboardManager` 统一处理。 class KeyboardAvoidingDialogView: UIView { /// 需要避让键盘的弹窗内容视图,通常是白色卡片容器。 @@ -18,8 +18,6 @@ class KeyboardAvoidingDialogView: UIView { /// 内容视图与屏幕顶部、键盘顶部之间保留的最小距离。 var keyboardAvoidingMinimumSpacing: CGFloat = AppSpacing.md - private var keyboardObservers: [NSObjectProtocol] = [] - override init(frame: CGRect) { super.init(frame: frame) } @@ -29,77 +27,4 @@ class KeyboardAvoidingDialogView: UIView { fatalError("init(coder:) has not been implemented") } - deinit { - unregisterKeyboardObservers() - } - - override func didMoveToSuperview() { - super.didMoveToSuperview() - if superview == nil { - unregisterKeyboardObservers() - } else { - registerKeyboardObservers() - } - } - - private func registerKeyboardObservers() { - unregisterKeyboardObservers() - let center = NotificationCenter.default - keyboardObservers = [ - center.addObserver( - forName: UIResponder.keyboardWillChangeFrameNotification, - object: nil, - queue: .main - ) { [weak self] notification in - self?.handleKeyboardNotification(notification) - }, - center.addObserver( - forName: UIResponder.keyboardWillHideNotification, - object: nil, - queue: .main - ) { [weak self] notification in - self?.handleKeyboardNotification(notification) - } - ] - } - - private func unregisterKeyboardObservers() { - keyboardObservers.forEach(NotificationCenter.default.removeObserver) - keyboardObservers.removeAll() - } - - private func handleKeyboardNotification(_ notification: Notification) { - layoutIfNeeded() - guard let userInfo = notification.userInfo else { return } - - let duration = (userInfo[UIResponder.keyboardAnimationDurationUserInfoKey] as? NSNumber)?.doubleValue ?? 0.25 - let curveRaw = (userInfo[UIResponder.keyboardAnimationCurveUserInfoKey] as? NSNumber)?.uintValue - ?? UInt(UIView.AnimationCurve.easeInOut.rawValue) - let options = UIView.AnimationOptions(rawValue: curveRaw << 16) - - keyboardAvoidingCenterYConstraint?.update(offset: keyboardAvoidanceOffset(from: userInfo)) - UIView.animate(withDuration: duration, delay: 0, options: options) { - self.layoutIfNeeded() - } - } - - private func keyboardAvoidanceOffset(from userInfo: [AnyHashable: Any]) -> CGFloat { - guard - let contentView = keyboardAvoidingContentView, - let keyboardFrameValue = userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue - else { - return 0 - } - - let keyboardFrame = convert(keyboardFrameValue.cgRectValue, from: nil) - guard keyboardFrame.minY < bounds.height else { return 0 } - - let contentHeight = contentView.bounds.height - let baseMinY = bounds.midY - contentHeight / 2 - let baseMaxY = bounds.midY + contentHeight / 2 - let desiredBottom = keyboardFrame.minY - keyboardAvoidingMinimumSpacing - let neededShift = max(0, baseMaxY - desiredBottom) - let maxShift = max(0, baseMinY - keyboardAvoidingMinimumSpacing) - return -min(neededShift, maxShift) - } } diff --git a/suixinkan/UI/Home/AllFunctionsViewController.swift b/suixinkan/UI/Home/AllFunctionsViewController.swift index 465b688..d61a87e 100644 --- a/suixinkan/UI/Home/AllFunctionsViewController.swift +++ b/suixinkan/UI/Home/AllFunctionsViewController.swift @@ -65,7 +65,8 @@ final class AllFunctionsViewController: BaseViewController { collectionView.backgroundColor = .clear collectionView.alwaysBounceVertical = true - collectionView.allowsSelection = false + collectionView.allowsSelection = true + collectionView.delegate = self collectionView.contentInset = UIEdgeInsets( top: AppSpacing.xs, left: 0, @@ -131,20 +132,12 @@ final class AllFunctionsViewController: BaseViewController { private func makeDataSource() -> UICollectionViewDiffableDataSource { let dataSource = UICollectionViewDiffableDataSource( collectionView: collectionView - ) { [weak self] collectionView, indexPath, item in + ) { collectionView, indexPath, item in let cell = collectionView.dequeueReusableCell( withReuseIdentifier: AllFunctionMenuCell.reuseIdentifier, for: indexPath ) as! AllFunctionMenuCell cell.apply(menu: item.menu, actionStyle: item.actionStyle) - cell.onActionTap = { - switch item.section { - case .common: - self?.viewModel.removeFromCommon(item.menu) - case .more: - self?.viewModel.addToCommon(item.menu) - } - } return cell } @@ -214,6 +207,21 @@ final class AllFunctionsViewController: BaseViewController { } } +extension AllFunctionsViewController: UICollectionViewDelegate { + + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + guard let item = dataSource.itemIdentifier(for: indexPath) else { return } + collectionView.deselectItem(at: indexPath, animated: true) + + switch item.section { + case .common: + viewModel.removeFromCommon(item.menu) + case .more: + viewModel.addToCommon(item.menu) + } + } +} + /// 全部功能页分区标题。 private final class AllFunctionSectionHeaderView: UICollectionReusableView { diff --git a/suixinkan/UI/Home/Views/AllFunctionMenuCell.swift b/suixinkan/UI/Home/Views/AllFunctionMenuCell.swift index e84ddf4..026bf14 100644 --- a/suixinkan/UI/Home/Views/AllFunctionMenuCell.swift +++ b/suixinkan/UI/Home/Views/AllFunctionMenuCell.swift @@ -6,24 +6,29 @@ import SnapKit import UIKit -/// 全部功能页菜单卡片,支持右上角添加或移除操作。 +/// 全部功能页菜单卡片,整张卡片响应选择,右上角图标仅展示添加或移除状态。 final class AllFunctionMenuCell: UICollectionViewCell { static let reuseIdentifier = "AllFunctionMenuCell" + /// 卡片右上角展示的操作状态。 enum ActionStyle { case none case add case remove } - var onActionTap: (() -> Void)? - private let cardView = UIView() private let contentStackView = UIStackView() private let iconView = UIImageView() private let titleLabel = UILabel() - private let actionButton = UIButton(type: .system) + private let actionImageView = UIImageView() + + override var isHighlighted: Bool { + didSet { + cardView.alpha = isHighlighted ? 0.72 : 1 + } + } override init(frame: CGRect) { super.init(frame: frame) @@ -35,26 +40,29 @@ final class AllFunctionMenuCell: UICollectionViewCell { fatalError("init(coder:) has not been implemented") } - override func prepareForReuse() { - super.prepareForReuse() - onActionTap = nil - } - + /// 更新菜单内容、操作状态及整张卡片的无障碍语义。 func apply(menu: HomeMenuItem, actionStyle: ActionStyle) { iconView.image = UIImage(systemName: menu.iconName) titleLabel.text = menu.title + accessibilityLabel = menu.title switch actionStyle { case .none: - actionButton.isHidden = true + actionImageView.isHidden = true + accessibilityTraits = [] + accessibilityHint = nil case .add: - actionButton.isHidden = false - actionButton.setImage(UIImage(systemName: "plus.circle.fill"), for: .normal) - actionButton.tintColor = AppColor.primary + actionImageView.isHidden = false + actionImageView.image = UIImage(systemName: "plus.circle.fill") + actionImageView.tintColor = AppColor.primary + accessibilityTraits = .button + accessibilityHint = "添加到常用应用" case .remove: - actionButton.isHidden = false - actionButton.setImage(UIImage(systemName: "minus.circle.fill"), for: .normal) - actionButton.tintColor = AppColor.danger + actionImageView.isHidden = false + actionImageView.image = UIImage(systemName: "minus.circle.fill") + actionImageView.tintColor = AppColor.danger + accessibilityTraits = .button + accessibilityHint = "移出常用应用" } } @@ -78,11 +86,13 @@ final class AllFunctionMenuCell: UICollectionViewCell { titleLabel.textAlignment = .center titleLabel.numberOfLines = 2 - actionButton.addTarget(self, action: #selector(actionTapped), for: .touchUpInside) + isAccessibilityElement = true + actionImageView.contentMode = .scaleAspectFit + actionImageView.isUserInteractionEnabled = false contentView.addSubview(cardView) cardView.addSubview(contentStackView) - cardView.addSubview(actionButton) + cardView.addSubview(actionImageView) contentStackView.addArrangedSubview(iconView) contentStackView.addArrangedSubview(titleLabel) @@ -96,13 +106,9 @@ final class AllFunctionMenuCell: UICollectionViewCell { iconView.snp.makeConstraints { make in make.width.height.equalTo(26) } - actionButton.snp.makeConstraints { make in + actionImageView.snp.makeConstraints { make in make.top.trailing.equalToSuperview().inset(AppSpacing.xxs) make.width.height.equalTo(20) } } - - @objc private func actionTapped() { - onActionTap?() - } } diff --git a/suixinkan/UI/LocationReport/Views/LocationReportViews.swift b/suixinkan/UI/LocationReport/Views/LocationReportViews.swift index 4d5965c..28ca24c 100644 --- a/suixinkan/UI/LocationReport/Views/LocationReportViews.swift +++ b/suixinkan/UI/LocationReport/Views/LocationReportViews.swift @@ -13,12 +13,14 @@ final class LocationReportMapControlStack: UIView { var onZoomIn: (() -> Void)? var onZoomOut: (() -> Void)? var onRelocate: (() -> Void)? + private weak var relocateButton: UIButton? override init(frame: CGRect) { super.init(frame: frame) let zoomIn = makeButton(symbol: "plus", action: #selector(zoomInTapped)) let zoomOut = makeButton(symbol: "minus", action: #selector(zoomOutTapped)) let relocate = makeButton(symbol: "location.fill", action: #selector(relocateTapped)) + relocateButton = relocate let zoomStack = UIStackView(arrangedSubviews: [zoomIn, zoomOut]) zoomStack.axis = .vertical @@ -44,6 +46,12 @@ final class LocationReportMapControlStack: UIView { } } + /// 更新定位按钮是否可用。 + func setRelocateEnabled(_ isEnabled: Bool) { + relocateButton?.isEnabled = isEnabled + relocateButton?.alpha = isEnabled ? 1 : 0.46 + } + @available(*, unavailable) required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") diff --git a/suixinkan/UI/Task/CloudStoragePickForTaskViewController.swift b/suixinkan/UI/Task/CloudStoragePickForTaskViewController.swift index da7a451..874577b 100644 --- a/suixinkan/UI/Task/CloudStoragePickForTaskViewController.swift +++ b/suixinkan/UI/Task/CloudStoragePickForTaskViewController.swift @@ -18,10 +18,16 @@ final class CloudStoragePickForTaskViewController: BaseViewController { private let searchField = UITextField() private let pathScrollView = UIScrollView() private let pathStack = UIStackView() + private let filterBar = UIStackView() + private let sortButton = UIButton(type: .system) + private let typeButton = UIButton(type: .system) + private let displayModeButton = UIButton(type: .system) + private let refreshControl = UIRefreshControl() private var collectionView: UICollectionView! private var dataSource: UICollectionViewDiffableDataSource! private let confirmButton = AppButton(title: "确定") private let bottomBar = UIView() + private var isGridMode = true /// 初始化云盘多选页,可按云盘文件类型限制选择范围。 init(importedFileIDs: Set = [], allowedFileType: Int? = nil) { @@ -35,7 +41,7 @@ final class CloudStoragePickForTaskViewController: BaseViewController { } override func setupNavigationBar() { - title = "云盘导入" + title = "相册云盘" } override func setupUI() { @@ -54,10 +60,26 @@ final class CloudStoragePickForTaskViewController: BaseViewController { make.height.equalToSuperview() } + configureMenuButton(sortButton, imageName: "arrow.up.arrow.down") + configureMenuButton(typeButton, imageName: "line.3.horizontal.decrease") + displayModeButton.tintColor = AppColor.textSecondary + displayModeButton.backgroundColor = AppColor.inputBackground + displayModeButton.layer.cornerRadius = AppRadius.xs + displayModeButton.addTarget(self, action: #selector(displayModeTapped), for: .touchUpInside) + + filterBar.axis = .horizontal + filterBar.spacing = AppSpacing.sm + filterBar.distribution = .fill + filterBar.addArrangedSubview(sortButton) + filterBar.addArrangedSubview(typeButton) + filterBar.addArrangedSubview(displayModeButton) + collectionView = UICollectionView(frame: .zero, collectionViewLayout: makeLayout()) collectionView.backgroundColor = AppColor.pageBackground collectionView.register(CloudPickCell.self, forCellWithReuseIdentifier: CloudPickCell.reuseIdentifier) collectionView.delegate = self + collectionView.refreshControl = refreshControl + refreshControl.addTarget(self, action: #selector(refreshTriggered), for: .valueChanged) dataSource = UICollectionViewDiffableDataSource(collectionView: collectionView) { [weak self] collectionView, indexPath, fileID in @@ -69,7 +91,8 @@ final class CloudStoragePickForTaskViewController: BaseViewController { cell.apply( file: file, isSelected: self?.viewModel.isSelected(fileID) == true, - isImported: self?.viewModel.isImported(fileID) == true + isImported: self?.viewModel.isImported(fileID) == true, + isGridMode: self?.isGridMode == true ) } return cell @@ -78,6 +101,7 @@ final class CloudStoragePickForTaskViewController: BaseViewController { bottomBar.backgroundColor = .white view.addSubview(searchField) view.addSubview(pathScrollView) + view.addSubview(filterBar) view.addSubview(collectionView) view.addSubview(bottomBar) bottomBar.addSubview(confirmButton) @@ -94,6 +118,13 @@ final class CloudStoragePickForTaskViewController: BaseViewController { make.leading.trailing.equalToSuperview().inset(AppSpacing.md) make.height.equalTo(28) } + filterBar.snp.makeConstraints { make in + make.top.equalTo(pathScrollView.snp.bottom).offset(AppSpacing.sm) + make.leading.trailing.equalToSuperview().inset(AppSpacing.md) + make.height.equalTo(36) + } + sortButton.snp.makeConstraints { make in make.width.equalTo(typeButton) } + displayModeButton.snp.makeConstraints { make in make.width.equalTo(36) } bottomBar.snp.makeConstraints { make in make.leading.trailing.bottom.equalToSuperview() } @@ -101,7 +132,7 @@ final class CloudStoragePickForTaskViewController: BaseViewController { make.edges.equalToSuperview().inset(AppSpacing.md) } collectionView.snp.makeConstraints { make in - make.top.equalTo(pathScrollView.snp.bottom).offset(AppSpacing.sm) + make.top.equalTo(filterBar.snp.bottom).offset(AppSpacing.md) make.leading.trailing.equalToSuperview() make.bottom.equalTo(bottomBar.snp.top) } @@ -125,15 +156,24 @@ final class CloudStoragePickForTaskViewController: BaseViewController { @MainActor private func applyViewModel() { rebuildPathButtons() + rebuildFilterMenus() var snapshot = NSDiffableDataSourceSnapshot() snapshot.appendSections([0]) snapshot.appendItems(viewModel.files.map(\.id)) + let existingItems = Set(dataSource.snapshot().itemIdentifiers) + let itemsToReconfigure = snapshot.itemIdentifiers.filter(existingItems.contains) + snapshot.reconfigureItems(itemsToReconfigure) dataSource.apply(snapshot, animatingDifferences: false) + let selectedCount = viewModel.selectedFileList.count + confirmButton.setTitle(selectedCount > 0 ? "确认选择(\(selectedCount))" : "确认选择", for: .normal) if viewModel.isLoading && viewModel.files.isEmpty { showLoading() } else { hideLoading() } + if !viewModel.isRefreshing { + refreshControl.endRefreshing() + } } private func rebuildPathButtons() { @@ -160,26 +200,81 @@ final class CloudStoragePickForTaskViewController: BaseViewController { } @objc private func confirmTapped() { + guard !viewModel.selectedFileList.isEmpty else { + showToast("请至少选择一个文件") + return + } onConfirmed?(viewModel.selectedFileList) navigationController?.popViewController(animated: true) } + @objc private func refreshTriggered() { + Task { await viewModel.refresh(api: taskAPI) } + } + + @objc private func displayModeTapped() { + isGridMode.toggle() + collectionView.setCollectionViewLayout(makeLayout(), animated: true) + applyViewModel() + } + + private func configureMenuButton(_ button: UIButton, imageName: String) { + button.tintColor = AppColor.textSecondary + button.backgroundColor = AppColor.inputBackground + button.layer.cornerRadius = AppRadius.xs + button.contentHorizontalAlignment = .leading + button.titleLabel?.font = .app(.body) + button.setTitleColor(AppColor.textPrimary, for: .normal) + button.setImage(UIImage(systemName: imageName), for: .normal) + button.semanticContentAttribute = .forceRightToLeft + button.showsMenuAsPrimaryAction = true + } + + private func rebuildFilterMenus() { + let sortItems = [(1, "创建时间顺序"), (2, "创建时间倒序")] + sortButton.setTitle(sortItems.first(where: { $0.0 == viewModel.sortType })?.1 ?? "排序", for: .normal) + sortButton.menu = UIMenu(children: sortItems.map { value, title in + UIAction(title: title, state: value == viewModel.sortType ? .on : .off) { [weak self] _ in + guard let self else { return } + self.viewModel.updateSortType(value) + Task { await self.viewModel.refresh(api: self.taskAPI) } + } + }) + + let typeItems = [(0, "全部"), (2, "图片"), (1, "视频"), (99, "文件夹")] + typeButton.setTitle(typeItems.first(where: { $0.0 == viewModel.filterType })?.1 ?? "全部", for: .normal) + typeButton.menu = UIMenu(children: typeItems.map { value, title in + UIAction(title: title, state: value == viewModel.filterType ? .on : .off) { [weak self] _ in + guard let self else { return } + self.viewModel.updateFilterType(value) + Task { await self.viewModel.refresh(api: self.taskAPI) } + } + }) + displayModeButton.setImage( + UIImage(systemName: isGridMode ? "list.bullet" : "square.grid.2x2"), + for: .normal + ) + displayModeButton.accessibilityLabel = isGridMode ? "列表显示" : "宫格显示" + } + private func makeLayout() -> UICollectionViewCompositionalLayout { - UICollectionViewCompositionalLayout { _, environment in - let columns = 3 + let isGridMode = isGridMode + return UICollectionViewCompositionalLayout { _, environment in + let columns = isGridMode ? 2 : 1 let spacing: CGFloat = 8 let inset = AppSpacing.md * 2 let availableWidth = environment.container.effectiveContentSize.width - inset let totalSpacing = spacing * CGFloat(columns - 1) let itemWidth = max(0, (availableWidth - totalSpacing) / CGFloat(columns)) + let itemHeight = isGridMode ? itemWidth + 38 : 72 let itemSize = NSCollectionLayoutSize( widthDimension: .absolute(itemWidth), - heightDimension: .absolute(itemWidth) + heightDimension: .absolute(itemHeight) ) let item = NSCollectionLayoutItem(layoutSize: itemSize) let groupSize = NSCollectionLayoutSize( widthDimension: .fractionalWidth(1), - heightDimension: .absolute(itemWidth) + heightDimension: .absolute(itemHeight) ) let group = NSCollectionLayoutGroup.horizontal( layoutSize: groupSize, @@ -297,12 +392,37 @@ private final class CloudPickCell: UICollectionViewCell { contentView.alpha = 1 } - func apply(file: CloudFile, isSelected: Bool, isImported: Bool) { + func apply(file: CloudFile, isSelected: Bool, isImported: Bool, isGridMode: Bool) { nameLabel.text = file.name contentView.layer.borderWidth = isSelected ? 2 : 0 contentView.layer.borderColor = AppColor.primary.cgColor badgeView.isHidden = !isSelected + if isGridMode { + imageView.snp.remakeConstraints { make in + make.top.leading.trailing.equalToSuperview() + make.height.equalTo(imageView.snp.width) + } + nameLabel.textAlignment = .center + nameLabel.numberOfLines = 2 + nameLabel.snp.remakeConstraints { make in + make.top.equalTo(imageView.snp.bottom).offset(AppSpacing.xxs) + make.leading.trailing.bottom.equalToSuperview().inset(AppSpacing.xxs) + } + } else { + imageView.snp.remakeConstraints { make in + make.top.bottom.leading.equalToSuperview() + make.width.equalTo(imageView.snp.height) + } + nameLabel.textAlignment = .left + nameLabel.numberOfLines = 2 + nameLabel.snp.remakeConstraints { make in + make.leading.equalTo(imageView.snp.trailing).offset(AppSpacing.sm) + make.trailing.equalToSuperview().inset(AppSpacing.sm) + make.centerY.equalToSuperview() + } + } + if file.isFolder { contentView.alpha = 1 imageView.image = nil diff --git a/suixinkan/UI/Task/TaskAddViewController.swift b/suixinkan/UI/Task/TaskAddViewController.swift index a86bdd3..0cb17ed 100644 --- a/suixinkan/UI/Task/TaskAddViewController.swift +++ b/suixinkan/UI/Task/TaskAddViewController.swift @@ -3,6 +3,7 @@ // suixinkan // +import AVFoundation import PhotosUI import SnapKit import UIKit @@ -108,6 +109,9 @@ final class TaskAddViewController: BaseViewController { prioritySection.onCustomHourTextChange = { [weak self] text in self?.viewModel.updateCustomUrgentHourText(text) } + prioritySection.onShowMessage = { [weak self] message in + self?.showToast(message) + } orderButton.addTarget(self, action: #selector(openOrderSelect), for: .touchUpInside) nameField.textField.addTarget(self, action: #selector(nameChanged), for: .editingChanged) @@ -181,12 +185,14 @@ final class TaskAddViewController: BaseViewController { guard uploadTypeSheet == nil else { return } let sheet = TaskUploadTypeSheetView(frame: view.bounds) sheet.onChooseImage = { [weak self] in - self?.hideUploadTypeSheet() - self?.presentMediaPicker(isImage: true) + self?.hideUploadTypeSheet { + self?.presentLocalSourcePicker(isImage: true) + } } sheet.onChooseVideo = { [weak self] in - self?.hideUploadTypeSheet() - self?.presentMediaPicker(isImage: false) + self?.hideUploadTypeSheet { + self?.presentLocalSourcePicker(isImage: false) + } } sheet.onCancel = { [weak self] in self?.hideUploadTypeSheet() @@ -197,13 +203,29 @@ final class TaskAddViewController: BaseViewController { sheet.show() } - private func hideUploadTypeSheet() { + private func hideUploadTypeSheet(completion: (() -> Void)? = nil) { uploadTypeSheet?.dismiss { [weak self] in self?.uploadTypeSheet?.removeFromSuperview() self?.uploadTypeSheet = nil + completion?() } } + private func presentLocalSourcePicker(isImage: Bool) { + pickingMediaType = isImage ? 2 : 1 + let sheet = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet) + if UIImagePickerController.isSourceTypeAvailable(.camera) { + sheet.addAction(UIAlertAction(title: isImage ? "拍照" : "拍摄视频", style: .default) { [weak self] _ in + self?.presentCamera(isImage: isImage) + }) + } + sheet.addAction(UIAlertAction(title: "从相册选择", style: .default) { [weak self] _ in + self?.presentMediaPicker(isImage: isImage) + }) + sheet.addAction(UIAlertAction(title: "取消", style: .cancel)) + present(sheet, animated: true) + } + private func presentMediaPicker(isImage: Bool) { pickingMediaType = isImage ? 2 : 1 var configuration = PHPickerConfiguration(photoLibrary: .shared()) @@ -214,6 +236,18 @@ final class TaskAddViewController: BaseViewController { present(picker, animated: true) } + private func presentCamera(isImage: Bool) { + let picker = UIImagePickerController() + picker.sourceType = .camera + picker.delegate = self + picker.mediaTypes = [isImage ? UTType.image.identifier : UTType.movie.identifier] + picker.cameraCaptureMode = isImage ? .photo : .video + if !isImage { + picker.videoQuality = .typeHigh + } + present(picker, animated: true) + } + private func confirmDelete(file: TaskFileItem) { let alert = UIAlertController(title: "删除确认", message: "确定要删除此文件吗?", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "取消", style: .cancel)) @@ -279,47 +313,97 @@ final class TaskAddViewController: BaseViewController { return } let totalCount = results.count - for (index, result) in results.enumerated() { + for result in results { let uploadTaskId = UUID().uuidString.replacingOccurrences(of: "-", with: "") - let placeholder = viewModel.addUploadPlaceholder( - fileName: "upload_\(uploadTaskId).\(isImage ? "jpg" : "mp4")", + viewModel.addUploadPlaceholder( + fileName: TaskMediaLoader.suggestedFileName( + from: result.itemProvider, + fallback: "upload_\(uploadTaskId).\(isImage ? "jpg" : "mp4")" + ), fileType: isImage ? 2 : 1, uploadTaskId: uploadTaskId ) Task { do { let payload = try await TaskMediaLoader.load(from: result, isImage: isImage) - let fileURL = try await ossUploadService.uploadTaskFile( - data: payload.data, - fileName: payload.fileName, + await uploadPayload( + payload, fileType: isImage ? 2 : 1, + uploadTaskId: uploadTaskId, + totalCount: totalCount, scenicId: scenicId - ) { [weak self] progress in - Task { @MainActor in - self?.viewModel.updateUploadProgress(uploadTaskId: uploadTaskId, progress: progress) - } - } - await MainActor.run { - self.viewModel.markUploadSucceeded( - uploadTaskId: uploadTaskId, - fileURL: fileURL, - autoRemarkWhenSingle: totalCount == 1 - ) - if totalCount == 1, let fileID = self.viewModel.consumePendingRemarkFileID() { - self.viewModel.presentRemarkDialog(for: fileID) - } - } + ) } catch { await MainActor.run { self.viewModel.markUploadFailed(uploadTaskId: uploadTaskId) self.showToast(error.localizedDescription) } } - _ = placeholder - _ = index } } } + + private func uploadCapturedPayload(_ payload: TaskMediaLoader.Payload, fileType: Int) { + let scenicId = AppStore.shared.currentScenicId + guard scenicId > 0 else { + showToast("请先选择景区") + return + } + let uploadTaskId = UUID().uuidString.replacingOccurrences(of: "-", with: "") + viewModel.addUploadPlaceholder( + fileName: payload.fileName, + fileType: fileType, + uploadTaskId: uploadTaskId + ) + Task { + await uploadPayload( + payload, + fileType: fileType, + uploadTaskId: uploadTaskId, + totalCount: 1, + scenicId: scenicId + ) + } + } + + private func uploadPayload( + _ payload: TaskMediaLoader.Payload, + fileType: Int, + uploadTaskId: String, + totalCount: Int, + scenicId: Int + ) async { + viewModel.prepareUpload( + uploadTaskId: uploadTaskId, + fileName: payload.fileName, + localPreviewData: payload.previewData + ) + do { + let fileURL = try await ossUploadService.uploadTaskFile( + data: payload.data, + fileName: payload.fileName, + fileType: fileType, + scenicId: scenicId + ) { [weak self] progress in + Task { @MainActor in + self?.viewModel.updateUploadProgress(uploadTaskId: uploadTaskId, progress: progress) + } + } + viewModel.markUploadSucceeded( + uploadTaskId: uploadTaskId, + fileURL: fileURL, + fileName: payload.fileName, + localPreviewData: payload.previewData, + autoRemarkWhenSingle: totalCount == 1 + ) + if totalCount == 1, let fileID = viewModel.consumePendingRemarkFileID() { + viewModel.presentRemarkDialog(for: fileID) + } + } catch { + viewModel.markUploadFailed(uploadTaskId: uploadTaskId) + showToast(error.localizedDescription) + } + } } extension TaskAddViewController: PHPickerViewControllerDelegate { @@ -330,6 +414,32 @@ extension TaskAddViewController: PHPickerViewControllerDelegate { } } +extension TaskAddViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate { + func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { + picker.dismiss(animated: true) + } + + func imagePickerController( + _ picker: UIImagePickerController, + didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any] + ) { + picker.dismiss(animated: true) + if pickingMediaType == 1, + let url = info[.mediaURL] as? URL, + let payload = try? TaskMediaLoader.videoPayload(from: url) { + uploadCapturedPayload(payload, fileType: 1) + return + } + if let image = info[.originalImage] as? UIImage, + let payload = TaskMediaLoader.imagePayload( + from: image, + fileName: "image_\(Int(Date().timeIntervalSince1970)).jpg" + ) { + uploadCapturedPayload(payload, fileType: 2) + } + } +} + extension TaskAddViewController: UITextViewDelegate { func textViewDidBeginEditing(_ textView: UITextView) { if textView.textColor == AppColor.textTertiary { @@ -354,9 +464,24 @@ extension TaskAddViewController: UITextViewDelegate { /// 从 PHPicker 结果加载上传数据。 enum TaskMediaLoader { + /// 已读取、可直接上传的任务素材。 struct Payload { let data: Data let fileName: String + let previewData: Data? + } + + /// 优先使用系统相册提供的原文件名。 + static func suggestedFileName(from provider: NSItemProvider, fallback: String) -> String { + guard let suggestedName = provider.suggestedName?.trimmingCharacters(in: .whitespacesAndNewlines), + !suggestedName.isEmpty else { + return fallback + } + if !URL(fileURLWithPath: suggestedName).pathExtension.isEmpty { + return suggestedName + } + let fallbackExtension = URL(fileURLWithPath: fallback).pathExtension + return fallbackExtension.isEmpty ? suggestedName : "\(suggestedName).\(fallbackExtension)" } static func load(from result: PHPickerResult, isImage: Bool) async throws -> Payload { @@ -369,21 +494,24 @@ enum TaskMediaLoader { private static func loadImage(from provider: NSItemProvider) async throws -> Payload { try await withCheckedThrowingContinuation { continuation in - if provider.canLoadObject(ofClass: UIImage.self) { - provider.loadObject(ofClass: UIImage.self) { object, error in - if let error { - continuation.resume(throwing: error) - return - } - guard let image = object as? UIImage, let data = image.jpegData(compressionQuality: 0.9) else { - continuation.resume(throwing: OSSUploadError.emptyFile) - return - } - continuation.resume(returning: Payload(data: data, fileName: "image_\(UUID().uuidString).jpg")) + let identifier = provider.registeredTypeIdentifiers.first { + UTType($0)?.conforms(to: .image) == true + } ?? UTType.image.identifier + provider.loadFileRepresentation(forTypeIdentifier: identifier) { url, error in + if let error { + continuation.resume(throwing: error) + return } - return + guard let url, let data = try? Data(contentsOf: url), !data.isEmpty else { + continuation.resume(throwing: OSSUploadError.emptyFile) + return + } + let ext = url.pathExtension.isEmpty ? "jpg" : url.pathExtension + let fallback = "image_\(UUID().uuidString).\(ext)" + let fileName = suggestedFileName(from: provider, fallback: fallback) + let previewData = UIImage(data: data).flatMap(makePreviewData(from:)) + continuation.resume(returning: Payload(data: data, fileName: fileName, previewData: previewData)) } - continuation.resume(throwing: OSSUploadError.unsupportedFileType) } } @@ -400,8 +528,49 @@ enum TaskMediaLoader { return } let ext = url.pathExtension.isEmpty ? "mp4" : url.pathExtension - continuation.resume(returning: Payload(data: data, fileName: "video_\(UUID().uuidString).\(ext)")) + let fallback = "video_\(UUID().uuidString).\(ext)" + let fileName = suggestedFileName(from: provider, fallback: fallback) + continuation.resume(returning: Payload( + data: data, + fileName: fileName, + previewData: makeVideoPreviewData(from: url) + )) } } } + + /// 把相机照片转换为上传素材。 + static func imagePayload(from image: UIImage, fileName: String) -> Payload? { + guard let data = image.jpegData(compressionQuality: 0.9) else { return nil } + return Payload(data: data, fileName: fileName, previewData: makePreviewData(from: image)) + } + + /// 读取相机拍摄的视频及缩略图。 + static func videoPayload(from url: URL) throws -> Payload { + let data = try Data(contentsOf: url) + guard !data.isEmpty else { throw OSSUploadError.emptyFile } + let ext = url.pathExtension.isEmpty ? "mov" : url.pathExtension + let fileName = url.lastPathComponent.isEmpty + ? "video_\(UUID().uuidString).\(ext)" + : url.lastPathComponent + return Payload(data: data, fileName: fileName, previewData: makeVideoPreviewData(from: url)) + } + + private static func makePreviewData(from image: UIImage) -> Data? { + let maxLength: CGFloat = 600 + let scale = min(1, maxLength / max(image.size.width, image.size.height)) + let size = CGSize(width: image.size.width * scale, height: image.size.height * scale) + let renderer = UIGraphicsImageRenderer(size: size) + let preview = renderer.image { _ in + image.draw(in: CGRect(origin: .zero, size: size)) + } + return preview.jpegData(compressionQuality: 0.72) + } + + private static func makeVideoPreviewData(from url: URL) -> Data? { + let generator = AVAssetImageGenerator(asset: AVAsset(url: url)) + generator.appliesPreferredTrackTransform = true + guard let image = try? generator.copyCGImage(at: .zero, actualTime: nil) else { return nil } + return makePreviewData(from: UIImage(cgImage: image)) + } } diff --git a/suixinkan/UI/Task/Views/TaskAddViews.swift b/suixinkan/UI/Task/Views/TaskAddViews.swift index a31dad9..00e6c5c 100644 --- a/suixinkan/UI/Task/Views/TaskAddViews.swift +++ b/suixinkan/UI/Task/Views/TaskAddViews.swift @@ -3,6 +3,7 @@ // suixinkan // +import AVFoundation import Kingfisher import SnapKit import UIKit @@ -139,6 +140,9 @@ final class TaskAddMediaSectionView: UIView { var snapshot = NSDiffableDataSourceSnapshot() snapshot.appendSections([.main]) snapshot.appendItems(files.map { Item.file($0.id) } + [.add]) + let existingItems = Set(dataSource.snapshot().itemIdentifiers) + let itemsToReconfigure = snapshot.itemIdentifiers.filter(existingItems.contains) + snapshot.reconfigureItems(itemsToReconfigure) dataSource.apply(snapshot, animatingDifferences: false) updateCollectionHeight(itemCount: files.count + 1) } @@ -320,7 +324,10 @@ final class TaskAddMediaCell: UICollectionViewCell { func apply(file: TaskFileItem) { let urlString = file.previewURLString - if let url = URL(string: urlString), !urlString.isEmpty { + if let localPreviewData = file.localPreviewData, + let localImage = UIImage(data: localPreviewData) { + imageView.image = localImage + } else if let url = URL(string: urlString), !urlString.isEmpty { imageView.kf.setImage(with: url) } else { imageView.image = UIImage(systemName: "photo") @@ -391,6 +398,7 @@ final class TaskPrioritySectionView: UIView { var onUrgentHourChange: ((Int) -> Void)? var onCustomHourTextChange: ((String) -> Void)? + var onShowMessage: ((String) -> Void)? private let titleLabel = UILabel() private let noneButton = UIButton(type: .system) @@ -401,6 +409,8 @@ final class TaskPrioritySectionView: UIView { private let optionRow = UIStackView() private let customRow = UIStackView() private let stackView = UIStackView() + private var customHourText = "" + private var lastUrgentHour = 0 override init(frame: CGRect) { super.init(frame: frame) @@ -426,6 +436,7 @@ final class TaskPrioritySectionView: UIView { customField.layer.cornerRadius = AppRadius.sm customField.layer.borderWidth = 1 customField.layer.borderColor = AppColor.border.cgColor + customField.delegate = self customField.leftView = UIView(frame: CGRect(x: 0, y: 0, width: AppSpacing.sm, height: 1)) customField.leftViewMode = .always customField.addTarget(self, action: #selector(customFieldChanged), for: .editingChanged) @@ -480,15 +491,21 @@ final class TaskPrioritySectionView: UIView { func apply(urgentHour: Int) { let isCustom = urgentHour > 0 && urgentHour != 2 + let wasCustom = lastUrgentHour > 0 && lastUrgentHour != 2 styleOption(noneButton, selected: urgentHour == 0) styleOption(twoHourButton, selected: urgentHour == 2) styleOption(customButton, selected: isCustom) customRow.isHidden = !isCustom if isCustom { - customField.text = "\(urgentHour)" + if !wasCustom || urgentHour != lastUrgentHour { + customHourText = "\(urgentHour)" + } + customField.text = customHourText } else { + customHourText = "" customField.text = "" } + lastUrgentHour = urgentHour } private func configureOptionButton(_ button: UIButton, title: String) { @@ -506,14 +523,31 @@ final class TaskPrioritySectionView: UIView { @objc private func noneTapped() { onUrgentHourChange?(0) } @objc private func twoHourTapped() { onUrgentHourChange?(2) } @objc private func customTapped() { + guard lastUrgentHour <= 0 || lastUrgentHour == 2 else { return } onUrgentHourChange?(1) onCustomHourTextChange?("1") } @objc private func customFieldChanged() { - onCustomHourTextChange?(customField.text ?? "") + customHourText = customField.text ?? "" + onCustomHourTextChange?(customHourText) } @objc private func customConfirmTapped() { - onCustomHourTextChange?(customField.text ?? "") + guard let hour = Int(customHourText), hour > 0 else { + onShowMessage?("请输入有效的正整数") + return + } + onCustomHourTextChange?(customHourText) + onShowMessage?("加急\(hour)小时") + } +} + +extension TaskPrioritySectionView: UITextFieldDelegate { + func textField( + _ textField: UITextField, + shouldChangeCharactersIn range: NSRange, + replacementString string: String + ) -> Bool { + string.isEmpty || string.allSatisfy(\.isNumber) } } @@ -573,7 +607,9 @@ final class TaskFileRemarkDialogView: KeyboardAvoidingDialogView { private let containerView = UIView() private let titleLabel = UILabel() + private let previewContainerView = UIView() private let previewView = UIImageView() + private let videoView = TaskRemarkVideoView() private let remarkTitleLabel = UILabel() private let textView = UITextView() private let placeholderLabel = UILabel() @@ -599,6 +635,10 @@ final class TaskFileRemarkDialogView: KeyboardAvoidingDialogView { previewView.layer.cornerRadius = AppRadius.lg previewView.backgroundColor = AppColor.inputBackground + previewContainerView.backgroundColor = AppColor.inputBackground + previewContainerView.layer.cornerRadius = AppRadius.lg + previewContainerView.clipsToBounds = true + remarkTitleLabel.text = "备注信息" remarkTitleLabel.font = .app(.caption) remarkTitleLabel.textColor = AppColor.textPrimary @@ -640,7 +680,9 @@ final class TaskFileRemarkDialogView: KeyboardAvoidingDialogView { addSubview(containerView) containerView.addSubview(titleLabel) - containerView.addSubview(previewView) + containerView.addSubview(previewContainerView) + previewContainerView.addSubview(previewView) + previewContainerView.addSubview(videoView) containerView.addSubview(remarkTitleLabel) containerView.addSubview(countLabel) containerView.addSubview(textView) @@ -655,13 +697,15 @@ final class TaskFileRemarkDialogView: KeyboardAvoidingDialogView { titleLabel.snp.makeConstraints { make in make.top.leading.equalToSuperview().offset(AppSpacing.md) } - previewView.snp.makeConstraints { make in + previewContainerView.snp.makeConstraints { make in make.top.equalTo(titleLabel.snp.bottom).offset(AppSpacing.sm) make.leading.trailing.equalToSuperview().inset(AppSpacing.md) - make.height.equalTo(previewView.snp.width) + make.height.equalTo(previewContainerView.snp.width) } + previewView.snp.makeConstraints { make in make.edges.equalToSuperview() } + videoView.snp.makeConstraints { make in make.edges.equalToSuperview() } remarkTitleLabel.snp.makeConstraints { make in - make.top.equalTo(previewView.snp.bottom).offset(AppSpacing.md) + make.top.equalTo(previewContainerView.snp.bottom).offset(AppSpacing.md) make.leading.equalToSuperview().offset(AppSpacing.md) } countLabel.snp.makeConstraints { make in @@ -701,8 +745,23 @@ final class TaskFileRemarkDialogView: KeyboardAvoidingDialogView { textView.text = text countLabel.text = "\(text.count)/50" placeholderLabel.isHidden = !text.isEmpty + if file.fileType == 1, + let url = URL(string: file.uploadFileUrl ?? file.cloudFile?.fileUrl ?? ""), + !url.absoluteString.isEmpty { + previewView.isHidden = true + videoView.isHidden = false + videoView.configure(url: url) + return + } + + videoView.stop() + videoView.isHidden = true + previewView.isHidden = false let urlString = file.previewURLString - if let url = URL(string: urlString), !urlString.isEmpty { + if let localPreviewData = file.localPreviewData, + let localImage = UIImage(data: localPreviewData) { + previewView.image = localImage + } else if let url = URL(string: urlString), !urlString.isEmpty { previewView.kf.setImage(with: url) } else { previewView.image = UIImage(systemName: "photo") @@ -710,13 +769,82 @@ final class TaskFileRemarkDialogView: KeyboardAvoidingDialogView { } } - @objc private func cancelTapped() { onCancel?() } - @objc private func confirmTapped() { onConfirm?() } + @objc private func cancelTapped() { + videoView.stop() + onCancel?() + } + + @objc private func confirmTapped() { + videoView.stop() + onConfirm?() + } /// 当前输入的备注文本。 var inputText: String { textView.text ?? "" } } +/// 任务备注弹窗中的视频播放视图。 +final class TaskRemarkVideoView: UIView { + + private let playerLayer = AVPlayerLayer() + private let playButton = UIButton(type: .system) + private var player: AVPlayer? + + override init(frame: CGRect) { + super.init(frame: frame) + backgroundColor = .black + layer.addSublayer(playerLayer) + + playButton.setImage(UIImage(systemName: "play.circle.fill"), for: .normal) + playButton.tintColor = .white + playButton.addTarget(self, action: #selector(togglePlayback), for: .touchUpInside) + addSubview(playButton) + playButton.snp.makeConstraints { make in + make.center.equalToSuperview() + make.width.height.equalTo(52) + } + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func layoutSubviews() { + super.layoutSubviews() + playerLayer.frame = bounds + } + + /// 切换到指定视频并准备播放。 + func configure(url: URL) { + stop() + let player = AVPlayer(url: url) + self.player = player + playerLayer.player = player + playerLayer.videoGravity = .resizeAspect + playButton.isHidden = false + } + + /// 停止播放并释放播放器。 + func stop() { + player?.pause() + player = nil + playerLayer.player = nil + playButton.isHidden = false + } + + @objc private func togglePlayback() { + guard let player else { return } + if player.timeControlStatus == .playing { + player.pause() + playButton.isHidden = false + } else { + player.play() + playButton.isHidden = true + } + } +} + extension TaskFileRemarkDialogView: UITextViewDelegate { func textViewDidChange(_ textView: UITextView) { if textView.text.count > 50 { diff --git a/suixinkan/UI/WildPhotographerReport/WildReportRiskMapViewController.swift b/suixinkan/UI/WildPhotographerReport/WildReportRiskMapViewController.swift index 6e99ec9..38289c0 100644 --- a/suixinkan/UI/WildPhotographerReport/WildReportRiskMapViewController.swift +++ b/suixinkan/UI/WildPhotographerReport/WildReportRiskMapViewController.swift @@ -21,7 +21,7 @@ final class WildReportRiskMapViewController: BaseViewController { private let mapView = MKMapView() private let scenicCapsule = UIView() private let scenicNameLabel = UILabel() - private let locateButton = UIButton(type: .system) + private let mapControls = LocationReportMapControlStack() private let legendBar = UIStackView() private let detailContainerView = UIView() private let scrollView = UIScrollView() @@ -88,7 +88,7 @@ final class WildReportRiskMapViewController: BaseViewController { mapContainerView.addSubview(mapView) configureScenicCapsule() - configureLocateButton() + configureMapControls() configureLegendBar() configureDetailArea() refreshContent(animated: false) @@ -108,9 +108,8 @@ final class WildReportRiskMapViewController: BaseViewController { make.top.leading.equalToSuperview().inset(12) make.height.equalTo(34) } - locateButton.snp.makeConstraints { make in + mapControls.snp.makeConstraints { make in make.top.trailing.equalToSuperview().inset(12) - make.size.equalTo(44) } detailContainerView.snp.makeConstraints { make in make.height.greaterThanOrEqualTo(180) @@ -154,18 +153,21 @@ final class WildReportRiskMapViewController: BaseViewController { } } - private func configureLocateButton() { - locateButton.backgroundColor = UIColor.white.withAlphaComponent(0.96) - locateButton.tintColor = AppColor.primary - locateButton.setImage(UIImage(systemName: "location.fill"), for: .normal) - locateButton.layer.cornerRadius = 22 - locateButton.layer.shadowColor = UIColor.black.cgColor - locateButton.layer.shadowOpacity = 0.1 - locateButton.layer.shadowRadius = 8 - locateButton.layer.shadowOffset = CGSize(width: 0, height: 4) - locateButton.accessibilityLabel = "回到我的位置" - locateButton.addTarget(self, action: #selector(locateButtonTapped), for: .touchUpInside) - mapContainerView.addSubview(locateButton) + private func configureMapControls() { + mapControls.layer.shadowColor = UIColor.black.cgColor + mapControls.layer.shadowOpacity = 0.1 + mapControls.layer.shadowRadius = 8 + mapControls.layer.shadowOffset = CGSize(width: 0, height: 4) + mapControls.onZoomIn = { [weak self] in + self?.zoomMap(by: 0.5) + } + mapControls.onZoomOut = { [weak self] in + self?.zoomMap(by: 2) + } + mapControls.onRelocate = { [weak self] in + self?.focusCurrentLocation() + } + mapContainerView.addSubview(mapControls) } private func configureLegendBar() { @@ -226,8 +228,7 @@ final class WildReportRiskMapViewController: BaseViewController { @MainActor private func updateLocateButtonState() { let hasCurrentLocation = viewModel.markers.contains { $0.kind == .selfLocation } - locateButton.isEnabled = hasCurrentLocation - locateButton.alpha = hasCurrentLocation ? 1 : 0.46 + mapControls.setRelocateEnabled(hasCurrentLocation) } private func syncMapAnnotations() { @@ -325,6 +326,10 @@ final class WildReportRiskMapViewController: BaseViewController { } private func makeRadarHeader(clue: WildReportRadarActiveClue) -> UIView { + let container = UIStackView() + container.axis = .vertical + container.spacing = 6 + let row = UIStackView() row.axis = .horizontal row.alignment = .top @@ -348,21 +353,18 @@ final class WildReportRiskMapViewController: BaseViewController { let textStack = UIStackView() textStack.axis = .vertical textStack.spacing = 6 + var reportMetaText: String? if isReportClue(clue) { let title = WildReportUI.label("线索 ID:\(clue.id)", font: .systemFont(ofSize: 16, weight: .bold), color: AppColor.textPrimary, lines: 2) textStack.addArrangedSubview(title) - let metaRow = UIStackView() - metaRow.axis = .horizontal - metaRow.spacing = 12 + var metaParts: [String] = [] if let distance = clue.distanceText ?? clue.distance { - metaRow.addArrangedSubview(WildReportUI.label("距离:距离您\(distance)", font: .systemFont(ofSize: 12), color: AppColor.textSecondary)) + metaParts.append("距离:距离您\(distance)") } if let updatedAt = clue.updatedAt { - metaRow.addArrangedSubview(WildReportUI.label("时间:\(updatedAt)", font: .systemFont(ofSize: 12), color: AppColor.textSecondary)) - } - if !metaRow.arrangedSubviews.isEmpty { - textStack.addArrangedSubview(metaRow) + metaParts.append("时间:\(updatedAt)") } + reportMetaText = metaParts.isEmpty ? nil : metaParts.joined(separator: " ") } else { let title = WildReportUI.label(clue.displayTitle, font: .systemFont(ofSize: 16, weight: .bold), color: AppColor.textPrimary, lines: 2) textStack.addArrangedSubview(title) @@ -380,7 +382,24 @@ final class WildReportRiskMapViewController: BaseViewController { row.addArrangedSubview(badge) textStack.setContentHuggingPriority(.defaultLow, for: .horizontal) badge.setContentHuggingPriority(.required, for: .horizontal) - return row + container.addArrangedSubview(row) + + if let reportMetaText { + let metaRow = UIStackView() + metaRow.axis = .horizontal + metaRow.spacing = 0 + let spacer = UIView() + spacer.snp.makeConstraints { make in + make.width.equalTo(56) + } + let metaLabel = WildReportUI.label(reportMetaText, font: .systemFont(ofSize: 12), color: AppColor.textSecondary) + metaLabel.textAlignment = .right + metaLabel.setContentCompressionResistancePriority(.required, for: .horizontal) + metaRow.addArrangedSubview(spacer) + metaRow.addArrangedSubview(metaLabel) + container.addArrangedSubview(metaRow) + } + return container } private func addPhotographerProfile(for clue: WildReportRadarActiveClue, to stack: UIStackView) { @@ -888,22 +907,134 @@ final class WildReportRiskMapViewController: BaseViewController { return } guard let target = viewModel.navigateToSelectedMarker() else { return } - let item = MKMapItem(placemark: MKPlacemark(coordinate: target.coordinate)) - item.name = target.title - item.openInMaps(launchOptions: [ - MKLaunchOptionsDirectionsModeKey: MKLaunchOptionsDirectionsModeDriving - ]) + presentNavigationOptions(for: target) } @objc private func shareTapped() { - viewModel.shareSelectedClue() + showLoading() + Task { [weak self] in + guard let self else { return } + let payload = await self.viewModel.shareSelectedClue(api: self.api) + await MainActor.run { + self.hideLoading() + guard let payload else { return } + WeChatShareService.shareMiniProgram(payload, previewImage: UIImage(named: "report_share_cover")) { [weak self] result in + self?.showShareResult(result) + } + } + } } - @objc private func locateButtonTapped() { + private func presentNavigationOptions(for target: WildReportMapMarker) { + let options = availableNavigationOptions(for: target) + let alert = UIAlertController(title: "选择导航软件", message: target.title, preferredStyle: .actionSheet) + options.forEach { option in + alert.addAction(UIAlertAction(title: option.title, style: .default) { [weak self] _ in + self?.openNavigation(option) + }) + } + alert.addAction(UIAlertAction(title: "取消", style: .cancel)) + if let popover = alert.popoverPresentationController { + popover.sourceView = view + popover.sourceRect = CGRect(x: view.bounds.midX, y: view.bounds.maxY - 80, width: 1, height: 1) + } + present(alert, animated: true) + } + + private func availableNavigationOptions(for target: WildReportMapMarker) -> [WildReportNavigationOption] { + [ + WildReportNavigationOption(title: "Apple 地图", url: navigationURL(for: .apple, target: target)), + WildReportNavigationOption(title: "高德地图", url: navigationURL(for: .amap, target: target)), + WildReportNavigationOption(title: "百度地图", url: navigationURL(for: .baidu, target: target)), + WildReportNavigationOption(title: "腾讯地图", url: navigationURL(for: .tencent, target: target)), + WildReportNavigationOption(title: "Google Maps", url: navigationURL(for: .google, target: target)) + ].compactMap { option in + guard option.url != nil else { return nil } + return option + } + } + + private func openNavigation(_ option: WildReportNavigationOption) { + guard let url = option.url else { return } + UIApplication.shared.open(url) { [weak self] success in + guard !success else { return } + Task { @MainActor in + self?.showToast("未安装\(option.title)或无法打开") + } + } + } + + private func navigationURL(for app: WildReportNavigationApp, target: WildReportMapMarker) -> URL? { + let latitude = target.coordinate.latitude + let longitude = target.coordinate.longitude + let name = encodedNavigationText(target.title) + switch app { + case .apple: + return URL(string: "http://maps.apple.com/?daddr=\(latitude),\(longitude)&dirflg=d&q=\(name)") + case .amap: + return URL(string: "iosamap://path?sourceApplication=suixinkan&dlat=\(latitude)&dlon=\(longitude)&dname=\(name)&dev=0&t=0") + case .baidu: + return URL(string: "baidumap://map/direction?destination=latlng:\(latitude),\(longitude)|name:\(name)&mode=driving&coord_type=wgs84") + case .tencent: + return URL(string: "qqmap://map/routeplan?type=drive&tocoord=\(latitude),\(longitude)&to=\(name)&referer=suixinkan") + case .google: + return URL(string: "comgooglemaps://?daddr=\(latitude),\(longitude)&directionsmode=driving") + } + } + + private func encodedNavigationText(_ text: String) -> String { + var allowed = CharacterSet.urlQueryAllowed + allowed.remove(charactersIn: "&=?") + return text.addingPercentEncoding(withAllowedCharacters: allowed) ?? text + } + + @MainActor + private func showShareResult(_ result: WeChatShareResult) { + switch result { + case .success: + showToast("分享成功") + case .cancelled: + showToast("已取消分享") + case .notInstalled: + showToast("请先安装微信") + case .unsupported: + showToast("当前微信版本不支持分享") + case .invalidPayload(let message): + showToast(message) + case .sendFailed: + showToast("微信分享发送失败") + case .unknown: + showToast("微信分享失败") + } + } + + private func zoomMap(by multiplier: CLLocationDegrees) { + let visibleRegion = mapView.region + let span = MKCoordinateSpan( + latitudeDelta: min(max(visibleRegion.span.latitudeDelta * multiplier, 0.001), 180), + longitudeDelta: min(max(visibleRegion.span.longitudeDelta * multiplier, 0.001), 180) + ) + mapView.setRegion(MKCoordinateRegion(center: visibleRegion.center, span: span), animated: true) + } + + private func focusCurrentLocation() { viewModel.focusCurrentLocation() } } +private struct WildReportNavigationOption { + let title: String + let url: URL? +} + +private enum WildReportNavigationApp { + case apple + case amap + case baidu + case tencent + case google +} + extension WildReportRiskMapViewController: MKMapViewDelegate { func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? { guard let annotation = annotation as? WildReportMapAnnotation else { return nil } @@ -1130,6 +1261,8 @@ private final class WildReportRiskLegendView: UIView { /// 风险地图状态胶囊。 private final class WildReportRiskStatusBadge: UILabel { + private let contentInsets = UIEdgeInsets(top: 0, left: 10, bottom: 0, right: 10) + init(text: String, color: UIColor) { super.init(frame: .zero) self.text = text @@ -1142,13 +1275,26 @@ private final class WildReportRiskStatusBadge: UILabel { numberOfLines = 1 adjustsFontSizeToFitWidth = true minimumScaleFactor = 0.8 + setContentHuggingPriority(.required, for: .horizontal) + setContentCompressionResistancePriority(.required, for: .horizontal) snp.makeConstraints { make in make.height.equalTo(24) - make.width.greaterThanOrEqualTo(64) - make.width.lessThanOrEqualTo(96) + make.width.greaterThanOrEqualTo(52) } } + override var intrinsicContentSize: CGSize { + let size = super.intrinsicContentSize + return CGSize( + width: size.width + contentInsets.left + contentInsets.right, + height: max(24, size.height + contentInsets.top + contentInsets.bottom) + ) + } + + override func drawText(in rect: CGRect) { + super.drawText(in: rect.inset(by: contentInsets)) + } + @available(*, unavailable) required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") diff --git a/suixinkanTests/AllFunctionsViewModelTests.swift b/suixinkanTests/AllFunctionsViewModelTests.swift index 4eadbd9..34a4438 100644 --- a/suixinkanTests/AllFunctionsViewModelTests.swift +++ b/suixinkanTests/AllFunctionsViewModelTests.swift @@ -3,6 +3,7 @@ // suixinkanTests // +import UIKit import XCTest @testable import suixinkan @@ -144,3 +145,36 @@ final class AllFunctionsViewModelTests: XCTestCase { XCTAssertEqual(viewModel.commonMenus.map(\.uri), ["location_report", "report_photographer"]) } } + +/// 全部功能菜单卡片交互语义测试。 +@MainActor +final class AllFunctionMenuCellTests: XCTestCase { + + func testAddStyleUsesWholeCellAsAccessibleActionWithoutNestedButton() { + let cell = AllFunctionMenuCell(frame: CGRect(x: 0, y: 0, width: 100, height: 100)) + let menu = HomeMenuItem(uri: "wallet", title: "钱包", iconName: "wallet.pass") + + cell.apply(menu: menu, actionStyle: .add) + + XCTAssertTrue(cell.isAccessibilityElement) + XCTAssertEqual(cell.accessibilityLabel, "钱包") + XCTAssertEqual(cell.accessibilityHint, "添加到常用应用") + XCTAssertTrue(cell.accessibilityTraits.contains(.button)) + XCTAssertFalse(containsButton(in: cell.contentView)) + } + + func testRemoveStyleDescribesWholeCellRemoveAction() { + let cell = AllFunctionMenuCell(frame: CGRect(x: 0, y: 0, width: 100, height: 100)) + let menu = HomeMenuItem(uri: "wallet", title: "钱包", iconName: "wallet.pass") + + cell.apply(menu: menu, actionStyle: .remove) + + XCTAssertEqual(cell.accessibilityHint, "移出常用应用") + XCTAssertTrue(cell.accessibilityTraits.contains(.button)) + XCTAssertFalse(containsButton(in: cell.contentView)) + } + + private func containsButton(in view: UIView) -> Bool { + view is UIButton || view.subviews.contains(where: containsButton(in:)) + } +} diff --git a/suixinkanTests/TaskAddViewModelTests.swift b/suixinkanTests/TaskAddViewModelTests.swift index b747cb1..206a063 100644 --- a/suixinkanTests/TaskAddViewModelTests.swift +++ b/suixinkanTests/TaskAddViewModelTests.swift @@ -56,6 +56,17 @@ final class TaskAddViewModelTests: XCTestCase { XCTAssertEqual(message, "文件正在上传中,请稍后添加!") } + func testClearingCustomUrgentHourKeepsConfirmedValue() { + let viewModel = TaskAddViewModel(appStore: appStore) + viewModel.setUrgentHour(6) + + viewModel.updateCustomUrgentHourText("") + XCTAssertEqual(viewModel.urgentHour, 6) + + viewModel.updateCustomUrgentHourText("0") + XCTAssertEqual(viewModel.urgentHour, 6) + } + func testBuildAddTaskRequestSplitsCloudAndUploadFiles() { let viewModel = TaskAddViewModel(appStore: appStore) viewModel.updateTaskName("任务A") @@ -76,6 +87,26 @@ final class TaskAddViewModelTests: XCTestCase { XCTAssertEqual(request.uploadFile[0].fileUrl, "https://cdn/a.jpg") } + func testPreparedUploadKeepsOriginalFileNameAndPreview() { + let viewModel = TaskAddViewModel(appStore: appStore) + let previewData = Data([1, 2, 3]) + viewModel.addUploadPlaceholder(fileName: "temporary.jpg", fileType: 2, uploadTaskId: "task1") + + viewModel.prepareUpload(uploadTaskId: "task1", fileName: "IMG_1001.HEIC", localPreviewData: previewData) + viewModel.markUploadSucceeded( + uploadTaskId: "task1", + fileURL: "https://cdn/image.heic", + fileName: "IMG_1001.HEIC", + localPreviewData: previewData, + autoRemarkWhenSingle: true + ) + + XCTAssertEqual(viewModel.selectedFiles[0].uploadFileName, "IMG_1001.HEIC") + XCTAssertEqual(viewModel.selectedFiles[0].localPreviewData, previewData) + XCTAssertEqual(viewModel.buildAddTaskRequest().uploadFile[0].fileName, "IMG_1001.HEIC") + XCTAssertEqual(viewModel.consumePendingRemarkFileID(), viewModel.selectedFiles[0].id) + } + func testTaskFileSourceBadgeTextMatchesAndroidLabels() { let cloudItem = TaskFileItem(source: .cloud, cloudFile: CloudFile(id: 1, name: "云文件", type: 2)) let uploadItem = TaskFileItem(source: .upload, uploadFileName: "a.jpg", uploadFileType: 2) diff --git a/suixinkanTests/WildPhotographerReport/WildPhotographerReportTests.swift b/suixinkanTests/WildPhotographerReport/WildPhotographerReportTests.swift index 2037a8f..4d1465b 100644 --- a/suixinkanTests/WildPhotographerReport/WildPhotographerReportTests.swift +++ b/suixinkanTests/WildPhotographerReport/WildPhotographerReportTests.swift @@ -1269,6 +1269,53 @@ final class WildPhotographerReportTests: XCTestCase { XCTAssertEqual(viewModel.errorMessage, URLError(.badServerResponse).localizedDescription) } + func testRiskMapViewModelSharesSelectedReportMarker() async { + let viewModel = WildReportRiskMapViewModel() + let api = MockWildPhotographerReportAPI() + api.riskMapResponses = [makeRiskMapResponse()] + api.reportShareResponse = WildReportMiniProgramShareData( + userName: "gh_test", + path: "/pages/report/detail?id=32", + title: "举报线索", + description: "请协助处理", + webpageURL: "https://example.com/report/32", + miniProgramTypeValue: WeChatMiniProgramType.preview.rawValue + ) + + await viewModel.loadInitial( + api: api, + locationProvider: MockRiskMapLocationProvider(.success(latitude: 43.3779, longitude: 84.0217)), + scenicId: 128 + ) + let redMarker = try! XCTUnwrap(viewModel.markers.first { $0.kind == .wildPhotographer }) + await viewModel.selectMarker(redMarker) + + let payload = await viewModel.shareSelectedClue(api: api) + + XCTAssertEqual(api.reportShareRequests, ["32"]) + XCTAssertEqual(payload?.title, "举报线索") + XCTAssertEqual(payload?.path, "/pages/report/detail?id=32") + XCTAssertEqual(payload?.miniProgramType, .preview) + } + + func testRiskMapViewModelDoesNotShareCurrentLocationMarker() async { + let viewModel = WildReportRiskMapViewModel() + let api = MockWildPhotographerReportAPI() + api.riskMapResponses = [makeRiskMapResponse()] + + await viewModel.loadInitial( + api: api, + locationProvider: MockRiskMapLocationProvider(.success(latitude: 43.3779, longitude: 84.0217)), + scenicId: 128 + ) + + let payload = await viewModel.shareSelectedClue(api: api) + + XCTAssertNil(payload) + XCTAssertTrue(api.reportShareRequests.isEmpty) + XCTAssertEqual(viewModel.errorMessage, "请选择可分享的举报线索") + } + func testDetailViewModelLoadsRemoteDetailWhenServerIDExists() async { let record = makeReportListItem(complaintNo: "JB20260708917", handleStatus: 0).toRecord() let viewModel = WildPhotographerReportDetailViewModel(record: record)