From d41dd0c82de9b5aa0b22dd5c59aae29ae999e915 Mon Sep 17 00:00:00 2001 From: Yingdong Wang Date: Sun, 23 Sep 2018 22:05:29 +0800 Subject: [PATCH 01/12] Fix error in swift 4.2 --- Alerts&Pickers.xcodeproj/project.pbxproj | 12 ++++++---- .../xcshareddata/xcschemes/iPhone X.xcscheme | 4 +--- Example/AppDelegate.swift | 2 +- .../FlowLayouts/VegaScrollFlowLayout.swift | 6 ++--- Example/ViewController.swift | 4 ++-- Source/Extensions/Array+Extensions.swift | 0 Source/Extensions/Common+Extensions.swift | 0 Source/Extensions/Date+Extension.swift | 0 Source/Extensions/Locale+Extensions.swift | 0 Source/Extensions/Optional+Extensions.swift | 0 Source/Extensions/String+Extensions.swift | 6 ++--- .../UIAlertController+Extensions.swift | 10 ++++---- .../Extensions/UIApplication+Extensions.swift | 0 Source/Extensions/UIColor+Extensions.swift | 0 Source/Extensions/UIImage+Extensions.swift | 0 .../Extensions/UIImageView+Extensions.swift | 20 ++++++++-------- .../Extensions/UISearchBar+Extensions.swift | 0 .../UISegmentedControl+Extensions.swift | 4 ++-- .../Extensions/UITextField+Extensions.swift | 12 +++++----- Source/Extensions/UIView+Extensions.swift | 0 .../UIViewController+Extensions.swift | 0 .../ContactsPickerViewController.swift | 6 ++--- .../Pickers/Contacts/Managers/Contacts.swift | 0 Source/Pickers/Contacts/Models/Contact.swift | 0 .../Pickers/Contacts/Views/ContactCell.swift | 2 +- .../Date/DatePickerViewController.swift | 4 ++-- .../Image/ImagePickerViewController.swift | 6 ++--- .../Pickers/Image/Views/ItemWithImage.swift | 0 .../Locale/LocalePickerViewController.swift | 2 +- .../Pickers/Locale/Managers/LocaleStore.swift | 0 Source/Pickers/Locale/Models/LocaleInfo.swift | 0 Source/Pickers/Locale/Views/CountryCell.swift | 2 +- .../Pickers/Locale/Views/CurrencyCell.swift | 2 +- .../Pickers/Locale/Views/PhoneCodeCell.swift | 2 +- .../LocationPickerViewController.swift | 23 ++++++++++--------- .../Managers/SearchHistoryManager.swift | 4 ++-- Source/Pickers/Location/Models/Address.swift | 6 ++--- .../PhotoLibrary/Managers/Assets.swift | 0 .../PhotoLibraryPickerViewController.swift | 10 ++++---- .../PickerView/PickerViewViewController.swift | 0 .../Telegram/Layouts/PhotoLayout.swift | 0 .../TelegramPickerViewController.swift | 4 ++-- .../Telegram/Views/ItemWithPhoto.swift | 0 .../Telegram/Views/LikeButtonCell.swift | 2 +- .../OneTextFieldViewController.swift | 0 .../TwoTextFieldsViewController.swift | 0 .../Viewers/Models/AttributedTextBlock.swift | 8 +++---- Source/Viewers/TextViewController.swift | 2 +- Source/Views/Button.swift | 0 Source/Views/GradientSlider.swift | 6 ++--- Source/Views/Label.swift | 3 ++- Source/Views/SegmentedControl.swift | 0 Source/Views/TextField.swift | 0 53 files changed, 89 insertions(+), 85 deletions(-) mode change 100644 => 100755 Source/Extensions/Array+Extensions.swift mode change 100644 => 100755 Source/Extensions/Common+Extensions.swift mode change 100644 => 100755 Source/Extensions/Date+Extension.swift mode change 100644 => 100755 Source/Extensions/Locale+Extensions.swift mode change 100644 => 100755 Source/Extensions/Optional+Extensions.swift mode change 100644 => 100755 Source/Extensions/String+Extensions.swift mode change 100644 => 100755 Source/Extensions/UIAlertController+Extensions.swift mode change 100644 => 100755 Source/Extensions/UIApplication+Extensions.swift mode change 100644 => 100755 Source/Extensions/UIColor+Extensions.swift mode change 100644 => 100755 Source/Extensions/UIImage+Extensions.swift mode change 100644 => 100755 Source/Extensions/UIImageView+Extensions.swift mode change 100644 => 100755 Source/Extensions/UISearchBar+Extensions.swift mode change 100644 => 100755 Source/Extensions/UISegmentedControl+Extensions.swift mode change 100644 => 100755 Source/Extensions/UITextField+Extensions.swift mode change 100644 => 100755 Source/Extensions/UIView+Extensions.swift mode change 100644 => 100755 Source/Extensions/UIViewController+Extensions.swift mode change 100644 => 100755 Source/Pickers/Contacts/ContactsPickerViewController.swift mode change 100644 => 100755 Source/Pickers/Contacts/Managers/Contacts.swift mode change 100644 => 100755 Source/Pickers/Contacts/Models/Contact.swift mode change 100644 => 100755 Source/Pickers/Contacts/Views/ContactCell.swift mode change 100644 => 100755 Source/Pickers/Date/DatePickerViewController.swift mode change 100644 => 100755 Source/Pickers/Image/ImagePickerViewController.swift mode change 100644 => 100755 Source/Pickers/Image/Views/ItemWithImage.swift mode change 100644 => 100755 Source/Pickers/Locale/LocalePickerViewController.swift mode change 100644 => 100755 Source/Pickers/Locale/Managers/LocaleStore.swift mode change 100644 => 100755 Source/Pickers/Locale/Models/LocaleInfo.swift mode change 100644 => 100755 Source/Pickers/Locale/Views/CountryCell.swift mode change 100644 => 100755 Source/Pickers/Locale/Views/CurrencyCell.swift mode change 100644 => 100755 Source/Pickers/Locale/Views/PhoneCodeCell.swift mode change 100644 => 100755 Source/Pickers/Location/Models/Address.swift mode change 100644 => 100755 Source/Pickers/PhotoLibrary/Managers/Assets.swift mode change 100644 => 100755 Source/Pickers/PhotoLibrary/PhotoLibraryPickerViewController.swift mode change 100644 => 100755 Source/Pickers/PickerView/PickerViewViewController.swift mode change 100644 => 100755 Source/Pickers/Telegram/Layouts/PhotoLayout.swift mode change 100644 => 100755 Source/Pickers/Telegram/TelegramPickerViewController.swift mode change 100644 => 100755 Source/Pickers/Telegram/Views/ItemWithPhoto.swift mode change 100644 => 100755 Source/Pickers/Telegram/Views/LikeButtonCell.swift mode change 100644 => 100755 Source/Pickers/TextFields/OneTextFieldViewController.swift mode change 100644 => 100755 Source/Pickers/TextFields/TwoTextFieldsViewController.swift mode change 100644 => 100755 Source/Viewers/Models/AttributedTextBlock.swift mode change 100644 => 100755 Source/Viewers/TextViewController.swift mode change 100644 => 100755 Source/Views/Button.swift mode change 100644 => 100755 Source/Views/Label.swift mode change 100644 => 100755 Source/Views/SegmentedControl.swift mode change 100644 => 100755 Source/Views/TextField.swift diff --git a/Alerts&Pickers.xcodeproj/project.pbxproj b/Alerts&Pickers.xcodeproj/project.pbxproj index 770321c2..57b416d7 100644 --- a/Alerts&Pickers.xcodeproj/project.pbxproj +++ b/Alerts&Pickers.xcodeproj/project.pbxproj @@ -513,7 +513,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0920; - LastUpgradeCheck = 0920; + LastUpgradeCheck = 1000; ORGANIZATIONNAME = "Supreme Apps"; TargetAttributes = { FA3BB2722008B41B00E06F8F = { @@ -649,6 +649,7 @@ CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; @@ -656,6 +657,7 @@ CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; @@ -685,7 +687,7 @@ GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 11.2; MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = NO; + ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -707,6 +709,7 @@ CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; @@ -714,6 +717,7 @@ CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; @@ -754,7 +758,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "AA.Alerts-Pickers"; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 4.0; + SWIFT_VERSION = 4.2; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; @@ -769,7 +773,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "AA.Alerts-Pickers"; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 4.0; + SWIFT_VERSION = 4.2; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Release; diff --git a/Alerts&Pickers.xcodeproj/xcshareddata/xcschemes/iPhone X.xcscheme b/Alerts&Pickers.xcodeproj/xcshareddata/xcschemes/iPhone X.xcscheme index 477a9fce..cc918499 100644 --- a/Alerts&Pickers.xcodeproj/xcshareddata/xcschemes/iPhone X.xcscheme +++ b/Alerts&Pickers.xcodeproj/xcshareddata/xcschemes/iPhone X.xcscheme @@ -1,6 +1,6 @@ @@ -46,7 +45,6 @@ buildConfiguration = "Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" - language = "" launchStyle = "0" useCustomWorkingDirectory = "NO" ignoresPersistentStateOnLaunch = "NO" diff --git a/Example/AppDelegate.swift b/Example/AppDelegate.swift index e1a46626..4c5c9e78 100644 --- a/Example/AppDelegate.swift +++ b/Example/AppDelegate.swift @@ -5,7 +5,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? - func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { window = UIWindow(frame: UIScreen.main.bounds) window?.rootViewController = UINavigationController(rootViewController: ViewController()) window?.makeKeyAndVisible() diff --git a/Example/FlowLayouts/VegaScrollFlowLayout.swift b/Example/FlowLayouts/VegaScrollFlowLayout.swift index 1008a30f..a0de54a3 100755 --- a/Example/FlowLayouts/VegaScrollFlowLayout.swift +++ b/Example/FlowLayouts/VegaScrollFlowLayout.swift @@ -120,7 +120,7 @@ open class VerticalScrollFlowLayout: UICollectionViewFlowLayout { let touchLocation = collectionView!.panGestureRecognizer.location(in: collectionView) - dynamicAnimator.behaviors.flatMap { $0 as? UIAttachmentBehavior }.forEach { behavior in + dynamicAnimator.behaviors.compactMap { $0 as? UIAttachmentBehavior }.forEach { behavior in let attrs = behavior.items.first as! UICollectionViewLayoutAttributes attrs.center = getUpdatedBehaviorItemCenter(behavior: behavior, touchLocation: touchLocation) self.dynamicAnimator.updateItem(usingCurrentState: attrs) @@ -168,8 +168,8 @@ open class VerticalScrollFlowLayout: UICollectionViewFlowLayout { } private func getUpdatedBehaviorItemCenter(behavior: UIAttachmentBehavior,touchLocation: CGPoint) -> CGPoint { - let yDistanceFromTouch = fabs(touchLocation.y - behavior.anchorPoint.y) - let xDistanceFromTouch = fabs(touchLocation.x - behavior.anchorPoint.x) + let yDistanceFromTouch = abs(touchLocation.y - behavior.anchorPoint.y) + let xDistanceFromTouch = abs(touchLocation.x - behavior.anchorPoint.x) let scrollResistance = (yDistanceFromTouch + xDistanceFromTouch) / (springHardness * 100) let attrs = behavior.items.first as! UICollectionViewLayoutAttributes diff --git a/Example/ViewController.swift b/Example/ViewController.swift index 09376c63..df8ddb0a 100644 --- a/Example/ViewController.swift +++ b/Example/ViewController.swift @@ -99,7 +99,7 @@ class ViewController: UIViewController { // MARK: Properties - fileprivate var alertStyle: UIAlertControllerStyle = .actionSheet + fileprivate var alertStyle: UIAlertController.Style = .actionSheet fileprivate lazy var segments: SegmentedControl = { let styles: [String] = ["Alert", "ActionSheet"] @@ -120,7 +120,7 @@ class ViewController: UIViewController { $0.register(TypeOneCell.self, forCellWithReuseIdentifier: TypeOneCell.identifier) $0.showsVerticalScrollIndicator = false $0.showsHorizontalScrollIndicator = false - $0.decelerationRate = UIScrollViewDecelerationRateFast + $0.decelerationRate = UIScrollView.DecelerationRate.fast //$0.contentInsetAdjustmentBehavior = .never $0.bounces = true $0.backgroundColor = .white diff --git a/Source/Extensions/Array+Extensions.swift b/Source/Extensions/Array+Extensions.swift old mode 100644 new mode 100755 diff --git a/Source/Extensions/Common+Extensions.swift b/Source/Extensions/Common+Extensions.swift old mode 100644 new mode 100755 diff --git a/Source/Extensions/Date+Extension.swift b/Source/Extensions/Date+Extension.swift old mode 100644 new mode 100755 diff --git a/Source/Extensions/Locale+Extensions.swift b/Source/Extensions/Locale+Extensions.swift old mode 100644 new mode 100755 diff --git a/Source/Extensions/Optional+Extensions.swift b/Source/Extensions/Optional+Extensions.swift old mode 100644 new mode 100755 diff --git a/Source/Extensions/String+Extensions.swift b/Source/Extensions/String+Extensions.swift old mode 100644 new mode 100755 index e982124d..da2634a4 --- a/Source/Extensions/String+Extensions.swift +++ b/Source/Extensions/String+Extensions.swift @@ -13,7 +13,7 @@ extension String { subscript (r: Range) -> String { let start = index(startIndex, offsetBy: r.lowerBound) let end = index(startIndex, offsetBy: r.upperBound) - return String(self[Range(start ..< end)]) + return String(self[(start ..< end)]) } var containsAlphabets: Bool { @@ -41,12 +41,12 @@ public extension String { /// Underlined string public var underline: NSAttributedString { - return NSAttributedString(string: self, attributes: [.underlineStyle: NSUnderlineStyle.styleSingle.rawValue]) + return NSAttributedString(string: self, attributes: [.underlineStyle: NSUnderlineStyle.single.rawValue]) } /// Strikethrough string. public var strikethrough: NSAttributedString { - return NSAttributedString(string: self, attributes: [.strikethroughStyle: NSNumber(value: NSUnderlineStyle.styleSingle.rawValue as Int)]) + return NSAttributedString(string: self, attributes: [.strikethroughStyle: NSNumber(value: NSUnderlineStyle.single.rawValue as Int)]) } /// Italic string. diff --git a/Source/Extensions/UIAlertController+Extensions.swift b/Source/Extensions/UIAlertController+Extensions.swift old mode 100644 new mode 100755 index 8ca0f37c..ad599943 --- a/Source/Extensions/UIAlertController+Extensions.swift +++ b/Source/Extensions/UIAlertController+Extensions.swift @@ -12,7 +12,7 @@ extension UIAlertController { /// - message: alert controller's message (default is nil). /// - defaultActionButtonTitle: default action button title (default is "OK") /// - tintColor: alert controller's tint color (default is nil) - convenience init(style: UIAlertControllerStyle, source: UIView? = nil, title: String? = nil, message: String? = nil, tintColor: UIColor? = nil) { + convenience init(style: UIAlertController.Style, source: UIView? = nil, title: String? = nil, message: String? = nil, tintColor: UIColor? = nil) { self.init(title: title, message: message, preferredStyle: style) // TODO: for iPad or other views @@ -48,7 +48,7 @@ extension UIAlertController { /// - animated: set true to animate presentation of alert controller (default is true). /// - vibrate: set true to vibrate the device while presenting the alert (default is false). /// - completion: an optional completion handler to be called after presenting alert controller (default is nil). - public func show(animated: Bool = true, vibrate: Bool = false, style: UIBlurEffectStyle? = nil, completion: (() -> Void)? = nil) { + public func show(animated: Bool = true, vibrate: Bool = false, style: UIBlurEffect.Style? = nil, completion: (() -> Void)? = nil) { /// TODO: change UIBlurEffectStyle if let style = style { @@ -72,7 +72,7 @@ extension UIAlertController { /// - style: action style (default is UIAlertActionStyle.default) /// - isEnabled: isEnabled status for action (default is true) /// - handler: optional action handler to be called when button is tapped (default is nil) - func addAction(image: UIImage? = nil, title: String, color: UIColor? = nil, style: UIAlertActionStyle = .default, isEnabled: Bool = true, handler: ((UIAlertAction) -> Void)? = nil) { + func addAction(image: UIImage? = nil, title: String, color: UIColor? = nil, style: UIAlertAction.Style = .default, isEnabled: Bool = true, handler: ((UIAlertAction) -> Void)? = nil) { //let isPad: Bool = UIDevice.current.userInterfaceIdiom == .pad //let action = UIAlertAction(title: title, style: isPad && style == .cancel ? .default : style, handler: handler) let action = UIAlertAction(title: title, style: style, handler: handler) @@ -106,7 +106,7 @@ extension UIAlertController { func setTitle(font: UIFont, color: UIColor) { guard let title = self.title else { return } - let attributes: [NSAttributedStringKey: Any] = [.font: font, .foregroundColor: color] + let attributes: [NSAttributedString.Key: Any] = [.font: font, .foregroundColor: color] let attributedTitle = NSMutableAttributedString(string: title, attributes: attributes) setValue(attributedTitle, forKey: "attributedTitle") } @@ -126,7 +126,7 @@ extension UIAlertController { func setMessage(font: UIFont, color: UIColor) { guard let message = self.message else { return } - let attributes: [NSAttributedStringKey: Any] = [.font: font, .foregroundColor: color] + let attributes: [NSAttributedString.Key: Any] = [.font: font, .foregroundColor: color] let attributedMessage = NSMutableAttributedString(string: message, attributes: attributes) setValue(attributedMessage, forKey: "attributedMessage") } diff --git a/Source/Extensions/UIApplication+Extensions.swift b/Source/Extensions/UIApplication+Extensions.swift old mode 100644 new mode 100755 diff --git a/Source/Extensions/UIColor+Extensions.swift b/Source/Extensions/UIColor+Extensions.swift old mode 100644 new mode 100755 diff --git a/Source/Extensions/UIImage+Extensions.swift b/Source/Extensions/UIImage+Extensions.swift old mode 100644 new mode 100755 diff --git a/Source/Extensions/UIImageView+Extensions.swift b/Source/Extensions/UIImageView+Extensions.swift old mode 100644 new mode 100755 index 3a44b706..5123efbe --- a/Source/Extensions/UIImageView+Extensions.swift +++ b/Source/Extensions/UIImageView+Extensions.swift @@ -9,7 +9,7 @@ extension UIImageView { /// - color: This optional paramter sets the background of the image. By default, a random color will be generated. /// - circular: This boolean will determine if the image view will be clipped to a circular shape. /// - textAttributes: This dictionary allows you to specify font, text color, shadow properties, etc. - open func setImage(string: String?, color: UIColor? = nil, circular: Bool = false, textAttributes: [NSAttributedStringKey: Any]? = nil) { + open func setImage(string: String?, color: UIColor? = nil, circular: Bool = false, textAttributes: [NSAttributedString.Key: Any]? = nil) { let image = imageSnap(text: string != nil ? string?.initials : "", color: color ?? UIColor.random, circular: circular, textAttributes: textAttributes) @@ -18,7 +18,7 @@ extension UIImageView { } } - private func imageSnap(text: String?, color: UIColor, circular: Bool, textAttributes: [NSAttributedStringKey: Any]?) -> UIImage? { + private func imageSnap(text: String?, color: UIColor, circular: Bool, textAttributes: [NSAttributedString.Key: Any]?) -> UIImage? { let scale = Float(UIScreen.main.scale) var size = bounds.size @@ -41,7 +41,7 @@ extension UIImageView { // Text if let text = text { - let attributes: [NSAttributedStringKey: Any] = textAttributes ?? [.foregroundColor: UIColor.white, .font: UIFont.systemFont(ofSize: 15.0)] + let attributes: [NSAttributedString.Key: Any] = textAttributes ?? [.foregroundColor: UIColor.white, .font: UIFont.systemFont(ofSize: 15.0)] let textSize = text.size(withAttributes: attributes) let bounds = self.bounds @@ -91,24 +91,24 @@ let kGradientBotomOffset: HSVOffset = (hue: 0.025, saturation: -0.05, brightness extension UIImageView { - public func setImageForName(string: String, backgroundColor: UIColor? = nil, circular: Bool, textAttributes: [NSAttributedStringKey: AnyObject]?, gradient: Bool = false) { + public func setImageForName(string: String, backgroundColor: UIColor? = nil, circular: Bool, textAttributes: [NSAttributedString.Key: AnyObject]?, gradient: Bool = false) { setImageForName(string: string, backgroundColor: backgroundColor, circular: circular, textAttributes: textAttributes, gradient: gradient, gradientColors: nil) } - public func setImageForName(string: String, gradientColors: GradientColors? = nil, circular: Bool = true, textAttributes: [NSAttributedStringKey: AnyObject]? = nil) { + public func setImageForName(string: String, gradientColors: GradientColors? = nil, circular: Bool = true, textAttributes: [NSAttributedString.Key: AnyObject]? = nil) { setImageForName(string: string, backgroundColor: nil, circular: circular, textAttributes: textAttributes, gradient: true, gradientColors: gradientColors) } - public func setImageForName(string: String, backgroundColor: UIColor? = nil, circular: Bool, textAttributes: [NSAttributedStringKey: AnyObject]? = nil, gradient: Bool = false, gradientColors: GradientColors? = nil) { + public func setImageForName(string: String, backgroundColor: UIColor? = nil, circular: Bool, textAttributes: [NSAttributedString.Key: AnyObject]? = nil, gradient: Bool = false, gradientColors: GradientColors? = nil) { let initials: String = initialsFromString(string: string) let color: UIColor = (backgroundColor != nil) ? backgroundColor! : randomColor(for: string) let gradientColors = gradientColors ?? topAndBottomColors(for: color) - let attributes: [NSAttributedStringKey: AnyObject] = (textAttributes != nil) ? textAttributes! : [ - NSAttributedStringKey.font: self.fontForFontName(name: nil), - NSAttributedStringKey.foregroundColor: UIColor.white + let attributes: [NSAttributedString.Key: AnyObject] = (textAttributes != nil) ? textAttributes! : [ + NSAttributedString.Key.font: self.fontForFontName(name: nil), + NSAttributedString.Key.foregroundColor: UIColor.white ] self.image = imageSnapshot(text: initials, backgroundColor: color, circular: circular, textAttributes: attributes, gradient: gradient, gradientColors: gradientColors) @@ -126,7 +126,7 @@ extension UIImageView { } - private func imageSnapshot(text imageText: String, backgroundColor: UIColor, circular: Bool, textAttributes: [NSAttributedStringKey : AnyObject], gradient: Bool, gradientColors: GradientColors) -> UIImage { + private func imageSnapshot(text imageText: String, backgroundColor: UIColor, circular: Bool, textAttributes: [NSAttributedString.Key : AnyObject], gradient: Bool, gradientColors: GradientColors) -> UIImage { let scale: CGFloat = UIScreen.main.scale diff --git a/Source/Extensions/UISearchBar+Extensions.swift b/Source/Extensions/UISearchBar+Extensions.swift old mode 100644 new mode 100755 diff --git a/Source/Extensions/UISegmentedControl+Extensions.swift b/Source/Extensions/UISegmentedControl+Extensions.swift old mode 100644 new mode 100755 index 9775cb4e..ea7fac49 --- a/Source/Extensions/UISegmentedControl+Extensions.swift +++ b/Source/Extensions/UISegmentedControl+Extensions.swift @@ -4,8 +4,8 @@ public extension UISegmentedControl { /// Font of titles public func title(font: UIFont) { - let attributes: [NSAttributedStringKey: Any] = [.font: font] - setTitleTextAttributes(attributes, for: UIControlState()) + let attributes: [NSAttributedString.Key: Any] = [.font: font] + setTitleTextAttributes(attributes, for: UIControl.State()) //setNeedsDisplay() //layoutIfNeeded() } diff --git a/Source/Extensions/UITextField+Extensions.swift b/Source/Extensions/UITextField+Extensions.swift old mode 100644 new mode 100755 index c72de82a..314010d2 --- a/Source/Extensions/UITextField+Extensions.swift +++ b/Source/Extensions/UITextField+Extensions.swift @@ -12,7 +12,7 @@ extension UITextField { func left(image: UIImage?, color: UIColor = .black) { if let image = image { - leftViewMode = UITextFieldViewMode.always + leftViewMode = UITextField.ViewMode.always let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 20, height: 20)) imageView.contentMode = .scaleAspectFit imageView.image = image @@ -20,14 +20,14 @@ extension UITextField { imageView.tintColor = color leftView = imageView } else { - leftViewMode = UITextFieldViewMode.never + leftViewMode = UITextField.ViewMode.never leftView = nil } } func right(image: UIImage?, color: UIColor = .black) { if let image = image { - rightViewMode = UITextFieldViewMode.always + rightViewMode = UITextField.ViewMode.always let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 20, height: 20)) imageView.contentMode = .scaleAspectFit imageView.image = image @@ -35,7 +35,7 @@ extension UITextField { imageView.tintColor = color rightView = imageView } else { - rightViewMode = UITextFieldViewMode.never + rightViewMode = UITextField.ViewMode.never rightView = nil } } @@ -49,11 +49,11 @@ public extension UITextField { /// /// - Parameter color: placeholder text color. public func setPlaceHolderTextColor(_ color: UIColor) { - self.attributedPlaceholder = NSAttributedString(string:self.placeholder != nil ? self.placeholder! : "", attributes:[NSAttributedStringKey.foregroundColor: color]) + self.attributedPlaceholder = NSAttributedString(string:self.placeholder != nil ? self.placeholder! : "", attributes:[NSAttributedString.Key.foregroundColor: color]) } /// Set placeholder text and its color func placeholder(text value: String, color: UIColor = .red) { - self.attributedPlaceholder = NSAttributedString(string: value, attributes: [ NSAttributedStringKey.foregroundColor : color]) + self.attributedPlaceholder = NSAttributedString(string: value, attributes: [ NSAttributedString.Key.foregroundColor : color]) } } diff --git a/Source/Extensions/UIView+Extensions.swift b/Source/Extensions/UIView+Extensions.swift old mode 100644 new mode 100755 diff --git a/Source/Extensions/UIViewController+Extensions.swift b/Source/Extensions/UIViewController+Extensions.swift old mode 100644 new mode 100755 diff --git a/Source/Pickers/Contacts/ContactsPickerViewController.swift b/Source/Pickers/Contacts/ContactsPickerViewController.swift old mode 100644 new mode 100755 index af25d4db..8324655c --- a/Source/Pickers/Contacts/ContactsPickerViewController.swift +++ b/Source/Pickers/Contacts/ContactsPickerViewController.swift @@ -167,9 +167,9 @@ final class ContactsPickerViewController: UIViewController { case .denied, .restricted: /// User has denied the current app to access the contacts. let productName = Bundle.main.infoDictionary!["CFBundleName"]! - let alert = UIAlertController(style: .alert, title: "Permission denied", message: "\(productName) does not have access to contacts. Please, allow the application to access to your contacts.") + let alert = UIAlertController.init(title: "Permission denied", message: "\(productName) does not have access to contacts. Please, allow the application to access to your contacts.", preferredStyle: UIAlertController.Style.alert) alert.addAction(title: "Settings", style: .destructive) { action in - if let settingsURL = URL(string: UIApplicationOpenSettingsURLString) { + if let settingsURL = URL(string: UIApplication.openSettingsURLString) { UIApplication.shared.open(settingsURL) } } @@ -189,7 +189,7 @@ final class ContactsPickerViewController: UIViewController { case .error(let error): Log("------ error") - let alert = UIAlertController(style: .alert, title: "Error", message: error.localizedDescription) + let alert = UIAlertController.init(title: "Error", message: error.localizedDescription, preferredStyle: UIAlertController.Style.alert) alert.addAction(title: "OK") { [unowned self] action in self.alertController?.dismiss(animated: true) } diff --git a/Source/Pickers/Contacts/Managers/Contacts.swift b/Source/Pickers/Contacts/Managers/Contacts.swift old mode 100644 new mode 100755 diff --git a/Source/Pickers/Contacts/Models/Contact.swift b/Source/Pickers/Contacts/Models/Contact.swift old mode 100644 new mode 100755 diff --git a/Source/Pickers/Contacts/Views/ContactCell.swift b/Source/Pickers/Contacts/Views/ContactCell.swift old mode 100644 new mode 100755 index a4297ab0..c9bd703b --- a/Source/Pickers/Contacts/Views/ContactCell.swift +++ b/Source/Pickers/Contacts/Views/ContactCell.swift @@ -11,7 +11,7 @@ final class ContactTableViewCell: UITableViewCell { // MARK: Initialize - override init(style: UITableViewCellStyle, reuseIdentifier: String?) { + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: .subtitle, reuseIdentifier: reuseIdentifier) selectionStyle = .none backgroundColor = nil diff --git a/Source/Pickers/Date/DatePickerViewController.swift b/Source/Pickers/Date/DatePickerViewController.swift old mode 100644 new mode 100755 index ac6bf256..91bba9b5 --- a/Source/Pickers/Date/DatePickerViewController.swift +++ b/Source/Pickers/Date/DatePickerViewController.swift @@ -11,7 +11,7 @@ extension UIAlertController { /// - maximumDate: maximum date of date picker /// - action: an action for datePicker value change - func addDatePicker(mode: UIDatePickerMode, date: Date?, minimumDate: Date? = nil, maximumDate: Date? = nil, action: DatePickerViewController.Action?) { + func addDatePicker(mode: UIDatePicker.Mode, date: Date?, minimumDate: Date? = nil, maximumDate: Date? = nil, action: DatePickerViewController.Action?) { let datePicker = DatePickerViewController(mode: mode, date: date, minimumDate: minimumDate, maximumDate: maximumDate, action: action) set(vc: datePicker, height: 217) } @@ -28,7 +28,7 @@ final class DatePickerViewController: UIViewController { return $0 }(UIDatePicker()) - required init(mode: UIDatePickerMode, date: Date? = nil, minimumDate: Date? = nil, maximumDate: Date? = nil, action: Action?) { + required init(mode: UIDatePicker.Mode, date: Date? = nil, minimumDate: Date? = nil, maximumDate: Date? = nil, action: Action?) { super.init(nibName: nil, bundle: nil) datePicker.datePickerMode = mode datePicker.date = date ?? Date() diff --git a/Source/Pickers/Image/ImagePickerViewController.swift b/Source/Pickers/Image/ImagePickerViewController.swift old mode 100644 new mode 100755 index 764e8811..1cd7bf6b --- a/Source/Pickers/Image/ImagePickerViewController.swift +++ b/Source/Pickers/Image/ImagePickerViewController.swift @@ -10,7 +10,7 @@ extension UIAlertController { /// - images: for content to select /// - selection: type and action for selection of image/images - func addImagePicker(flow: UICollectionViewScrollDirection, paging: Bool, images: [UIImage], selection: ImagePickerViewController.SelectionType? = nil) { + func addImagePicker(flow: UICollectionView.ScrollDirection, paging: Bool, images: [UIImage], selection: ImagePickerViewController.SelectionType? = nil) { let vc = ImagePickerViewController(flow: flow, paging: paging, images: images, selection: selection) if UIDevice.current.userInterfaceIdiom == .pad { @@ -68,7 +68,7 @@ final class ImagePickerViewController: UIViewController { $0.register(ItemWithImage.self, forCellWithReuseIdentifier: ItemWithImage.identifier) $0.showsVerticalScrollIndicator = false $0.showsHorizontalScrollIndicator = false - $0.decelerationRate = UIScrollViewDecelerationRateFast + $0.decelerationRate = UIScrollView.DecelerationRate.fast $0.contentInsetAdjustmentBehavior = .never $0.bounces = false $0.backgroundColor = .clear @@ -90,7 +90,7 @@ final class ImagePickerViewController: UIViewController { // MARK: Initialize - required init(flow: UICollectionViewScrollDirection, paging: Bool, images: [UIImage], selection: SelectionType?) { + required init(flow: UICollectionView.ScrollDirection, paging: Bool, images: [UIImage], selection: SelectionType?) { super.init(nibName: nil, bundle: nil) self.images = images self.selection = selection diff --git a/Source/Pickers/Image/Views/ItemWithImage.swift b/Source/Pickers/Image/Views/ItemWithImage.swift old mode 100644 new mode 100755 diff --git a/Source/Pickers/Locale/LocalePickerViewController.swift b/Source/Pickers/Locale/LocalePickerViewController.swift old mode 100644 new mode 100755 index a0091190..91058ccd --- a/Source/Pickers/Locale/LocalePickerViewController.swift +++ b/Source/Pickers/Locale/LocalePickerViewController.swift @@ -84,7 +84,7 @@ final class LocalePickerViewController: UIViewController { fileprivate lazy var indicatorView: UIActivityIndicatorView = { $0.color = .lightGray return $0 - }(UIActivityIndicatorView(activityIndicatorStyle: .whiteLarge)) + }(UIActivityIndicatorView(style: .whiteLarge)) // MARK: Initialize diff --git a/Source/Pickers/Locale/Managers/LocaleStore.swift b/Source/Pickers/Locale/Managers/LocaleStore.swift old mode 100644 new mode 100755 diff --git a/Source/Pickers/Locale/Models/LocaleInfo.swift b/Source/Pickers/Locale/Models/LocaleInfo.swift old mode 100644 new mode 100755 diff --git a/Source/Pickers/Locale/Views/CountryCell.swift b/Source/Pickers/Locale/Views/CountryCell.swift old mode 100644 new mode 100755 index dc04c673..4556f368 --- a/Source/Pickers/Locale/Views/CountryCell.swift +++ b/Source/Pickers/Locale/Views/CountryCell.swift @@ -9,7 +9,7 @@ final class CountryTableViewCell: UITableViewCell { // MARK: Initialize - override init(style: UITableViewCellStyle, reuseIdentifier: String?) { + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: .default, reuseIdentifier: reuseIdentifier) selectionStyle = .none backgroundColor = nil diff --git a/Source/Pickers/Locale/Views/CurrencyCell.swift b/Source/Pickers/Locale/Views/CurrencyCell.swift old mode 100644 new mode 100755 index b0ad0336..c377261a --- a/Source/Pickers/Locale/Views/CurrencyCell.swift +++ b/Source/Pickers/Locale/Views/CurrencyCell.swift @@ -4,7 +4,7 @@ final class CurrencyTableViewCell: UITableViewCell { static let identifier = String(describing: CurrencyTableViewCell.self) - override init(style: UITableViewCellStyle, reuseIdentifier: String?) { + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: .subtitle, reuseIdentifier: reuseIdentifier) selectionStyle = .none backgroundColor = nil diff --git a/Source/Pickers/Locale/Views/PhoneCodeCell.swift b/Source/Pickers/Locale/Views/PhoneCodeCell.swift old mode 100644 new mode 100755 index d2abcec1..1fd4bd28 --- a/Source/Pickers/Locale/Views/PhoneCodeCell.swift +++ b/Source/Pickers/Locale/Views/PhoneCodeCell.swift @@ -4,7 +4,7 @@ final class PhoneCodeTableViewCell: UITableViewCell { static let identifier = String(describing: PhoneCodeTableViewCell.self) - override init(style: UITableViewCellStyle, reuseIdentifier: String?) { + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: .subtitle, reuseIdentifier: reuseIdentifier) selectionStyle = .none backgroundColor = nil diff --git a/Source/Pickers/Location/LocationPickerViewController.swift b/Source/Pickers/Location/LocationPickerViewController.swift index 512ac5a4..a8023ea4 100755 --- a/Source/Pickers/Location/LocationPickerViewController.swift +++ b/Source/Pickers/Location/LocationPickerViewController.swift @@ -90,7 +90,7 @@ final class LocationPickerViewController: UIViewController { $0.backgroundColor = UIColor.white.withAlphaComponent(0.8) $0.maskToBounds = true $0.cornerRadius = 22 - $0.setImage(#imageLiteral(resourceName: "geolocation"), for: UIControlState()) + $0.setImage(#imageLiteral(resourceName: "geolocation"), for: UIControl.State()) $0.addTarget(self, action: #selector(LocationPickerViewController.currentLocationPressed), for: .touchUpInside) return $0 @@ -129,11 +129,11 @@ final class LocationPickerViewController: UIViewController { let _ = searchController.view } - open override func loadView() { + public override func loadView() { view = mapView } - open override func viewDidLoad() { + public override func viewDidLoad() { super.viewDidLoad() mapView.addSubview(scaleView) @@ -167,7 +167,7 @@ final class LocationPickerViewController: UIViewController { var presentedInitialLocation = false - override open func viewWillLayoutSubviews() { + override public func viewWillLayoutSubviews() { super.viewWillLayoutSubviews() searchView.frame = CGRect(x: 8, y: 8, width: view.width - 16, height: 57) //searchController.searchBar.sizeToFit() @@ -176,7 +176,7 @@ final class LocationPickerViewController: UIViewController { } - override open func viewDidLayoutSubviews() { + override public func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() preferredContentSize.height = UIScreen.main.bounds.height @@ -237,7 +237,7 @@ final class LocationPickerViewController: UIViewController { } func showCoordinates(_ coordinate: CLLocationCoordinate2D, animated: Bool = true) { - let region = MKCoordinateRegionMakeWithDistance(coordinate, resultRegionDistance, resultRegionDistance) + let region = MKCoordinateRegion(center: coordinate, latitudinalMeters: resultRegionDistance, longitudinalMeters: resultRegionDistance) mapView.setRegion(region, animated: animated) } @@ -251,7 +251,8 @@ final class LocationPickerViewController: UIViewController { geocoder.reverseGeocodeLocation(location) { response, error in if let error = error as NSError?, error.code != 10 { // ignore cancelGeocode errors // show error and remove annotation - let alert = UIAlertController(style: .alert, title: nil, message: error.localizedDescription) + let alert = UIAlertController.init(title: nil, message: error.localizedDescription, preferredStyle: UIAlertController.Style.alert) + alert.addAction(title: "OK", style: .cancel) { action in self.mapView.removeAnnotation(annotation) } @@ -314,7 +315,7 @@ extension LocationPickerViewController: UISearchResultsUpdating { let term = userInfo[LocationPickerViewController.SearchTermKey] as? String else { return } - let request = MKLocalSearchRequest() + let request = MKLocalSearch.Request() request.naturalLanguageQuery = term if let location = locationManager.location, useCurrentLocationAsHint { @@ -329,7 +330,7 @@ extension LocationPickerViewController: UISearchResultsUpdating { } } - func showItemsForSearchResult(_ searchResult: MKLocalSearchResponse?) { + func showItemsForSearchResult(_ searchResult: MKLocalSearch.Response?) { results.locations = searchResult?.mapItems.map { Location(name: $0.name, placemark: $0.placemark) } ?? [] results.isShowingHistory = false results.tableView.reloadData() @@ -382,13 +383,13 @@ extension LocationPickerViewController: MKMapViewDelegate { func selectLocationButton() -> UIButton { let button = UIButton(frame: CGRect(x: 0, y: 0, width: 70, height: 30)) - button.setTitle(selectButtonTitle, for: UIControlState()) + button.setTitle(selectButtonTitle, for: UIControl.State()) if let titleLabel = button.titleLabel { let width = titleLabel.textRect(forBounds: CGRect(x: 0, y: 0, width: Int.max, height: 30), limitedToNumberOfLines: 1).width button.frame.size = CGSize(width: width + 10, height: 30.0) } button.backgroundColor = UIColor(hex: 0x007AFF) - button.setTitleColor(.white, for: UIControlState()) + button.setTitleColor(.white, for: UIControl.State()) button.borderWidth = 2 button.borderColor = UIColor(hex: 0x007AFF) button.cornerRadius = 5 diff --git a/Source/Pickers/Location/Managers/SearchHistoryManager.swift b/Source/Pickers/Location/Managers/SearchHistoryManager.swift index 4853926e..b71e3fed 100755 --- a/Source/Pickers/Location/Managers/SearchHistoryManager.swift +++ b/Source/Pickers/Location/Managers/SearchHistoryManager.swift @@ -9,14 +9,14 @@ struct SearchHistoryManager { func history() -> [Location] { let history = defaults.object(forKey: HistoryKey) as? [NSDictionary] ?? [] - return history.flatMap(Location.fromDefaultsDic) + return history.compactMap(Location.fromDefaultsDic) } func addToHistory(_ location: Location) { guard let dic = location.toDefaultsDic() else { return } var history = defaults.object(forKey: HistoryKey) as? [NSDictionary] ?? [] - let historyNames = history.flatMap { $0[LocationDicKeys.name] as? String } + let historyNames = history.compactMap { $0[LocationDicKeys.name] as? String } let alreadyInHistory = location.name.flatMap(historyNames.contains) ?? false if !alreadyInHistory { history.insert(dic, at: 0) diff --git a/Source/Pickers/Location/Models/Address.swift b/Source/Pickers/Location/Models/Address.swift old mode 100644 new mode 100755 index 869dabe9..4cdd60dc --- a/Source/Pickers/Location/Models/Address.swift +++ b/Source/Pickers/Location/Models/Address.swift @@ -41,14 +41,14 @@ struct Address { } var line: String? { - return [line1, line2].flatMap{$0}.joined(separator: ", ") + return [line1, line2].compactMap{$0}.joined(separator: ", ") } var line1: String? { - return [[building, street].flatMap{$0}.joined(separator: " "), apt].flatMap{$0}.joined(separator: ", ") + return [[building, street].compactMap{$0}.joined(separator: " "), apt].compactMap{$0}.joined(separator: ", ") } var line2: String? { - return [[city, zip].flatMap{$0}.joined(separator: " "), country].flatMap{$0}.joined(separator: ", ") + return [[city, zip].compactMap{$0}.joined(separator: " "), country].compactMap{$0}.joined(separator: ", ") } } diff --git a/Source/Pickers/PhotoLibrary/Managers/Assets.swift b/Source/Pickers/PhotoLibrary/Managers/Assets.swift old mode 100644 new mode 100755 diff --git a/Source/Pickers/PhotoLibrary/PhotoLibraryPickerViewController.swift b/Source/Pickers/PhotoLibrary/PhotoLibraryPickerViewController.swift old mode 100644 new mode 100755 index 05bc9eb6..02b4ed61 --- a/Source/Pickers/PhotoLibrary/PhotoLibraryPickerViewController.swift +++ b/Source/Pickers/PhotoLibrary/PhotoLibraryPickerViewController.swift @@ -12,7 +12,7 @@ extension UIAlertController { /// - images: for content to select /// - selection: type and action for selection of image/images - func addPhotoLibraryPicker(flow: UICollectionViewScrollDirection, paging: Bool, selection: PhotoLibraryPickerViewController.Selection) { + func addPhotoLibraryPicker(flow: UICollectionView.ScrollDirection, paging: Bool, selection: PhotoLibraryPickerViewController.Selection) { let selection: PhotoLibraryPickerViewController.Selection = selection var asset: PHAsset? var assets: [PHAsset] = [] @@ -96,7 +96,7 @@ final class PhotoLibraryPickerViewController: UIViewController { $0.register(ItemWithImage.self, forCellWithReuseIdentifier: String(describing: ItemWithImage.self)) $0.showsVerticalScrollIndicator = false $0.showsHorizontalScrollIndicator = false - $0.decelerationRate = UIScrollViewDecelerationRateFast + $0.decelerationRate = UIScrollView.DecelerationRate.fast $0.contentInsetAdjustmentBehavior = .always $0.bounces = true $0.backgroundColor = .clear @@ -118,7 +118,7 @@ final class PhotoLibraryPickerViewController: UIViewController { // MARK: Initialize - required public init(flow: UICollectionViewScrollDirection, paging: Bool, selection: Selection) { + required public init(flow: UICollectionView.ScrollDirection, paging: Bool, selection: Selection) { super.init(nibName: nil, bundle: nil) self.selection = selection @@ -180,7 +180,7 @@ final class PhotoLibraryPickerViewController: UIViewController { let productName = Bundle.main.infoDictionary!["CFBundleName"]! let alert = UIAlertController(style: .alert, title: "Permission denied", message: "\(productName) does not have access to contacts. Please, allow the application to access to your photo library.") alert.addAction(title: "Settings", style: .destructive) { action in - if let settingsURL = URL(string: UIApplicationOpenSettingsURLString) { + if let settingsURL = URL(string: UIApplication.openSettingsURLString) { UIApplication.shared.open(settingsURL) } } @@ -199,7 +199,7 @@ final class PhotoLibraryPickerViewController: UIViewController { completionHandler(assets) case .error(let error): - let alert = UIAlertController(style: .alert, title: "Error", message: error.localizedDescription) + let alert = UIAlertController.init(title: "Error", message: error.localizedDescription, preferredStyle: .alert) alert.addAction(title: "OK") { [unowned self] action in self.alertController?.dismiss(animated: true) } diff --git a/Source/Pickers/PickerView/PickerViewViewController.swift b/Source/Pickers/PickerView/PickerViewViewController.swift old mode 100644 new mode 100755 diff --git a/Source/Pickers/Telegram/Layouts/PhotoLayout.swift b/Source/Pickers/Telegram/Layouts/PhotoLayout.swift old mode 100644 new mode 100755 diff --git a/Source/Pickers/Telegram/TelegramPickerViewController.swift b/Source/Pickers/Telegram/TelegramPickerViewController.swift old mode 100644 new mode 100755 index e568a651..a79a9c68 --- a/Source/Pickers/Telegram/TelegramPickerViewController.swift +++ b/Source/Pickers/Telegram/TelegramPickerViewController.swift @@ -102,7 +102,7 @@ final class TelegramPickerViewController: UIViewController { $0.allowsMultipleSelection = true $0.showsVerticalScrollIndicator = false $0.showsHorizontalScrollIndicator = false - $0.decelerationRate = UIScrollViewDecelerationRateFast + $0.decelerationRate = UIScrollView.DecelerationRate.fast $0.contentInsetAdjustmentBehavior = .never $0.contentInset = UI.insets $0.backgroundColor = .clear @@ -212,7 +212,7 @@ final class TelegramPickerViewController: UIViewController { let productName = Bundle.main.infoDictionary!["CFBundleName"]! let alert = UIAlertController(style: .alert, title: "Permission denied", message: "\(productName) does not have access to contacts. Please, allow the application to access to your photo library.") alert.addAction(title: "Settings", style: .destructive) { action in - if let settingsURL = URL(string: UIApplicationOpenSettingsURLString) { + if let settingsURL = URL(string: UIApplication.openSettingsURLString) { UIApplication.shared.open(settingsURL) } } diff --git a/Source/Pickers/Telegram/Views/ItemWithPhoto.swift b/Source/Pickers/Telegram/Views/ItemWithPhoto.swift old mode 100644 new mode 100755 diff --git a/Source/Pickers/Telegram/Views/LikeButtonCell.swift b/Source/Pickers/Telegram/Views/LikeButtonCell.swift old mode 100644 new mode 100755 index 3b3786f8..847e73dd --- a/Source/Pickers/Telegram/Views/LikeButtonCell.swift +++ b/Source/Pickers/Telegram/Views/LikeButtonCell.swift @@ -9,7 +9,7 @@ final class LikeButtonCell: UITableViewCell { // MARK: Initialize - override init(style: UITableViewCellStyle, reuseIdentifier: String?) { + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: .default, reuseIdentifier: reuseIdentifier) selectionStyle = .none backgroundColor = nil diff --git a/Source/Pickers/TextFields/OneTextFieldViewController.swift b/Source/Pickers/TextFields/OneTextFieldViewController.swift old mode 100644 new mode 100755 diff --git a/Source/Pickers/TextFields/TwoTextFieldsViewController.swift b/Source/Pickers/TextFields/TwoTextFieldsViewController.swift old mode 100644 new mode 100755 diff --git a/Source/Viewers/Models/AttributedTextBlock.swift b/Source/Viewers/Models/AttributedTextBlock.swift old mode 100644 new mode 100755 index e6c3c71c..113549e9 --- a/Source/Viewers/Models/AttributedTextBlock.swift +++ b/Source/Viewers/Models/AttributedTextBlock.swift @@ -11,16 +11,16 @@ public enum AttributedTextBlock { let attributedString: NSMutableAttributedString switch self { case .header1(let value): - let attributes: [NSAttributedStringKey: Any] = [.font: UIFont.boldSystemFont(ofSize: 20), .foregroundColor: UIColor.black] + let attributes: [NSAttributedString.Key: Any] = [.font: UIFont.boldSystemFont(ofSize: 20), .foregroundColor: UIColor.black] attributedString = NSMutableAttributedString(string: value, attributes: attributes) case .header2(let value): - let attributes: [NSAttributedStringKey: Any] = [.font: UIFont.boldSystemFont(ofSize: 18), .foregroundColor: UIColor.black] + let attributes: [NSAttributedString.Key: Any] = [.font: UIFont.boldSystemFont(ofSize: 18), .foregroundColor: UIColor.black] attributedString = NSMutableAttributedString(string: value, attributes: attributes) case .normal(let value): - let attributes: [NSAttributedStringKey: Any] = [.font: UIFont.systemFont(ofSize: 15), .foregroundColor: UIColor.black] + let attributes: [NSAttributedString.Key: Any] = [.font: UIFont.systemFont(ofSize: 15), .foregroundColor: UIColor.black] attributedString = NSMutableAttributedString(string: value, attributes: attributes) case .list(let value): - let attributes: [NSAttributedStringKey: Any] = [.font: UIFont.systemFont(ofSize: 15), .foregroundColor: UIColor.black] + let attributes: [NSAttributedString.Key: Any] = [.font: UIFont.systemFont(ofSize: 15), .foregroundColor: UIColor.black] attributedString = NSMutableAttributedString(string: "∙ " + value, attributes: attributes) } let paragraphStyle = NSMutableParagraphStyle() diff --git a/Source/Viewers/TextViewController.swift b/Source/Viewers/TextViewController.swift old mode 100644 new mode 100755 index 4e0d45a3..97cf2204 --- a/Source/Viewers/TextViewController.swift +++ b/Source/Viewers/TextViewController.swift @@ -46,7 +46,7 @@ final class TextViewerViewController: UIViewController { case .attributedText(let text): textView.attributedText = text.map { $0.text }.joined(separator: "\n") } - textView.textContainerInset = UIEdgeInsetsMake(UI.hInset, UI.vInset, UI.hInset, UI.vInset) + textView.textContainerInset = UIEdgeInsets(top: UI.hInset, left: UI.vInset, bottom: UI.hInset, right: UI.vInset) //preferredContentSize.height = self.textView.contentSize.height } diff --git a/Source/Views/Button.swift b/Source/Views/Button.swift old mode 100644 new mode 100755 diff --git a/Source/Views/GradientSlider.swift b/Source/Views/GradientSlider.swift index 96925845..34a2bcd7 100755 --- a/Source/Views/GradientSlider.swift +++ b/Source/Views/GradientSlider.swift @@ -276,11 +276,11 @@ import UIKit //MARK: - Layout override open var intrinsicContentSize: CGSize { - return CGSize(width: UIViewNoIntrinsicMetric, height: thumbSize) + return CGSize(width: UIView.noIntrinsicMetric, height: thumbSize) } override open var alignmentRectInsets: UIEdgeInsets { - return UIEdgeInsetsMake(4.0, 2.0, 4.0, 2.0) + return UIEdgeInsets(top: 4.0, left: 2.0, bottom: 4.0, right: 2.0) } override open func layoutSublayers(of layer: CALayer) { @@ -358,7 +358,7 @@ import UIKit set(value: newValue, animated: false) } actionBlock(self,_value) - sendActions(for: [UIControlEvents.valueChanged, UIControlEvents.touchUpInside]) + sendActions(for: [UIControl.Event.valueChanged, UIControl.Event.touchUpInside]) } diff --git a/Source/Views/Label.swift b/Source/Views/Label.swift old mode 100644 new mode 100755 index c7e9f003..5045d63a --- a/Source/Views/Label.swift +++ b/Source/Views/Label.swift @@ -9,7 +9,8 @@ open class Label: UILabel { open var insets: UIEdgeInsets = .zero override open func drawText(in rect: CGRect) { - super.drawText(in: UIEdgeInsetsInsetRect(rect, insets)) + super.drawText(in: rect.inset(by: insets)) + } // Override -intrinsicContentSize: for Auto layout code diff --git a/Source/Views/SegmentedControl.swift b/Source/Views/SegmentedControl.swift old mode 100644 new mode 100755 diff --git a/Source/Views/TextField.swift b/Source/Views/TextField.swift old mode 100644 new mode 100755 From 2b03aea4472c86e9c96539450c59460417732d84 Mon Sep 17 00:00:00 2001 From: Yingdong Wang Date: Sat, 30 Mar 2019 01:25:22 +0800 Subject: [PATCH 02/12] 1.Remove "Public" 2.Add Switch "@unknown default:fatalError()" 3.Remove deprecated Method, Support Swift 5 --- Alerts&Pickers.xcodeproj/project.pbxproj | 17 +++-- .../AppIcon.appiconset/Contents.json | 3 +- .../AppIcon.appiconset/iPad Pro@2x.png | Bin 0 -> 19911 bytes Example/Resources/Info.plist | 8 +- Example/ViewController.swift | 2 +- Source/Extensions/Array+Extensions.swift | 8 +- Source/Extensions/Date+Extension.swift | 72 +++++++++--------- Source/Extensions/String+Extensions.swift | 12 +-- Source/Extensions/UIColor+Extensions.swift | 2 +- .../UISegmentedControl+Extensions.swift | 6 +- .../Extensions/UITextField+Extensions.swift | 2 +- Source/Extensions/UITextView+Extensions.swift | 4 +- Source/Extensions/UIView+Extensions.swift | 12 +-- .../ContactsPickerViewController.swift | 4 +- .../Pickers/Contacts/Managers/Contacts.swift | 4 +- .../Image/ImagePickerViewController.swift | 4 + .../Locale/LocalePickerViewController.swift | 2 +- .../PhotoLibraryPickerViewController.swift | 6 ++ .../TelegramPickerViewController.swift | 2 + 19 files changed, 95 insertions(+), 75 deletions(-) create mode 100644 Example/Resources/Assets.xcassets/AppIcon.appiconset/iPad Pro@2x.png diff --git a/Alerts&Pickers.xcodeproj/project.pbxproj b/Alerts&Pickers.xcodeproj/project.pbxproj index 57b416d7..5af19b3f 100644 --- a/Alerts&Pickers.xcodeproj/project.pbxproj +++ b/Alerts&Pickers.xcodeproj/project.pbxproj @@ -518,6 +518,7 @@ TargetAttributes = { FA3BB2722008B41B00E06F8F = { CreatedOnToolsVersion = 9.2; + LastSwiftMigration = 1020; ProvisioningStyle = Automatic; }; }; @@ -752,13 +753,15 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = XL743FKK28; + DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = "$(SRCROOT)/Example/Resources/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "AA.Alerts-Pickers"; + PRODUCT_BUNDLE_IDENTIFIER = "persional.Alerts-Pickers"; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 4.2; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; @@ -767,13 +770,15 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = XL743FKK28; + DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = "$(SRCROOT)/Example/Resources/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "AA.Alerts-Pickers"; + PRODUCT_BUNDLE_IDENTIFIER = "persional.Alerts-Pickers"; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 4.2; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Release; diff --git a/Example/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json b/Example/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json index 31a3aea8..8529dcb0 100644 --- a/Example/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/Example/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -91,8 +91,9 @@ "scale" : "2x" }, { - "idiom" : "ipad", "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "iPad Pro@2x.png", "scale" : "2x" }, { diff --git a/Example/Resources/Assets.xcassets/AppIcon.appiconset/iPad Pro@2x.png b/Example/Resources/Assets.xcassets/AppIcon.appiconset/iPad Pro@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..f5d65dbcf94d1b848ea98c001e16462b52da5d04 GIT binary patch literal 19911 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 literal 0 HcmV?d00001 diff --git a/Example/Resources/Info.plist b/Example/Resources/Info.plist index c99222fb..951b95b3 100644 --- a/Example/Resources/Info.plist +++ b/Example/Resources/Info.plist @@ -20,16 +20,16 @@ 1 LSRequiresIPhoneOS - UILaunchStoryboardName - LaunchScreen NSCameraUsageDescription $(PRODUCT_NAME) lets you make beautiful photos of your property or market items. It needs access to the Camera. + NSContactsUsageDescription + $(PRODUCT_NAME) needs access to the Contacts to let you find your friends. NSLocationWhenInUseUsageDescription $(PRODUCT_NAME) lets you keep track of interesting places. It needs access to the GPS coordinates for your location. NSPhotoLibraryUsageDescription $(PRODUCT_NAME) needs access to the Photo Library to let you add photos from your Photo Library. - NSContactsUsageDescription - $(PRODUCT_NAME) needs access to the Contacts to let you find your friends. + UILaunchStoryboardName + LaunchScreen UIRequiredDeviceCapabilities armv7 diff --git a/Example/ViewController.swift b/Example/ViewController.swift index df8ddb0a..1e87b27c 100644 --- a/Example/ViewController.swift +++ b/Example/ViewController.swift @@ -293,7 +293,7 @@ class ViewController: UIViewController { let frameSizes: [CGFloat] = (150...300).map { CGFloat($0) } let pickerViewValues: [[String]] = [frameSizes.map { Int($0).description }] - let pickerViewSelectedValue: PickerViewViewController.Index = (column: 0, row: frameSizes.index(of: 216) ?? 0) + let pickerViewSelectedValue: PickerViewViewController.Index = (column: 0, row: frameSizes.firstIndex(of: 216) ?? 0) alert.addPickerView(values: pickerViewValues, initialSelection: pickerViewSelectedValue) { vc, picker, index, values in diff --git a/Source/Extensions/Array+Extensions.swift b/Source/Extensions/Array+Extensions.swift index 97fdf5de..f47621e9 100755 --- a/Source/Extensions/Array+Extensions.swift +++ b/Source/Extensions/Array+Extensions.swift @@ -109,14 +109,14 @@ extension Array where Element: Equatable { public extension Array { /// Random item from array. - public var randomItem: Element? { + var randomItem: Element? { if self.isEmpty { return nil } let index = Int(arc4random_uniform(UInt32(count))) return self[index] } /// Shuffled version of array. - public var shuffled: [Element] { + var shuffled: [Element] { var arr = self for _ in 0..<10 { arr.sort { (_,_) in arc4random() < arc4random() } @@ -125,7 +125,7 @@ public extension Array { } /// Shuffle array. - public mutating func shuffle() { + mutating func shuffle() { // https://gist.github.com/ijoshsmith/5e3c7d8c2099a3fe8dc3 for _ in 0..<10 { sort { (_,_) in arc4random() < arc4random() } @@ -136,7 +136,7 @@ public extension Array { /// /// - Parameter index: index of element. /// - Returns: optional element (if exists). - public func item(at index: Int) -> Element? { + func item(at index: Int) -> Element? { guard index >= 0 && index < count else { return nil } return self[index] } diff --git a/Source/Extensions/Date+Extension.swift b/Source/Extensions/Date+Extension.swift index 279b7ca2..04c5dc98 100755 --- a/Source/Extensions/Date+Extension.swift +++ b/Source/Extensions/Date+Extension.swift @@ -3,17 +3,17 @@ import Foundation public extension Date { /// User’s current calendar. - public var calendar: Calendar { + var calendar: Calendar { return Calendar.current } /// Era. - public var era: Int { + var era: Int { return calendar.component(.era, from: self) } /// Year. - public var year: Int { + var year: Int { get { return calendar.component(.year, from: self) } @@ -23,12 +23,12 @@ public extension Date { } /// Quarter. - public var quarter: Int { + var quarter: Int { return calendar.component(.quarter, from: self) } /// Month. - public var month: Int { + var month: Int { get { return calendar.component(.month, from: self) } @@ -38,22 +38,22 @@ public extension Date { } /// Week of year. - public var weekOfYear: Int { + var weekOfYear: Int { return calendar.component(.weekOfYear, from: self) } /// Week of month. - public var weekOfMonth: Int { + var weekOfMonth: Int { return calendar.component(.weekOfMonth, from: self) } /// Weekday. - public var weekday: Int { + var weekday: Int { return calendar.component(.weekday, from: self) } /// Day. - public var day: Int { + var day: Int { get { return calendar.component(.day, from: self) } @@ -63,7 +63,7 @@ public extension Date { } /// Hour. - public var hour: Int { + var hour: Int { get { return calendar.component(.hour, from: self) } @@ -73,7 +73,7 @@ public extension Date { } /// Minutes. - public var minute: Int { + var minute: Int { get { return calendar.component(.minute, from: self) } @@ -83,7 +83,7 @@ public extension Date { } /// Seconds. - public var second: Int { + var second: Int { get { return calendar.component(.second, from: self) } @@ -93,27 +93,27 @@ public extension Date { } /// Nanoseconds. - public var nanosecond: Int { + var nanosecond: Int { return calendar.component(.nanosecond, from: self) } /// Check if date is in future. - public var isInFuture: Bool { + var isInFuture: Bool { return self > Date() } /// Check if date is in past. - public var isInPast: Bool { + var isInPast: Bool { return self < Date() } /// Check if date is in today. - public var isInToday: Bool { + var isInToday: Bool { return self.day == Date().day && self.month == Date().month && self.year == Date().year } /// ISO8601 string of format (yyyy-MM-dd'T'HH:mm:ss.SSS) from date. - public var iso8601String: String { + var iso8601String: String { // https://github.com/justinmakaila/NSDate-ISO-8601/blob/master/NSDateISO8601.swift let dateFormatter = DateFormatter() dateFormatter.locale = Locale(identifier: "en_US_POSIX") @@ -124,7 +124,7 @@ public extension Date { } /// Nearest five minutes to date. - public var nearestFiveMinutes: Date { + var nearestFiveMinutes: Date { var components = Calendar.current.dateComponents([.year, .month , .day , .hour , .minute], from: self) guard let min = components.minute else { return self @@ -138,7 +138,7 @@ public extension Date { } /// Nearest ten minutes to date. - public var nearestTenMinutes: Date { + var nearestTenMinutes: Date { var components = Calendar.current.dateComponents([.year, .month , .day , .hour , .minute], from: self) guard let min = components.minute else { return self @@ -152,7 +152,7 @@ public extension Date { } /// Nearest quarter to date. - public var nearestHourQuarter: Date { + var nearestHourQuarter: Date { var components = Calendar.current.dateComponents([.year, .month , .day , .hour , .minute], from: self) guard let min = components.minute else { return self @@ -166,7 +166,7 @@ public extension Date { } /// Nearest half hour to date. - public var nearestHalfHour: Date { + var nearestHalfHour: Date { var components = Calendar.current.dateComponents([.year, .month , .day , .hour , .minute], from: self) guard let min = components.minute else { return self @@ -180,12 +180,12 @@ public extension Date { } /// Time zone used by system. - public var timeZone: TimeZone { + var timeZone: TimeZone { return self.calendar.timeZone } /// UNIX timestamp from date. - public var unixTimestamp: Double { + var unixTimestamp: Double { return timeIntervalSince1970 } @@ -200,7 +200,7 @@ public extension Date { /// - Parameters: /// - component: component type. /// - value: multiples of compnenet to add. - public mutating func add(_ component: Calendar.Component, value: Int) { + mutating func add(_ component: Calendar.Component, value: Int) { switch component { case .second: self = calendar.date(byAdding: .second, value: value, to: self) ?? self @@ -241,7 +241,7 @@ public extension Date { /// - component: component type. /// - value: multiples of compnenets to add. /// - Returns: original date + multiples of compnenet added. - public func adding(_ component: Calendar.Component, value: Int) -> Date { + func adding(_ component: Calendar.Component, value: Int) -> Date { switch component { case .second: return calendar.date(byAdding: .second, value: value, to: self) ?? self @@ -275,7 +275,7 @@ public extension Date { /// - component: component type. /// - value: new value of compnenet to change. /// - Returns: original date + multiples of compnenets added. - public func changing(_ component: Calendar.Component, value: Int) -> Date { + func changing(_ component: Calendar.Component, value: Int) -> Date { switch component { case .second: var date = self @@ -316,7 +316,7 @@ public extension Date { /// /// - Parameter component: calendar component to get date at the beginning of. /// - Returns: date at the beginning of calendar component (if applicable). - public func beginning(of component: Calendar.Component) -> Date? { + func beginning(of component: Calendar.Component) -> Date? { switch component { case .second: return calendar.date(from: calendar.dateComponents([.year, .month, .day, .hour, .minute, .second], from: self)) @@ -348,7 +348,7 @@ public extension Date { /// /// - Parameter component: calendar component to get date at the end of. /// - Returns: date at the end of calendar component (if applicable). - public func end(of component: Calendar.Component) -> Date? { + func end(of component: Calendar.Component) -> Date? { switch component { case .second: var date = self.adding(.second, value: 1) @@ -425,7 +425,7 @@ public extension Date { /// /// - Parameter style: DateFormatter style (default is .medium) /// - Returns: date and time string - public func dateTimeString(ofStyle style: DateFormatter.Style = .medium) -> String { + func dateTimeString(ofStyle style: DateFormatter.Style = .medium) -> String { let dateFormatter = DateFormatter() dateFormatter.timeStyle = style dateFormatter.dateStyle = style @@ -436,7 +436,7 @@ public extension Date { /// /// - Parameter component: calendar componenet to check. /// - Returns: true if date is in current given calendar component. - public func isInCurrent(_ component: Calendar.Component) -> Bool { + func isInCurrent(_ component: Calendar.Component) -> Bool { switch component { case .second: return second == Date().second && minute == Date().minute && hour == Date().hour && day == Date().day @@ -473,7 +473,7 @@ public extension Date { } /// Time string from date - public func timeString(ofStyle style: DateFormatter.Style = .medium) -> String { + func timeString(ofStyle style: DateFormatter.Style = .medium) -> String { let dateFormatter = DateFormatter() dateFormatter.timeStyle = style dateFormatter.dateStyle = .none @@ -499,7 +499,7 @@ public extension Date { /// - minute: Minute (default is current minute). /// - second: Second (default is current second). /// - nanosecond: Nanosecond (default is current nanosecond). - public init( + init( calendar: Calendar? = Calendar.current, timeZone: TimeZone? = TimeZone.current, era: Int? = Date().era, @@ -529,7 +529,7 @@ public extension Date { /// Create date object from ISO8601 string. /// /// - Parameter iso8601String: ISO8601 string of format (yyyy-MM-dd'T'HH:mm:ss.SSSZ). - public init(iso8601String: String) { + init(iso8601String: String) { // https://github.com/justinmakaila/NSDate-ISO-8601/blob/master/NSDateISO8601.swift let dateFormatter = DateFormatter() dateFormatter.locale = Locale(identifier: "en_US_POSIX") @@ -541,7 +541,7 @@ public extension Date { /// Create new date object from UNIX timestamp. /// /// - Parameter unixTimestamp: UNIX timestamp. - public init(unixTimestamp: Double) { + init(unixTimestamp: Double) { self.init(timeIntervalSince1970: unixTimestamp) } @@ -549,7 +549,7 @@ public extension Date { public extension Date { /// SwiftRandom extension - public static func randomWithinDaysBeforeToday(_ days: Int) -> Date { + static func randomWithinDaysBeforeToday(_ days: Int) -> Date { let today = Date() let gregorian = Calendar(identifier: Calendar.Identifier.gregorian) @@ -572,7 +572,7 @@ public extension Date { } /// SwiftRandom extension - public static func random() -> Date { + static func random() -> Date { let randomTime = TimeInterval(arc4random_uniform(UInt32.max)) return Date(timeIntervalSince1970: randomTime) } diff --git a/Source/Extensions/String+Extensions.swift b/Source/Extensions/String+Extensions.swift index da2634a4..58ebe5ff 100755 --- a/Source/Extensions/String+Extensions.swift +++ b/Source/Extensions/String+Extensions.swift @@ -30,27 +30,27 @@ extension String { public extension String { /// Regular string. - public var regular: NSAttributedString { + var regular: NSAttributedString { return NSMutableAttributedString(string: self, attributes: [.font: UIFont.systemFont(ofSize: UIFont.systemFontSize)]) } /// Bold string. - public var bold: NSAttributedString { + var bold: NSAttributedString { return NSMutableAttributedString(string: self, attributes: [.font: UIFont.boldSystemFont(ofSize: UIFont.systemFontSize)]) } /// Underlined string - public var underline: NSAttributedString { + var underline: NSAttributedString { return NSAttributedString(string: self, attributes: [.underlineStyle: NSUnderlineStyle.single.rawValue]) } /// Strikethrough string. - public var strikethrough: NSAttributedString { + var strikethrough: NSAttributedString { return NSAttributedString(string: self, attributes: [.strikethroughStyle: NSNumber(value: NSUnderlineStyle.single.rawValue as Int)]) } /// Italic string. - public var italic: NSAttributedString { + var italic: NSAttributedString { return NSMutableAttributedString(string: self, attributes: [.font: UIFont.italicSystemFont(ofSize: UIFont.systemFontSize)]) } @@ -58,7 +58,7 @@ public extension String { /// /// - Parameter color: text color. /// - Returns: a NSAttributedString versions of string colored with given color. - public func colored(with color: UIColor) -> NSAttributedString { + func colored(with color: UIColor) -> NSAttributedString { return NSMutableAttributedString(string: self, attributes: [.foregroundColor: color]) } } diff --git a/Source/Extensions/UIColor+Extensions.swift b/Source/Extensions/UIColor+Extensions.swift index 62747ece..000d2799 100755 --- a/Source/Extensions/UIColor+Extensions.swift +++ b/Source/Extensions/UIColor+Extensions.swift @@ -146,7 +146,7 @@ public extension UIColor { /// - green: green component. /// - blue: blue component. /// - transparency: optional transparency value (default is 1) - public convenience init(red: Int, green: Int, blue: Int, transparency: CGFloat = 1) { + convenience init(red: Int, green: Int, blue: Int, transparency: CGFloat = 1) { assert(red >= 0 && red <= 255, "Invalid red component") assert(green >= 0 && green <= 255, "Invalid green component") assert(blue >= 0 && blue <= 255, "Invalid blue component") diff --git a/Source/Extensions/UISegmentedControl+Extensions.swift b/Source/Extensions/UISegmentedControl+Extensions.swift index ea7fac49..4acf0522 100755 --- a/Source/Extensions/UISegmentedControl+Extensions.swift +++ b/Source/Extensions/UISegmentedControl+Extensions.swift @@ -3,7 +3,7 @@ import UIKit public extension UISegmentedControl { /// Font of titles - public func title(font: UIFont) { + func title(font: UIFont) { let attributes: [NSAttributedString.Key: Any] = [.font: font] setTitleTextAttributes(attributes, for: UIControl.State()) //setNeedsDisplay() @@ -11,7 +11,7 @@ public extension UISegmentedControl { } /// Segments titles. - public var segmentTitles: [String?] { + var segmentTitles: [String?] { get { var titles: [String?] = [] var i = 0 @@ -30,7 +30,7 @@ public extension UISegmentedControl { } /// Segments images. - public var segmentImages: [UIImage?] { + var segmentImages: [UIImage?] { get { var images: [UIImage?] = [] var i = 0 diff --git a/Source/Extensions/UITextField+Extensions.swift b/Source/Extensions/UITextField+Extensions.swift index 314010d2..84895c4f 100755 --- a/Source/Extensions/UITextField+Extensions.swift +++ b/Source/Extensions/UITextField+Extensions.swift @@ -48,7 +48,7 @@ public extension UITextField { /// Set placeholder text color. /// /// - Parameter color: placeholder text color. - public func setPlaceHolderTextColor(_ color: UIColor) { + func setPlaceHolderTextColor(_ color: UIColor) { self.attributedPlaceholder = NSAttributedString(string:self.placeholder != nil ? self.placeholder! : "", attributes:[NSAttributedString.Key.foregroundColor: color]) } diff --git a/Source/Extensions/UITextView+Extensions.swift b/Source/Extensions/UITextView+Extensions.swift index 853b6296..8c44f189 100755 --- a/Source/Extensions/UITextView+Extensions.swift +++ b/Source/Extensions/UITextView+Extensions.swift @@ -4,13 +4,13 @@ import UIKit public extension UITextView { /// Scroll to the bottom of text view - public func scrollToBottom() { + func scrollToBottom() { let range = NSMakeRange((text as NSString).length - 1, 1) scrollRangeToVisible(range) } /// Scroll to the top of text view - public func scrollToTop() { + func scrollToTop() { let range = NSMakeRange(0, 1) scrollRangeToVisible(range) } diff --git a/Source/Extensions/UIView+Extensions.swift b/Source/Extensions/UIView+Extensions.swift index 10f754c5..d6161be0 100755 --- a/Source/Extensions/UIView+Extensions.swift +++ b/Source/Extensions/UIView+Extensions.swift @@ -158,7 +158,7 @@ extension UIView { public extension UIView { /// Size of view. - public var size: CGSize { + var size: CGSize { get { return self.frame.size } @@ -169,7 +169,7 @@ public extension UIView { } /// Width of view. - public var width: CGFloat { + var width: CGFloat { get { return self.frame.size.width } @@ -179,7 +179,7 @@ public extension UIView { } /// Height of view. - public var height: CGFloat { + var height: CGFloat { get { return self.frame.size.height } @@ -202,9 +202,9 @@ extension UIView { public extension UIView { - public typealias Configuration = (UIView) -> Swift.Void + typealias Configuration = (UIView) -> Swift.Void - public func config(configurate: Configuration?) { + func config(configurate: Configuration?) { configurate?(self) } @@ -213,7 +213,7 @@ public extension UIView { /// - Parameters: /// - corners: array of corners to change (example: [.bottomLeft, .topRight]). /// - radius: radius for selected corners. - public func roundCorners(_ corners: UIRectCorner, radius: CGFloat) { + func roundCorners(_ corners: UIRectCorner, radius: CGFloat) { let maskPath = UIBezierPath(roundedRect: bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius)) let shape = CAShapeLayer() shape.path = maskPath.cgPath diff --git a/Source/Pickers/Contacts/ContactsPickerViewController.swift b/Source/Pickers/Contacts/ContactsPickerViewController.swift index 8324655c..7aeb0ecd 100755 --- a/Source/Pickers/Contacts/ContactsPickerViewController.swift +++ b/Source/Pickers/Contacts/ContactsPickerViewController.swift @@ -177,6 +177,8 @@ final class ContactsPickerViewController: UIViewController { self.alertController?.dismiss(animated: true) } alert.show() + @unknown default: + fatalError() } } @@ -298,7 +300,7 @@ extension ContactsPickerViewController: UITableViewDataSource { func tableView(_ tableView: UITableView, sectionForSectionIndexTitle title: String, at index: Int) -> Int { if searchController.isActive { return 0 } tableView.scrollToRow(at: IndexPath(row: 0, section: index), at: .top , animated: false) - return sortedContactKeys.index(of: title)! + return sortedContactKeys.firstIndex(of: title)! } func sectionIndexTitles(for tableView: UITableView) -> [String]? { diff --git a/Source/Pickers/Contacts/Managers/Contacts.swift b/Source/Pickers/Contacts/Managers/Contacts.swift index 1d8e7c77..66b87882 100755 --- a/Source/Pickers/Contacts/Managers/Contacts.swift +++ b/Source/Pickers/Contacts/Managers/Contacts.swift @@ -168,8 +168,8 @@ public struct Contacts { let contactStore: CNContactStore = CNContactStore() var contacts: [CNContact] = [CNContact]() let predicate: NSPredicate - - if string.endIndex.encodedOffset > 0 { + + if string.endIndex.utf16Offset(in: string) > 0 { predicate = CNContact.predicateForContacts(matchingName: string) } else { predicate = CNContact.predicateForContactsInContainer(withIdentifier: CNContactStore().defaultContainerIdentifier()) diff --git a/Source/Pickers/Image/ImagePickerViewController.swift b/Source/Pickers/Image/ImagePickerViewController.swift index 1cd7bf6b..3801cdd6 100755 --- a/Source/Pickers/Image/ImagePickerViewController.swift +++ b/Source/Pickers/Image/ImagePickerViewController.swift @@ -48,6 +48,8 @@ final class ImagePickerViewController: UIViewController { switch layout.scrollDirection { case .vertical: return UIDevice.current.userInterfaceIdiom == .pad ? 3 : 2 case .horizontal: return 1 + @unknown default: + fatalError() } } @@ -57,6 +59,8 @@ final class ImagePickerViewController: UIViewController { return CGSize(width: view.bounds.width / columns, height: view.bounds.width / columns) case .horizontal: return CGSize(width: view.bounds.width, height: view.bounds.height / columns) + @unknown default: + fatalError() } } diff --git a/Source/Pickers/Locale/LocalePickerViewController.swift b/Source/Pickers/Locale/LocalePickerViewController.swift index 91058ccd..aac64fa9 100755 --- a/Source/Pickers/Locale/LocalePickerViewController.swift +++ b/Source/Pickers/Locale/LocalePickerViewController.swift @@ -297,7 +297,7 @@ extension LocalePickerViewController: UITableViewDataSource { func tableView(_ tableView: UITableView, sectionForSectionIndexTitle title: String, at index: Int) -> Int { if searchController.isActive { return 0 } tableView.scrollToRow(at: IndexPath(row: 0, section: index), at: .top , animated: false) - return sortedInfoKeys.index(of: title)! + return sortedInfoKeys.firstIndex(of: title)! } func sectionIndexTitles(for tableView: UITableView) -> [String]? { diff --git a/Source/Pickers/PhotoLibrary/PhotoLibraryPickerViewController.swift b/Source/Pickers/PhotoLibrary/PhotoLibraryPickerViewController.swift index 02b4ed61..6894c76c 100755 --- a/Source/Pickers/PhotoLibrary/PhotoLibraryPickerViewController.swift +++ b/Source/Pickers/PhotoLibrary/PhotoLibraryPickerViewController.swift @@ -76,6 +76,8 @@ final class PhotoLibraryPickerViewController: UIViewController { switch layout.scrollDirection { case .vertical: return UIDevice.current.userInterfaceIdiom == .pad ? 3 : 2 case .horizontal: return 1 + @unknown default: + fatalError() } } @@ -85,6 +87,8 @@ final class PhotoLibraryPickerViewController: UIViewController { return CGSize(width: view.bounds.width / columns, height: view.bounds.width / columns) case .horizontal: return CGSize(width: view.bounds.width, height: view.bounds.height / columns) + @unknown default: + fatalError() } } @@ -188,6 +192,8 @@ final class PhotoLibraryPickerViewController: UIViewController { self.alertController?.dismiss(animated: true) } alert.show() + @unknown default: + fatalError() } } diff --git a/Source/Pickers/Telegram/TelegramPickerViewController.swift b/Source/Pickers/Telegram/TelegramPickerViewController.swift index a79a9c68..02f132d5 100755 --- a/Source/Pickers/Telegram/TelegramPickerViewController.swift +++ b/Source/Pickers/Telegram/TelegramPickerViewController.swift @@ -220,6 +220,8 @@ final class TelegramPickerViewController: UIViewController { self.alertController?.dismiss(animated: true) } alert.show() + @unknown default: + fatalError() } } From 9e257ff3f95f874f097454a83ff4dc4581bd295f Mon Sep 17 00:00:00 2001 From: Yingdong Wang Date: Sat, 30 Mar 2019 01:28:14 +0800 Subject: [PATCH 03/12] Edit Readme File --- README.md | 4 ++-- iPad Pro@2x.png | Bin 0 -> 19911 bytes 2 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 iPad Pro@2x.png diff --git a/README.md b/README.md index 3057630a..4daa55c0 100755 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@

-Swift 4.0 +Swift 5.0 Platform: iOS XCode 9+ iOS 11 @@ -454,7 +454,7 @@ Download and drop `/Source` folder in your project. ## Requirements -* Swift 4 +* Swift 5 * iOS 11 or higher ## Authors diff --git a/iPad Pro@2x.png b/iPad Pro@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..f5d65dbcf94d1b848ea98c001e16462b52da5d04 GIT binary patch literal 19911 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 literal 0 HcmV?d00001 From 67be93a690c530c530437078898b655e81e28507 Mon Sep 17 00:00:00 2001 From: Yingdong Wang Date: Sat, 30 Mar 2019 01:48:46 +0800 Subject: [PATCH 04/12] 1 --- XPRACSignal.podspec | 137 ++++++++++++++++++++++++++++++++++++++++++++ iPad Pro@2x.png | Bin 19911 -> 0 bytes 2 files changed, 137 insertions(+) create mode 100644 XPRACSignal.podspec delete mode 100644 iPad Pro@2x.png diff --git a/XPRACSignal.podspec b/XPRACSignal.podspec new file mode 100644 index 00000000..adedc469 --- /dev/null +++ b/XPRACSignal.podspec @@ -0,0 +1,137 @@ +# +# Be sure to run `pod spec lint XPRACSignal.podspec' to ensure this is a +# valid spec and to remove all comments including this before submitting the spec. +# +# To learn more about Podspec attributes see http://docs.cocoapods.org/specification.html +# To see working Podspecs in the CocoaPods repo see https://github.com/CocoaPods/Specs/ +# + +Pod::Spec.new do |s| + + # ――― Spec Metadata ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # + # + # These will help people to find your library, and whilst it + # can feel like a chore to fill in it's definitely to your advantage. The + # summary should be tweet-length, and the description more in depth. + # + + s.name = "XPRACSignal" + s.version = "0.0.1" + s.summary = "A short description of XPRACSignal." + + # This description is used to generate tags and improve search results. + # * Think: What does it do? Why did you write it? What is the focus? + # * Try to keep it short, snappy and to the point. + # * Write the description between the DESC delimiters below. + # * Finally, don't worry about the indent, CocoaPods strips it! + s.description = <<-DESC + DESC + + s.homepage = "http://EXAMPLE/XPRACSignal" + # s.screenshots = "www.example.com/screenshots_1.gif", "www.example.com/screenshots_2.gif" + + + # ――― Spec License ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # + # + # Licensing your code is important. See http://choosealicense.com for more info. + # CocoaPods will detect a license file if there is a named LICENSE* + # Popular ones are 'MIT', 'BSD' and 'Apache License, Version 2.0'. + # + + s.license = "MIT (example)" + # s.license = { :type => "MIT", :file => "FILE_LICENSE" } + + + # ――― Author Metadata ――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # + # + # Specify the authors of the library, with email addresses. Email addresses + # of the authors are extracted from the SCM log. E.g. $ git log. CocoaPods also + # accepts just a name if you'd rather not provide an email address. + # + # Specify a social_media_url where others can refer to, for example a twitter + # profile URL. + # + + s.author = { "Yingdong Wang" => "wangyingdong@data-union.com" } + # Or just: s.author = "Yingdong Wang" + # s.authors = { "Yingdong Wang" => "wangyingdong@data-union.com" } + # s.social_media_url = "http://twitter.com/Yingdong Wang" + + # ――― Platform Specifics ――――――――――――――――――――――――――――――――――――――――――――――――――――――― # + # + # If this Pod runs only on iOS or OS X, then specify the platform and + # the deployment target. You can optionally include the target after the platform. + # + + # s.platform = :ios + # s.platform = :ios, "5.0" + + # When using multiple platforms + # s.ios.deployment_target = "5.0" + # s.osx.deployment_target = "10.7" + # s.watchos.deployment_target = "2.0" + # s.tvos.deployment_target = "9.0" + + + # ――― Source Location ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # + # + # Specify the location from where the source should be retrieved. + # Supports git, hg, bzr, svn and HTTP. + # + + s.source = { :git => "http://EXAMPLE/XPRACSignal.git", :tag => "#{s.version}" } + + + # ――― Source Code ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # + # + # CocoaPods is smart about how it includes source code. For source files + # giving a folder will include any swift, h, m, mm, c & cpp files. + # For header files it will include any header in the folder. + # Not including the public_header_files will make all headers public. + # + + s.source_files = "Classes", "Classes/**/*.{h,m}" + s.exclude_files = "Classes/Exclude" + + # s.public_header_files = "Classes/**/*.h" + + + # ――― Resources ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # + # + # A list of resources included with the Pod. These are copied into the + # target bundle with a build phase script. Anything else will be cleaned. + # You can preserve files from being cleaned, please don't preserve + # non-essential files like tests, examples and documentation. + # + + # s.resource = "icon.png" + # s.resources = "Resources/*.png" + + # s.preserve_paths = "FilesToSave", "MoreFilesToSave" + + + # ――― Project Linking ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # + # + # Link your library with frameworks, or libraries. Libraries do not include + # the lib prefix of their name. + # + + # s.framework = "SomeFramework" + # s.frameworks = "SomeFramework", "AnotherFramework" + + # s.library = "iconv" + # s.libraries = "iconv", "xml2" + + + # ――― Project Settings ――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # + # + # If your library depends on compiler flags you can set them in the xcconfig hash + # where they will only apply to your library. If you depend on other Podspecs + # you can include multiple dependencies to ensure it works. + + # s.requires_arc = true + + # s.xcconfig = { "HEADER_SEARCH_PATHS" => "$(SDKROOT)/usr/include/libxml2" } + # s.dependency "JSONKit", "~> 1.4" + +end diff --git a/iPad Pro@2x.png b/iPad Pro@2x.png deleted file mode 100644 index f5d65dbcf94d1b848ea98c001e16462b52da5d04..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19911 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 From fc6915c367b6d6f4eeabae4c494565e7bececdc0 Mon Sep 17 00:00:00 2001 From: Yingdong Wang Date: Sat, 30 Mar 2019 01:54:16 +0800 Subject: [PATCH 05/12] 2 --- XPRACSignal.podspec | 146 ++++---------------------------------------- 1 file changed, 11 insertions(+), 135 deletions(-) diff --git a/XPRACSignal.podspec b/XPRACSignal.podspec index adedc469..e6e421b6 100644 --- a/XPRACSignal.podspec +++ b/XPRACSignal.podspec @@ -1,137 +1,13 @@ -# -# Be sure to run `pod spec lint XPRACSignal.podspec' to ensure this is a -# valid spec and to remove all comments including this before submitting the spec. -# -# To learn more about Podspec attributes see http://docs.cocoapods.org/specification.html -# To see working Podspecs in the CocoaPods repo see https://github.com/CocoaPods/Specs/ -# - Pod::Spec.new do |s| - - # ――― Spec Metadata ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # - # - # These will help people to find your library, and whilst it - # can feel like a chore to fill in it's definitely to your advantage. The - # summary should be tweet-length, and the description more in depth. - # - - s.name = "XPRACSignal" - s.version = "0.0.1" - s.summary = "A short description of XPRACSignal." - - # This description is used to generate tags and improve search results. - # * Think: What does it do? Why did you write it? What is the focus? - # * Try to keep it short, snappy and to the point. - # * Write the description between the DESC delimiters below. - # * Finally, don't worry about the indent, CocoaPods strips it! - s.description = <<-DESC - DESC - - s.homepage = "http://EXAMPLE/XPRACSignal" - # s.screenshots = "www.example.com/screenshots_1.gif", "www.example.com/screenshots_2.gif" - - - # ――― Spec License ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # - # - # Licensing your code is important. See http://choosealicense.com for more info. - # CocoaPods will detect a license file if there is a named LICENSE* - # Popular ones are 'MIT', 'BSD' and 'Apache License, Version 2.0'. - # - - s.license = "MIT (example)" - # s.license = { :type => "MIT", :file => "FILE_LICENSE" } - - - # ――― Author Metadata ――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # - # - # Specify the authors of the library, with email addresses. Email addresses - # of the authors are extracted from the SCM log. E.g. $ git log. CocoaPods also - # accepts just a name if you'd rather not provide an email address. - # - # Specify a social_media_url where others can refer to, for example a twitter - # profile URL. - # - - s.author = { "Yingdong Wang" => "wangyingdong@data-union.com" } - # Or just: s.author = "Yingdong Wang" - # s.authors = { "Yingdong Wang" => "wangyingdong@data-union.com" } - # s.social_media_url = "http://twitter.com/Yingdong Wang" - - # ――― Platform Specifics ――――――――――――――――――――――――――――――――――――――――――――――――――――――― # - # - # If this Pod runs only on iOS or OS X, then specify the platform and - # the deployment target. You can optionally include the target after the platform. - # - - # s.platform = :ios - # s.platform = :ios, "5.0" - - # When using multiple platforms - # s.ios.deployment_target = "5.0" - # s.osx.deployment_target = "10.7" - # s.watchos.deployment_target = "2.0" - # s.tvos.deployment_target = "9.0" - - - # ――― Source Location ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # - # - # Specify the location from where the source should be retrieved. - # Supports git, hg, bzr, svn and HTTP. - # - - s.source = { :git => "http://EXAMPLE/XPRACSignal.git", :tag => "#{s.version}" } - - - # ――― Source Code ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # - # - # CocoaPods is smart about how it includes source code. For source files - # giving a folder will include any swift, h, m, mm, c & cpp files. - # For header files it will include any header in the folder. - # Not including the public_header_files will make all headers public. - # - - s.source_files = "Classes", "Classes/**/*.{h,m}" - s.exclude_files = "Classes/Exclude" - - # s.public_header_files = "Classes/**/*.h" - - - # ――― Resources ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # - # - # A list of resources included with the Pod. These are copied into the - # target bundle with a build phase script. Anything else will be cleaned. - # You can preserve files from being cleaned, please don't preserve - # non-essential files like tests, examples and documentation. - # - - # s.resource = "icon.png" - # s.resources = "Resources/*.png" - - # s.preserve_paths = "FilesToSave", "MoreFilesToSave" - - - # ――― Project Linking ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # - # - # Link your library with frameworks, or libraries. Libraries do not include - # the lib prefix of their name. - # - - # s.framework = "SomeFramework" - # s.frameworks = "SomeFramework", "AnotherFramework" - - # s.library = "iconv" - # s.libraries = "iconv", "xml2" - - - # ――― Project Settings ――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # - # - # If your library depends on compiler flags you can set them in the xcconfig hash - # where they will only apply to your library. If you depend on other Podspecs - # you can include multiple dependencies to ensure it works. - - # s.requires_arc = true - - # s.xcconfig = { "HEADER_SEARCH_PATHS" => "$(SDKROOT)/usr/include/libxml2" } - # s.dependency "JSONKit", "~> 1.4" - +s.name = "Alerts&Pickers" +s.version = "1.0.0" +s.summary = "Advanced usage of native UIAlertController with TextField, TextView, DatePicker, PickerView, TableView, CollectionView and MapView." +s.homepage = "https://github.com/dongdongpc/alerts-and-pickers.git" +s.license = { :type => "MIT", :file => "LICENSE" } +s.author = { "Yuji Hato" => "1192490197@qq.com" } +s.platform = :ios +s.ios.deployment_target = "10.0" +s.source = { :git => "https://github.com/dongdongpc/alerts-and-pickers.git", :tag => s.version } +s.source_files = "Source/*.swift" +s.requires_arc = true end From 9756fc0876b8e893ea0215443f2522bb946b86cb Mon Sep 17 00:00:00 2001 From: Yingdong Wang Date: Sat, 30 Mar 2019 01:56:20 +0800 Subject: [PATCH 06/12] 2 --- Alerts&Pickers.podspec | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 Alerts&Pickers.podspec diff --git a/Alerts&Pickers.podspec b/Alerts&Pickers.podspec new file mode 100644 index 00000000..e6e421b6 --- /dev/null +++ b/Alerts&Pickers.podspec @@ -0,0 +1,13 @@ +Pod::Spec.new do |s| +s.name = "Alerts&Pickers" +s.version = "1.0.0" +s.summary = "Advanced usage of native UIAlertController with TextField, TextView, DatePicker, PickerView, TableView, CollectionView and MapView." +s.homepage = "https://github.com/dongdongpc/alerts-and-pickers.git" +s.license = { :type => "MIT", :file => "LICENSE" } +s.author = { "Yuji Hato" => "1192490197@qq.com" } +s.platform = :ios +s.ios.deployment_target = "10.0" +s.source = { :git => "https://github.com/dongdongpc/alerts-and-pickers.git", :tag => s.version } +s.source_files = "Source/*.swift" +s.requires_arc = true +end From a69b8c3a56690db6c3bb24181efe6f02d57c082c Mon Sep 17 00:00:00 2001 From: Yingdong Wang Date: Sat, 30 Mar 2019 01:56:38 +0800 Subject: [PATCH 07/12] remove --- XPRACSignal.podspec | 13 ------------- 1 file changed, 13 deletions(-) delete mode 100644 XPRACSignal.podspec diff --git a/XPRACSignal.podspec b/XPRACSignal.podspec deleted file mode 100644 index e6e421b6..00000000 --- a/XPRACSignal.podspec +++ /dev/null @@ -1,13 +0,0 @@ -Pod::Spec.new do |s| -s.name = "Alerts&Pickers" -s.version = "1.0.0" -s.summary = "Advanced usage of native UIAlertController with TextField, TextView, DatePicker, PickerView, TableView, CollectionView and MapView." -s.homepage = "https://github.com/dongdongpc/alerts-and-pickers.git" -s.license = { :type => "MIT", :file => "LICENSE" } -s.author = { "Yuji Hato" => "1192490197@qq.com" } -s.platform = :ios -s.ios.deployment_target = "10.0" -s.source = { :git => "https://github.com/dongdongpc/alerts-and-pickers.git", :tag => s.version } -s.source_files = "Source/*.swift" -s.requires_arc = true -end From 62b4f751bebed91a59607c2599c7d0842ba2f533 Mon Sep 17 00:00:00 2001 From: Yingdong Wang Date: Sat, 30 Mar 2019 01:58:24 +0800 Subject: [PATCH 08/12] fix error --- Alerts&Pickers.podspec | 2 +- Alerts&Pickers.xcodeproj/project.pbxproj | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Alerts&Pickers.podspec b/Alerts&Pickers.podspec index e6e421b6..90f2011b 100644 --- a/Alerts&Pickers.podspec +++ b/Alerts&Pickers.podspec @@ -6,7 +6,7 @@ s.homepage = "https://github.com/dongdongpc/alerts-and-pickers.git" s.license = { :type => "MIT", :file => "LICENSE" } s.author = { "Yuji Hato" => "1192490197@qq.com" } s.platform = :ios -s.ios.deployment_target = "10.0" +s.ios.deployment_target = "9.0" s.source = { :git => "https://github.com/dongdongpc/alerts-and-pickers.git", :tag => s.version } s.source_files = "Source/*.swift" s.requires_arc = true diff --git a/Alerts&Pickers.xcodeproj/project.pbxproj b/Alerts&Pickers.xcodeproj/project.pbxproj index 5af19b3f..a8ffa0a8 100644 --- a/Alerts&Pickers.xcodeproj/project.pbxproj +++ b/Alerts&Pickers.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 365C130B224E93B70024D6A5 /* Alerts&Pickers.podspec in Resources */ = {isa = PBXBuildFile; fileRef = 365C130A224E93B70024D6A5 /* Alerts&Pickers.podspec */; }; FA005E922015D769001EA8C6 /* Contacts.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA005E912015D769001EA8C6 /* Contacts.swift */; }; FA005E942015E490001EA8C6 /* UISearchBar+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA005E932015E490001EA8C6 /* UISearchBar+Extensions.swift */; }; FA005E9620162BB5001EA8C6 /* Assets.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA005E9520162BB5001EA8C6 /* Assets.swift */; }; @@ -73,6 +74,7 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + 365C130A224E93B70024D6A5 /* Alerts&Pickers.podspec */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "Alerts&Pickers.podspec"; sourceTree = SOURCE_ROOT; }; FA005E912015D769001EA8C6 /* Contacts.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Contacts.swift; sourceTree = ""; }; FA005E932015E490001EA8C6 /* UISearchBar+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UISearchBar+Extensions.swift"; sourceTree = ""; }; FA005E9520162BB5001EA8C6 /* Assets.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Assets.swift; sourceTree = ""; }; @@ -243,6 +245,7 @@ FA3BB28A2008B46500E06F8F /* Resources */, FA3BB2AA2008B46800E06F8F /* ViewController.swift */, FA3BB2AB2008B46800E06F8F /* AppDelegate.swift */, + 365C130A224E93B70024D6A5 /* Alerts&Pickers.podspec */, ); path = Example; sourceTree = ""; @@ -550,6 +553,7 @@ FA3BB2CF2008B9FA00E06F8F /* LICENSE in Resources */, FA3BB2BF2008B46900E06F8F /* Countries.bundle in Resources */, FA3BB2AD2008B46800E06F8F /* LaunchScreen.storyboard in Resources */, + 365C130B224E93B70024D6A5 /* Alerts&Pickers.podspec in Resources */, FA3BB2AC2008B46800E06F8F /* Assets.xcassets in Resources */, FA3BB2CD2008B98F00E06F8F /* Assets in Resources */, FA3BB2892008B45600E06F8F /* README.md in Resources */, From 67974472db691c6a997fb78942e030fb6d967862 Mon Sep 17 00:00:00 2001 From: Yingdong Wang Date: Sat, 30 Mar 2019 02:01:44 +0800 Subject: [PATCH 09/12] fix error --- Alerts&Pickers.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Alerts&Pickers.podspec b/Alerts&Pickers.podspec index 90f2011b..98801fa0 100644 --- a/Alerts&Pickers.podspec +++ b/Alerts&Pickers.podspec @@ -8,6 +8,6 @@ s.author = { "Yuji Hato" => "1192490197@qq.com" } s.platform = :ios s.ios.deployment_target = "9.0" s.source = { :git => "https://github.com/dongdongpc/alerts-and-pickers.git", :tag => s.version } -s.source_files = "Source/*.swift" +s.source_files = "Source/" s.requires_arc = true end From 744f08a669d91773f79acce1e5892dd78cff588c Mon Sep 17 00:00:00 2001 From: Yingdong Wang Date: Sat, 30 Mar 2019 02:05:40 +0800 Subject: [PATCH 10/12] 1 --- Alerts&Pickers.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Alerts&Pickers.podspec b/Alerts&Pickers.podspec index 98801fa0..90f2011b 100644 --- a/Alerts&Pickers.podspec +++ b/Alerts&Pickers.podspec @@ -8,6 +8,6 @@ s.author = { "Yuji Hato" => "1192490197@qq.com" } s.platform = :ios s.ios.deployment_target = "9.0" s.source = { :git => "https://github.com/dongdongpc/alerts-and-pickers.git", :tag => s.version } -s.source_files = "Source/" +s.source_files = "Source/*.swift" s.requires_arc = true end From af21067c059ba046eb9daa9ce2f6115c55bce0f1 Mon Sep 17 00:00:00 2001 From: dongdongpc Date: Sat, 30 Mar 2019 02:10:06 +0800 Subject: [PATCH 11/12] Delete Alerts&Pickers.podspec --- Alerts&Pickers.podspec | 13 ------------- 1 file changed, 13 deletions(-) delete mode 100644 Alerts&Pickers.podspec diff --git a/Alerts&Pickers.podspec b/Alerts&Pickers.podspec deleted file mode 100644 index 90f2011b..00000000 --- a/Alerts&Pickers.podspec +++ /dev/null @@ -1,13 +0,0 @@ -Pod::Spec.new do |s| -s.name = "Alerts&Pickers" -s.version = "1.0.0" -s.summary = "Advanced usage of native UIAlertController with TextField, TextView, DatePicker, PickerView, TableView, CollectionView and MapView." -s.homepage = "https://github.com/dongdongpc/alerts-and-pickers.git" -s.license = { :type => "MIT", :file => "LICENSE" } -s.author = { "Yuji Hato" => "1192490197@qq.com" } -s.platform = :ios -s.ios.deployment_target = "9.0" -s.source = { :git => "https://github.com/dongdongpc/alerts-and-pickers.git", :tag => s.version } -s.source_files = "Source/*.swift" -s.requires_arc = true -end From a42ada554e10a5dce9cc2b8b705b9e465e0baf6d Mon Sep 17 00:00:00 2001 From: Yingdong Wang Date: Fri, 5 Apr 2019 12:28:14 +0800 Subject: [PATCH 12/12] remove pod file --- Alerts&Pickers.xcodeproj/project.pbxproj | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Alerts&Pickers.xcodeproj/project.pbxproj b/Alerts&Pickers.xcodeproj/project.pbxproj index a8ffa0a8..5af19b3f 100644 --- a/Alerts&Pickers.xcodeproj/project.pbxproj +++ b/Alerts&Pickers.xcodeproj/project.pbxproj @@ -7,7 +7,6 @@ objects = { /* Begin PBXBuildFile section */ - 365C130B224E93B70024D6A5 /* Alerts&Pickers.podspec in Resources */ = {isa = PBXBuildFile; fileRef = 365C130A224E93B70024D6A5 /* Alerts&Pickers.podspec */; }; FA005E922015D769001EA8C6 /* Contacts.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA005E912015D769001EA8C6 /* Contacts.swift */; }; FA005E942015E490001EA8C6 /* UISearchBar+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA005E932015E490001EA8C6 /* UISearchBar+Extensions.swift */; }; FA005E9620162BB5001EA8C6 /* Assets.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA005E9520162BB5001EA8C6 /* Assets.swift */; }; @@ -74,7 +73,6 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ - 365C130A224E93B70024D6A5 /* Alerts&Pickers.podspec */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "Alerts&Pickers.podspec"; sourceTree = SOURCE_ROOT; }; FA005E912015D769001EA8C6 /* Contacts.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Contacts.swift; sourceTree = ""; }; FA005E932015E490001EA8C6 /* UISearchBar+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UISearchBar+Extensions.swift"; sourceTree = ""; }; FA005E9520162BB5001EA8C6 /* Assets.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Assets.swift; sourceTree = ""; }; @@ -245,7 +243,6 @@ FA3BB28A2008B46500E06F8F /* Resources */, FA3BB2AA2008B46800E06F8F /* ViewController.swift */, FA3BB2AB2008B46800E06F8F /* AppDelegate.swift */, - 365C130A224E93B70024D6A5 /* Alerts&Pickers.podspec */, ); path = Example; sourceTree = ""; @@ -553,7 +550,6 @@ FA3BB2CF2008B9FA00E06F8F /* LICENSE in Resources */, FA3BB2BF2008B46900E06F8F /* Countries.bundle in Resources */, FA3BB2AD2008B46800E06F8F /* LaunchScreen.storyboard in Resources */, - 365C130B224E93B70024D6A5 /* Alerts&Pickers.podspec in Resources */, FA3BB2AC2008B46800E06F8F /* Assets.xcassets in Resources */, FA3BB2CD2008B98F00E06F8F /* Assets in Resources */, FA3BB2892008B45600E06F8F /* README.md in Resources */,