diff --git a/Example/stork-controller.xcodeproj/project.pbxproj b/Example/stork-controller.xcodeproj/project.pbxproj index b04f2df..22d2ec0 100644 --- a/Example/stork-controller.xcodeproj/project.pbxproj +++ b/Example/stork-controller.xcodeproj/project.pbxproj @@ -7,294 +7,145 @@ objects = { /* Begin PBXBuildFile section */ - F42A79E921B1AD6800B6200F /* SPInternetConnection.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A792D21B1AD6500B6200F /* SPInternetConnection.swift */; }; - F42A79EA21B1AD6800B6200F /* SPVibration.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A792F21B1AD6500B6200F /* SPVibration.swift */; }; - F42A79EB21B1AD6800B6200F /* SPPlayCircleButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A793221B1AD6600B6200F /* SPPlayCircleButton.swift */; }; - F42A79EC21B1AD6800B6200F /* SPSocialIconButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A793321B1AD6600B6200F /* SPSocialIconButton.swift */; }; - F42A79ED21B1AD6800B6200F /* SPMengButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A793421B1AD6600B6200F /* SPMengButton.swift */; }; - F42A79EE21B1AD6800B6200F /* SPSystemIconButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A793521B1AD6600B6200F /* SPSystemIconButton.swift */; }; - F42A79EF21B1AD6800B6200F /* SPDownloadingButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A793621B1AD6600B6200F /* SPDownloadingButton.swift */; }; - F42A79F021B1AD6800B6200F /* SPRoundButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A793721B1AD6600B6200F /* SPRoundButton.swift */; }; - F42A79F121B1AD6800B6200F /* SPNativeOS11Button.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A793821B1AD6600B6200F /* SPNativeOS11Button.swift */; }; - F42A79F221B1AD6800B6200F /* SPGradientButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A793921B1AD6600B6200F /* SPGradientButton.swift */; }; - F42A79F321B1AD6800B6200F /* SPAppStoreActionButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A793A21B1AD6600B6200F /* SPAppStoreActionButton.swift */; }; - F42A79F421B1AD6800B6200F /* SPProposeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A793C21B1AD6600B6200F /* SPProposeViewController.swift */; }; - F42A79F521B1AD6800B6200F /* SPProgressLoadingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A793D21B1AD6600B6200F /* SPProgressLoadingViewController.swift */; }; - F42A79F621B1AD6800B6200F /* SPScrollViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A793E21B1AD6600B6200F /* SPScrollViewController.swift */; }; - F42A79F721B1AD6800B6200F /* SPBaseTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A793F21B1AD6600B6200F /* SPBaseTableViewController.swift */; }; - F42A79F821B1AD6800B6200F /* SPBaseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A794021B1AD6600B6200F /* SPBaseViewController.swift */; }; - F42A79F921B1AD6800B6200F /* SPWelcomeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A794121B1AD6600B6200F /* SPWelcomeViewController.swift */; }; - F42A79FA21B1AD6800B6200F /* SPRootViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A794221B1AD6600B6200F /* SPRootViewController.swift */; }; - F42A79FB21B1AD6800B6200F /* SPConfirmActionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A794321B1AD6600B6200F /* SPConfirmActionViewController.swift */; }; - F42A79FC21B1AD6800B6200F /* SPNativeTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A794421B1AD6600B6200F /* SPNativeTableViewController.swift */; }; - F42A79FD21B1AD6800B6200F /* SPHiderViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A794521B1AD6600B6200F /* SPHiderViewController.swift */; }; - F42A79FE21B1AD6800B6200F /* SPStatusBarManagerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A794621B1AD6600B6200F /* SPStatusBarManagerViewController.swift */; }; - F42A79FF21B1AD6800B6200F /* SPNativeLoginCodeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A794821B1AD6600B6200F /* SPNativeLoginCodeViewController.swift */; }; - F42A7A0021B1AD6800B6200F /* SPNativeLoginNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A794921B1AD6600B6200F /* SPNativeLoginNavigationController.swift */; }; - F42A7A0121B1AD6800B6200F /* SPNativeLoginViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A794A21B1AD6600B6200F /* SPNativeLoginViewController.swift */; }; - F42A7A0221B1AD6800B6200F /* SPStorkTransitioningDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A794C21B1AD6600B6200F /* SPStorkTransitioningDelegate.swift */; }; - F42A7A0321B1AD6800B6200F /* SPStorkPresentingAnimationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A794D21B1AD6600B6200F /* SPStorkPresentingAnimationController.swift */; }; - F42A7A0421B1AD6800B6200F /* SPStorkPresentationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A794E21B1AD6600B6200F /* SPStorkPresentationController.swift */; }; - F42A7A0521B1AD6800B6200F /* SPStorkIndicatorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A794F21B1AD6600B6200F /* SPStorkIndicatorView.swift */; }; - F42A7A0621B1AD6800B6200F /* SPStorkDismissingAnimationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A795021B1AD6600B6200F /* SPStorkDismissingAnimationController.swift */; }; - F42A7A0721B1AD6800B6200F /* SPEmptyProposeLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A795321B1AD6600B6200F /* SPEmptyProposeLabel.swift */; }; - F42A7A0821B1AD6800B6200F /* SPTableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A795421B1AD6600B6200F /* SPTableView.swift */; }; - F42A7A0921B1AD6800B6200F /* SPEmptyProposeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A795521B1AD6600B6200F /* SPEmptyProposeView.swift */; }; - F42A7A0A21B1AD6800B6200F /* SPScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A795621B1AD6600B6200F /* SPScrollView.swift */; }; - F42A7A0B21B1AD6800B6200F /* SPFakeBarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A795721B1AD6600B6200F /* SPFakeBarView.swift */; }; - F42A7A0C21B1AD6800B6200F /* SPCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A795A21B1AD6600B6200F /* SPCollectionViewCell.swift */; }; - F42A7A0D21B1AD6800B6200F /* SPMengTransformCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A795B21B1AD6600B6200F /* SPMengTransformCollectionViewCell.swift */; }; - F42A7A0E21B1AD6800B6200F /* SPImageCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A795C21B1AD6600B6200F /* SPImageCollectionViewCell.swift */; }; - F42A7A0F21B1AD6800B6200F /* SPCollectionViewLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A795E21B1AD6600B6200F /* SPCollectionViewLayout.swift */; }; - F42A7A1021B1AD6800B6200F /* SPMengTransformCollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A796021B1AD6600B6200F /* SPMengTransformCollectionView.swift */; }; - F42A7A1121B1AD6800B6200F /* SPCollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A796121B1AD6600B6200F /* SPCollectionView.swift */; }; - F42A7A1221B1AD6800B6200F /* SPImagesLineCollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A796221B1AD6600B6200F /* SPImagesLineCollectionView.swift */; }; - F42A7A1321B1AD6800B6200F /* SPAligmentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A796321B1AD6600B6200F /* SPAligmentView.swift */; }; - F42A7A1421B1AD6800B6200F /* SPAudioIconView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A796521B1AD6600B6200F /* SPAudioIconView.swift */; }; - F42A7A1521B1AD6800B6200F /* SPSocialIconView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A796621B1AD6600B6200F /* SPSocialIconView.swift */; }; - F42A7A1621B1AD6800B6200F /* SPSystemIconView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A796721B1AD6600B6200F /* SPSystemIconView.swift */; }; - F42A7A1721B1AD6800B6200F /* SPGolubevIconView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A796821B1AD6600B6200F /* SPGolubevIconView.swift */; }; - F42A7A1821B1AD6800B6200F /* SPGradeBlurView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A796921B1AD6600B6200F /* SPGradeBlurView.swift */; }; - F42A7A1921B1AD6800B6200F /* SPDownloadingUIImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A796A21B1AD6600B6200F /* SPDownloadingUIImageView.swift */; }; - F42A7A1A21B1AD6800B6200F /* SPGradientView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A796B21B1AD6600B6200F /* SPGradientView.swift */; }; - F42A7A1B21B1AD6800B6200F /* SPVideoPlayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A796C21B1AD6600B6200F /* SPVideoPlayer.swift */; }; - F42A7A1C21B1AD6800B6200F /* SPPromoTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A796E21B1AD6600B6200F /* SPPromoTableViewCell.swift */; }; - F42A7A1D21B1AD6800B6200F /* SPFormButtonTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A797021B1AD6600B6200F /* SPFormButtonTableViewCell.swift */; }; - F42A7A1E21B1AD6800B6200F /* SPFormMailTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A797121B1AD6600B6200F /* SPFormMailTableViewCell.swift */; }; - F42A7A1F21B1AD6800B6200F /* SPFormLabelTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A797221B1AD6600B6200F /* SPFormLabelTableViewCell.swift */; }; - F42A7A2021B1AD6800B6200F /* SPFormTextFiledTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A797321B1AD6600B6200F /* SPFormTextFiledTableViewCell.swift */; }; - F42A7A2121B1AD6800B6200F /* SPFormFeaturedTitleTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A797421B1AD6600B6200F /* SPFormFeaturedTitleTableViewCell.swift */; }; - F42A7A2221B1AD6800B6200F /* SPFormTextInputTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A797521B1AD6600B6200F /* SPFormTextInputTableViewCell.swift */; }; - F42A7A2321B1AD6800B6200F /* SPFormTextTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A797621B1AD6600B6200F /* SPFormTextTableViewCell.swift */; }; - F42A7A2421B1AD6800B6200F /* SPMengTransformTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A797721B1AD6600B6200F /* SPMengTransformTableViewCell.swift */; }; - F42A7A2521B1AD6800B6200F /* SPImageTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A797821B1AD6600B6200F /* SPImageTableViewCell.swift */; }; - F42A7A2621B1AD6800B6200F /* SPProposeTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A797921B1AD6600B6200F /* SPProposeTableViewCell.swift */; }; - F42A7A2721B1AD6800B6200F /* SPBaseContentTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A797A21B1AD6600B6200F /* SPBaseContentTableViewCell.swift */; }; - F42A7A2821B1AD6800B6200F /* SPTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A797B21B1AD6600B6200F /* SPTableViewCell.swift */; }; - F42A7A2921B1AD6800B6200F /* SPCollectionImagesTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A797C21B1AD6600B6200F /* SPCollectionImagesTableViewCell.swift */; }; - F42A7A2A21B1AD6800B6200F /* SPBlurView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A797D21B1AD6600B6200F /* SPBlurView.swift */; }; - F42A7A2B21B1AD6800B6200F /* SPStyleKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A797F21B1AD6600B6200F /* SPStyleKit.swift */; }; - F42A7A2C21B1AD6800B6200F /* SPNativeStyleKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A798021B1AD6600B6200F /* SPNativeStyleKit.swift */; }; - F42A7A2D21B1AD6800B6200F /* SPTypes.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A798221B1AD6600B6200F /* SPTypes.swift */; }; - F42A7A2E21B1AD6800B6200F /* SPLocale.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A798421B1AD6600B6200F /* SPLocale.swift */; }; - F42A7A2F21B1AD6800B6200F /* SPUIScreenExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A798621B1AD6600B6200F /* SPUIScreenExtension.swift */; }; - F42A7A3021B1AD6800B6200F /* SPUIAlertControllerExtenshion.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A798721B1AD6600B6200F /* SPUIAlertControllerExtenshion.swift */; }; - F42A7A3121B1AD6800B6200F /* SPUITableViewCellExtenshion.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A798821B1AD6600B6200F /* SPUITableViewCellExtenshion.swift */; }; - F42A7A3221B1AD6800B6200F /* SPUITextFieldExtenshion.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A798921B1AD6600B6200F /* SPUITextFieldExtenshion.swift */; }; - F42A7A3321B1AD6800B6200F /* SPUIFontExtenshion.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A798A21B1AD6600B6200F /* SPUIFontExtenshion.swift */; }; - F42A7A3421B1AD6800B6200F /* SPUIImageExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A798B21B1AD6600B6200F /* SPUIImageExtension.swift */; }; - F42A7A3521B1AD6800B6200F /* SPDateExtenshon.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A798C21B1AD6600B6200F /* SPDateExtenshon.swift */; }; - F42A7A3621B1AD6800B6200F /* SPUITableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A798D21B1AD6600B6200F /* SPUITableView.swift */; }; - F42A7A3721B1AD6800B6200F /* SPUIViewExtenshion.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A798E21B1AD6600B6200F /* SPUIViewExtenshion.swift */; }; - F42A7A3821B1AD6800B6200F /* SPCGPointExtenshion.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A798F21B1AD6600B6200F /* SPCGPointExtenshion.swift */; }; - F42A7A3921B1AD6800B6200F /* SPArrayExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A799021B1AD6600B6200F /* SPArrayExtension.swift */; }; - F42A7A3A21B1AD6800B6200F /* SPUserDefaultsExtenshion.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A799121B1AD6600B6200F /* SPUserDefaultsExtenshion.swift */; }; - F42A7A3B21B1AD6800B6200F /* SPUIViewControllerExtenshion.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A799221B1AD6600B6200F /* SPUIViewControllerExtenshion.swift */; }; - F42A7A3C21B1AD6800B6200F /* SPStringExtenshion.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A799321B1AD6600B6200F /* SPStringExtenshion.swift */; }; - F42A7A3D21B1AD6800B6200F /* SPStrideableExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A799421B1AD6600B6200F /* SPStrideableExtension.swift */; }; - F42A7A3E21B1AD6800B6200F /* SPUIVisualEffectViewExtenshion.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A799521B1AD6600B6200F /* SPUIVisualEffectViewExtenshion.swift */; }; - F42A7A3F21B1AD6800B6200F /* SPBezierPathExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A799621B1AD6600B6200F /* SPBezierPathExtension.swift */; }; - F42A7A4021B1AD6800B6200F /* SPUICollectionViewExtenshion.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A799721B1AD6600B6200F /* SPUICollectionViewExtenshion.swift */; }; - F42A7A4121B1AD6800B6200F /* SPUITableViewControllerExtenshion.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A799821B1AD6600B6200F /* SPUITableViewControllerExtenshion.swift */; }; - F42A7A4221B1AD6800B6200F /* SPTextFieldExtenshion.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A799921B1AD6600B6200F /* SPTextFieldExtenshion.swift */; }; - F42A7A4321B1AD6800B6200F /* SPUITabBarControllerExtenshion.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A799A21B1AD6600B6200F /* SPUITabBarControllerExtenshion.swift */; }; - F42A7A4421B1AD6800B6200F /* SPUINavigationControllerExtenshion.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A799B21B1AD6600B6200F /* SPUINavigationControllerExtenshion.swift */; }; - F42A7A4521B1AD6800B6200F /* SPCGRectExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A799C21B1AD6600B6200F /* SPCGRectExtension.swift */; }; - F42A7A4621B1AD6800B6200F /* SPUIWindowExtenshion.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A799D21B1AD6600B6200F /* SPUIWindowExtenshion.swift */; }; - F42A7A4721B1AD6800B6200F /* SPUILabelExtenshion.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A799E21B1AD6600B6200F /* SPUILabelExtenshion.swift */; }; - F42A7A4821B1AD6800B6200F /* SPCGSizeExtenshion.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A799F21B1AD6600B6200F /* SPCGSizeExtenshion.swift */; }; - F42A7A4921B1AD6800B6200F /* SPUIImageViewExtenshion.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A79A021B1AD6600B6200F /* SPUIImageViewExtenshion.swift */; }; - F42A7A4A21B1AD6800B6200F /* SPUIColorExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A79A121B1AD6600B6200F /* SPUIColorExtension.swift */; }; - F42A7A4B21B1AD6800B6200F /* SPCollectionExtenshion.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A79A221B1AD6600B6200F /* SPCollectionExtenshion.swift */; }; - F42A7A4C21B1AD6800B6200F /* SPUIButtonExtenshion.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A79A321B1AD6600B6200F /* SPUIButtonExtenshion.swift */; }; - F42A7A4D21B1AD6800B6200F /* SPUIDeviceExtenshion.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A79A421B1AD6600B6200F /* SPUIDeviceExtenshion.swift */; }; - F42A7A4E21B1AD6800B6200F /* SPApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A79A621B1AD6600B6200F /* SPApp.swift */; }; - F42A7A4F21B1AD6800B6200F /* SPConstraintsAssistent.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A79A821B1AD6600B6200F /* SPConstraintsAssistent.swift */; }; - F42A7A5021B1AD6800B6200F /* SPLocalNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A79AA21B1AD6600B6200F /* SPLocalNotification.swift */; }; - F42A7A5121B1AD6800B6200F /* SPMail.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A79AC21B1AD6600B6200F /* SPMail.swift */; }; - F42A7A5221B1AD6800B6200F /* SPLaunch.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A79AE21B1AD6600B6200F /* SPLaunch.swift */; }; - F42A7A5321B1AD6800B6200F /* SPLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A79B021B1AD6600B6200F /* SPLayout.swift */; }; - F42A7A5421B1AD6800B6200F /* SPShadow.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A79B221B1AD6600B6200F /* SPShadow.swift */; }; - F42A7A5521B1AD6800B6200F /* SPShadowDeep.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A79B321B1AD6600B6200F /* SPShadowDeep.swift */; }; - F42A7A5621B1AD6800B6200F /* SPCodeAudioIconPack.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A79B521B1AD6600B6200F /* SPCodeAudioIconPack.swift */; }; - F42A7A5721B1AD6800B6200F /* SPCodeSocialIconPack.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A79B621B1AD6600B6200F /* SPCodeSocialIconPack.swift */; }; - F42A7A5821B1AD6800B6200F /* SPCodeSystemIconPack.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A79B721B1AD6800B6200F /* SPCodeSystemIconPack.swift */; }; - F42A7A5921B1AD6800B6200F /* SPCodeDraw.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A79B821B1AD6800B6200F /* SPCodeDraw.swift */; }; - F42A7A5A21B1AD6800B6200F /* SPGolubevGolubevIconPack.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A79B921B1AD6800B6200F /* SPGolubevGolubevIconPack.swift */; }; - F42A7A5B21B1AD6800B6200F /* SPAnimationUpward.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A79BB21B1AD6800B6200F /* SPAnimationUpward.swift */; }; - F42A7A5C21B1AD6800B6200F /* SPAnimationSpring.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A79BC21B1AD6800B6200F /* SPAnimationSpring.swift */; }; - F42A7A5D21B1AD6800B6200F /* SPAnimationAlpha.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A79BD21B1AD6800B6200F /* SPAnimationAlpha.swift */; }; - F42A7A5E21B1AD6800B6200F /* SPAnimation.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A79BE21B1AD6800B6200F /* SPAnimation.swift */; }; - F42A7A5F21B1AD6800B6200F /* SPDownloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A79C021B1AD6800B6200F /* SPDownloader.swift */; }; - F42A7A6021B1AD6800B6200F /* SPAppStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A79C221B1AD6800B6200F /* SPAppStore.swift */; }; - F42A7A6121B1AD6800B6200F /* SPOpener.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A79C421B1AD6800B6200F /* SPOpener.swift */; }; - F42A7A6221B1AD6800B6200F /* SPBufer.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A79C621B1AD6800B6200F /* SPBufer.swift */; }; - F42A7A6321B1AD6800B6200F /* SPTwitter.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A79C921B1AD6800B6200F /* SPTwitter.swift */; }; - F42A7A6421B1AD6800B6200F /* SPViber.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A79CB21B1AD6800B6200F /* SPViber.swift */; }; - F42A7A6521B1AD6800B6200F /* SPTelegram.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A79CD21B1AD6800B6200F /* SPTelegram.swift */; }; - F42A7A6621B1AD6800B6200F /* SPInstagram.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A79CF21B1AD6800B6200F /* SPInstagram.swift */; }; - F42A7A6721B1AD6800B6200F /* SPWhatsApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A79D121B1AD6800B6200F /* SPWhatsApp.swift */; }; - F42A7A6821B1AD6800B6200F /* SPAudio.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A79D321B1AD6800B6200F /* SPAudio.swift */; }; - F42A7A6921B1AD6800B6200F /* SPAudioPlayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A79D421B1AD6800B6200F /* SPAudioPlayer.swift */; }; - F42A7A6A21B1AD6800B6200F /* SPDevice.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A79D621B1AD6800B6200F /* SPDevice.swift */; }; - F42A7A6B21B1AD6800B6200F /* SPSpotlight.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A79D821B1AD6800B6200F /* SPSpotlight.swift */; }; - F42A7A6C21B1AD6800B6200F /* SPRandom.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A79DA21B1AD6800B6200F /* SPRandom.swift */; }; - F42A7A6D21B1AD6800B6200F /* SPDelay.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A79DC21B1AD6800B6200F /* SPDelay.swift */; }; - F42A7A6E21B1AD6800B6200F /* SPPermissionDialogView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A79DF21B1AD6800B6200F /* SPPermissionDialogView.swift */; }; - F42A7A6F21B1AD6800B6200F /* SPPermissionDialog.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A79E021B1AD6800B6200F /* SPPermissionDialog.swift */; }; - F42A7A7021B1AD6800B6200F /* SPPermissionDialogController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A79E121B1AD6800B6200F /* SPPermissionDialogController.swift */; }; - F42A7A7121B1AD6800B6200F /* SPPermission.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A79E221B1AD6800B6200F /* SPPermission.swift */; }; - F42A7A7221B1AD6800B6200F /* SPRequestPermissionLocationHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A79E421B1AD6800B6200F /* SPRequestPermissionLocationHandler.swift */; }; - F42A7A7321B1AD6800B6200F /* SPShare.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A79E621B1AD6800B6200F /* SPShare.swift */; }; - F42A7A7421B1AD6800B6200F /* SPBadge.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42A79E821B1AD6800B6200F /* SPBadge.swift */; }; F445CA8721AED92600184254 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = F445CA8621AED92600184254 /* AppDelegate.swift */; }; F445CA8921AED92600184254 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F445CA8821AED92600184254 /* ViewController.swift */; }; F445CA8C21AED92600184254 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F445CA8A21AED92600184254 /* Main.storyboard */; }; F445CA8E21AED92700184254 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = F445CA8D21AED92700184254 /* Assets.xcassets */; }; F445CA9121AED92700184254 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F445CA8F21AED92700184254 /* LaunchScreen.storyboard */; }; + F47D9B4721B947A20033AAA4 /* SPStorkTransitioningDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B4121B947A20033AAA4 /* SPStorkTransitioningDelegate.swift */; }; + F47D9B4821B947A20033AAA4 /* SPStorkPresentingAnimationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B4221B947A20033AAA4 /* SPStorkPresentingAnimationController.swift */; }; + F47D9B4921B947A20033AAA4 /* SPStorkPresentationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B4321B947A20033AAA4 /* SPStorkPresentationController.swift */; }; + F47D9B4A21B947A20033AAA4 /* SPStorkController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B4421B947A20033AAA4 /* SPStorkController.swift */; }; + F47D9B4B21B947A20033AAA4 /* SPStorkIndicatorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B4521B947A20033AAA4 /* SPStorkIndicatorView.swift */; }; + F47D9B4C21B947A20033AAA4 /* SPStorkDismissingAnimationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B4621B947A20033AAA4 /* SPStorkDismissingAnimationController.swift */; }; + F47D9BFB21B947C30033AAA4 /* SPVibration.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B5021B947C20033AAA4 /* SPVibration.swift */; }; + F47D9BFC21B947C30033AAA4 /* SPPlayCircleButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B5321B947C20033AAA4 /* SPPlayCircleButton.swift */; }; + F47D9BFD21B947C30033AAA4 /* SPSocialButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B5421B947C20033AAA4 /* SPSocialButton.swift */; }; + F47D9BFE21B947C30033AAA4 /* SPDotsButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B5521B947C20033AAA4 /* SPDotsButton.swift */; }; + F47D9BFF21B947C30033AAA4 /* SPSystemIconButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B5621B947C20033AAA4 /* SPSystemIconButton.swift */; }; + F47D9C0021B947C30033AAA4 /* SPNativeLargeButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B5721B947C20033AAA4 /* SPNativeLargeButton.swift */; }; + F47D9C0121B947C30033AAA4 /* SPDownloadingButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B5821B947C20033AAA4 /* SPDownloadingButton.swift */; }; + F47D9C0221B947C30033AAA4 /* SPButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B5921B947C20033AAA4 /* SPButton.swift */; }; + F47D9C0321B947C30033AAA4 /* SPAppStoreActionButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B5A21B947C20033AAA4 /* SPAppStoreActionButton.swift */; }; + F47D9C0421B947C30033AAA4 /* SPAppleMusicButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B5B21B947C20033AAA4 /* SPAppleMusicButton.swift */; }; + F47D9C0521B947C30033AAA4 /* SPProposeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B5D21B947C20033AAA4 /* SPProposeViewController.swift */; }; + F47D9C0621B947C30033AAA4 /* SPBaseTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B5E21B947C20033AAA4 /* SPBaseTableViewController.swift */; }; + F47D9C0721B947C30033AAA4 /* SPBaseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B5F21B947C20033AAA4 /* SPBaseViewController.swift */; }; + F47D9C0821B947C30033AAA4 /* SPWelcomeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B6021B947C20033AAA4 /* SPWelcomeViewController.swift */; }; + F47D9C0921B947C30033AAA4 /* SPConfirmActionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B6121B947C20033AAA4 /* SPConfirmActionViewController.swift */; }; + F47D9C0A21B947C30033AAA4 /* SPNativeTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B6221B947C20033AAA4 /* SPNativeTableViewController.swift */; }; + F47D9C0B21B947C30033AAA4 /* SPStatusBarManagerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B6321B947C20033AAA4 /* SPStatusBarManagerViewController.swift */; }; + F47D9C0C21B947C30033AAA4 /* SPNativeLoginCodeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B6521B947C20033AAA4 /* SPNativeLoginCodeViewController.swift */; }; + F47D9C0D21B947C30033AAA4 /* SPNativeLoginNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B6621B947C20033AAA4 /* SPNativeLoginNavigationController.swift */; }; + F47D9C0E21B947C30033AAA4 /* SPNativeLoginViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B6721B947C20033AAA4 /* SPNativeLoginViewController.swift */; }; + F47D9C0F21B947C30033AAA4 /* SPImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B6921B947C20033AAA4 /* SPImageView.swift */; }; + F47D9C1021B947C30033AAA4 /* SPScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B6A21B947C20033AAA4 /* SPScrollView.swift */; }; + F47D9C1121B947C30033AAA4 /* SPCollectionViewLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B6D21B947C20033AAA4 /* SPCollectionViewLayout.swift */; }; + F47D9C1221B947C30033AAA4 /* SPCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B6F21B947C20033AAA4 /* SPCollectionViewCell.swift */; }; + F47D9C1321B947C30033AAA4 /* SPMengTransformCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B7021B947C20033AAA4 /* SPMengTransformCollectionViewCell.swift */; }; + F47D9C1421B947C30033AAA4 /* SPCollectionContainerCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B7121B947C20033AAA4 /* SPCollectionContainerCell.swift */; }; + F47D9C1521B947C30033AAA4 /* SPImageCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B7221B947C20033AAA4 /* SPImageCollectionViewCell.swift */; }; + F47D9C1621B947C30033AAA4 /* SPMengTransformCollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B7421B947C20033AAA4 /* SPMengTransformCollectionView.swift */; }; + F47D9C1721B947C30033AAA4 /* SPCollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B7521B947C20033AAA4 /* SPCollectionView.swift */; }; + F47D9C1821B947C30033AAA4 /* SPImagesLineCollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B7621B947C20033AAA4 /* SPImagesLineCollectionView.swift */; }; + F47D9C1921B947C30033AAA4 /* SPFakeBarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B7721B947C20033AAA4 /* SPFakeBarView.swift */; }; + F47D9C1A21B947C30033AAA4 /* SPAudioIconView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B7921B947C20033AAA4 /* SPAudioIconView.swift */; }; + F47D9C1B21B947C30033AAA4 /* SPSocialIconView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B7A21B947C20033AAA4 /* SPSocialIconView.swift */; }; + F47D9C1C21B947C30033AAA4 /* SPSystemIconView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B7B21B947C20033AAA4 /* SPSystemIconView.swift */; }; + F47D9C1D21B947C30033AAA4 /* SPGolubevIconView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B7C21B947C20033AAA4 /* SPGolubevIconView.swift */; }; + F47D9C1E21B947C30033AAA4 /* SPTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B7D21B947C20033AAA4 /* SPTextField.swift */; }; + F47D9C1F21B947C30033AAA4 /* SPGradeBlurView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B7E21B947C20033AAA4 /* SPGradeBlurView.swift */; }; + F47D9C2021B947C30033AAA4 /* SPDownloadingUIImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B7F21B947C20033AAA4 /* SPDownloadingUIImageView.swift */; }; + F47D9C2121B947C30033AAA4 /* SPView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B8021B947C20033AAA4 /* SPView.swift */; }; + F47D9C2221B947C30033AAA4 /* SPGradientView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B8121B947C20033AAA4 /* SPGradientView.swift */; }; + F47D9C2321B947C30033AAA4 /* SPEmptyProposeLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B8321B947C20033AAA4 /* SPEmptyProposeLabel.swift */; }; + F47D9C2421B947C30033AAA4 /* SPTableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B8421B947C20033AAA4 /* SPTableView.swift */; }; + F47D9C2521B947C30033AAA4 /* SPEmptyProposeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B8521B947C20033AAA4 /* SPEmptyProposeView.swift */; }; + F47D9C2621B947C30033AAA4 /* SPPromoTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B8721B947C20033AAA4 /* SPPromoTableViewCell.swift */; }; + F47D9C2721B947C30033AAA4 /* SPFormButtonTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B8921B947C20033AAA4 /* SPFormButtonTableViewCell.swift */; }; + F47D9C2821B947C30033AAA4 /* SPFormMailTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B8A21B947C20033AAA4 /* SPFormMailTableViewCell.swift */; }; + F47D9C2921B947C30033AAA4 /* SPFormLabelTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B8B21B947C20033AAA4 /* SPFormLabelTableViewCell.swift */; }; + F47D9C2A21B947C30033AAA4 /* SPFormTextFiledTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B8C21B947C20033AAA4 /* SPFormTextFiledTableViewCell.swift */; }; + F47D9C2B21B947C30033AAA4 /* SPFormFeaturedTitleTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B8D21B947C20033AAA4 /* SPFormFeaturedTitleTableViewCell.swift */; }; + F47D9C2C21B947C30033AAA4 /* SPFormTextInputTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B8E21B947C20033AAA4 /* SPFormTextInputTableViewCell.swift */; }; + F47D9C2D21B947C30033AAA4 /* SPFormTextTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B8F21B947C20033AAA4 /* SPFormTextTableViewCell.swift */; }; + F47D9C2E21B947C30033AAA4 /* SPMengTransformTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B9021B947C20033AAA4 /* SPMengTransformTableViewCell.swift */; }; + F47D9C2F21B947C30033AAA4 /* SPImageTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B9121B947C20033AAA4 /* SPImageTableViewCell.swift */; }; + F47D9C3021B947C30033AAA4 /* SPProposeTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B9221B947C20033AAA4 /* SPProposeTableViewCell.swift */; }; + F47D9C3121B947C30033AAA4 /* SPBaseContentTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B9321B947C20033AAA4 /* SPBaseContentTableViewCell.swift */; }; + F47D9C3221B947C30033AAA4 /* SPTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B9421B947C20033AAA4 /* SPTableViewCell.swift */; }; + F47D9C3321B947C30033AAA4 /* SPCollectionImagesTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B9521B947C20033AAA4 /* SPCollectionImagesTableViewCell.swift */; }; + F47D9C3421B947C30033AAA4 /* SPVideoPlayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B9621B947C20033AAA4 /* SPVideoPlayer.swift */; }; + F47D9C3521B947C30033AAA4 /* SPLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B9721B947C20033AAA4 /* SPLabel.swift */; }; + F47D9C3621B947C30033AAA4 /* SPBlurView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B9821B947C20033AAA4 /* SPBlurView.swift */; }; + F47D9C3721B947C30033AAA4 /* SPNativeStyleKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B9A21B947C20033AAA4 /* SPNativeStyleKit.swift */; }; + F47D9C3821B947C30033AAA4 /* SPTypes.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B9C21B947C20033AAA4 /* SPTypes.swift */; }; + F47D9C3921B947C30033AAA4 /* SPLocale.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9B9E21B947C20033AAA4 /* SPLocale.swift */; }; + F47D9C3A21B947C30033AAA4 /* SPUIAlertControllerExtenshion.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9BA021B947C20033AAA4 /* SPUIAlertControllerExtenshion.swift */; }; + F47D9C3B21B947C30033AAA4 /* SPUITableViewCellExtenshion.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9BA121B947C20033AAA4 /* SPUITableViewCellExtenshion.swift */; }; + F47D9C3C21B947C30033AAA4 /* SPUITextFieldExtenshion.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9BA221B947C20033AAA4 /* SPUITextFieldExtenshion.swift */; }; + F47D9C3D21B947C30033AAA4 /* SPUIFontExtenshion.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9BA321B947C20033AAA4 /* SPUIFontExtenshion.swift */; }; + F47D9C3E21B947C30033AAA4 /* SPUIImageExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9BA421B947C20033AAA4 /* SPUIImageExtension.swift */; }; + F47D9C3F21B947C30033AAA4 /* SPUITableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9BA521B947C20033AAA4 /* SPUITableView.swift */; }; + F47D9C4021B947C30033AAA4 /* SPUIViewExtenshion.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9BA621B947C20033AAA4 /* SPUIViewExtenshion.swift */; }; + F47D9C4121B947C30033AAA4 /* SPArrayExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9BA721B947C20033AAA4 /* SPArrayExtension.swift */; }; + F47D9C4221B947C30033AAA4 /* SPUserDefaultsExtenshion.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9BA821B947C20033AAA4 /* SPUserDefaultsExtenshion.swift */; }; + F47D9C4321B947C30033AAA4 /* SPUIViewControllerExtenshion.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9BA921B947C20033AAA4 /* SPUIViewControllerExtenshion.swift */; }; + F47D9C4421B947C30033AAA4 /* SPStringExtenshion.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9BAA21B947C20033AAA4 /* SPStringExtenshion.swift */; }; + F47D9C4521B947C30033AAA4 /* SPStrideableExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9BAB21B947C20033AAA4 /* SPStrideableExtension.swift */; }; + F47D9C4621B947C30033AAA4 /* SPUIVisualEffectViewExtenshion.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9BAC21B947C20033AAA4 /* SPUIVisualEffectViewExtenshion.swift */; }; + F47D9C4721B947C30033AAA4 /* SPUICollectionViewExtenshion.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9BAD21B947C20033AAA4 /* SPUICollectionViewExtenshion.swift */; }; + F47D9C4821B947C30033AAA4 /* SPTextFieldExtenshion.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9BAE21B947C20033AAA4 /* SPTextFieldExtenshion.swift */; }; + F47D9C4921B947C30033AAA4 /* SPUITabBarControllerExtenshion.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9BAF21B947C20033AAA4 /* SPUITabBarControllerExtenshion.swift */; }; + F47D9C4A21B947C30033AAA4 /* SPUINavigationControllerExtenshion.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9BB021B947C20033AAA4 /* SPUINavigationControllerExtenshion.swift */; }; + F47D9C4B21B947C30033AAA4 /* SPCGRectExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9BB121B947C20033AAA4 /* SPCGRectExtension.swift */; }; + F47D9C4C21B947C30033AAA4 /* SPUILabelExtenshion.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9BB221B947C20033AAA4 /* SPUILabelExtenshion.swift */; }; + F47D9C4D21B947C30033AAA4 /* SPCGSizeExtenshion.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9BB321B947C20033AAA4 /* SPCGSizeExtenshion.swift */; }; + F47D9C4E21B947C30033AAA4 /* SPUIImageViewExtenshion.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9BB421B947C20033AAA4 /* SPUIImageViewExtenshion.swift */; }; + F47D9C4F21B947C30033AAA4 /* SPUIColorExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9BB521B947C20033AAA4 /* SPUIColorExtension.swift */; }; + F47D9C5021B947C30033AAA4 /* SPUIButtonExtenshion.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9BB621B947C20033AAA4 /* SPUIButtonExtenshion.swift */; }; + F47D9C5121B947C30033AAA4 /* SPApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9BB821B947C20033AAA4 /* SPApp.swift */; }; + F47D9C5221B947C30033AAA4 /* SPConstraints.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9BBA21B947C20033AAA4 /* SPConstraints.swift */; }; + F47D9C5321B947C30033AAA4 /* SPLocalNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9BBC21B947C20033AAA4 /* SPLocalNotification.swift */; }; + F47D9C5421B947C30033AAA4 /* SPMail.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9BBE21B947C20033AAA4 /* SPMail.swift */; }; + F47D9C5521B947C30033AAA4 /* SPLaunch.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9BC021B947C20033AAA4 /* SPLaunch.swift */; }; + F47D9C5621B947C30033AAA4 /* SPLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9BC221B947C20033AAA4 /* SPLayout.swift */; }; + F47D9C5721B947C30033AAA4 /* SPShadow.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9BC421B947C20033AAA4 /* SPShadow.swift */; }; + F47D9C5821B947C30033AAA4 /* SPShadowDeep.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9BC521B947C20033AAA4 /* SPShadowDeep.swift */; }; + F47D9C5921B947C30033AAA4 /* SPCodeAudioIconPack.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9BC721B947C20033AAA4 /* SPCodeAudioIconPack.swift */; }; + F47D9C5A21B947C30033AAA4 /* SPCodeSocialIconPack.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9BC821B947C20033AAA4 /* SPCodeSocialIconPack.swift */; }; + F47D9C5B21B947C30033AAA4 /* SPCodeSystemIconPack.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9BC921B947C20033AAA4 /* SPCodeSystemIconPack.swift */; }; + F47D9C5C21B947C30033AAA4 /* SPCodeDraw.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9BCA21B947C20033AAA4 /* SPCodeDraw.swift */; }; + F47D9C5D21B947C30033AAA4 /* SPGolubevGolubevIconPack.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9BCB21B947C20033AAA4 /* SPGolubevGolubevIconPack.swift */; }; + F47D9C5E21B947C30033AAA4 /* SPAnimationUpward.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9BCD21B947C20033AAA4 /* SPAnimationUpward.swift */; }; + F47D9C5F21B947C30033AAA4 /* SPAnimationSpring.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9BCE21B947C20033AAA4 /* SPAnimationSpring.swift */; }; + F47D9C6021B947C30033AAA4 /* SPAnimationAlpha.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9BCF21B947C20033AAA4 /* SPAnimationAlpha.swift */; }; + F47D9C6121B947C30033AAA4 /* SPAnimation.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9BD021B947C20033AAA4 /* SPAnimation.swift */; }; + F47D9C6221B947C30033AAA4 /* SPDownloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9BD221B947C20033AAA4 /* SPDownloader.swift */; }; + F47D9C6321B947C30033AAA4 /* SPAppStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9BD421B947C20033AAA4 /* SPAppStore.swift */; }; + F47D9C6421B947C30033AAA4 /* SPOpener.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9BD621B947C20033AAA4 /* SPOpener.swift */; }; + F47D9C6521B947C30033AAA4 /* SPBufer.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9BD821B947C20033AAA4 /* SPBufer.swift */; }; + F47D9C6621B947C30033AAA4 /* SPTwitter.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9BDB21B947C20033AAA4 /* SPTwitter.swift */; }; + F47D9C6721B947C30033AAA4 /* SPViber.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9BDD21B947C20033AAA4 /* SPViber.swift */; }; + F47D9C6821B947C30033AAA4 /* SPTelegram.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9BDF21B947C20033AAA4 /* SPTelegram.swift */; }; + F47D9C6921B947C30033AAA4 /* SPInstagram.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9BE121B947C20033AAA4 /* SPInstagram.swift */; }; + F47D9C6A21B947C30033AAA4 /* SPWhatsApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9BE321B947C20033AAA4 /* SPWhatsApp.swift */; }; + F47D9C6B21B947C30033AAA4 /* SPAudio.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9BE521B947C20033AAA4 /* SPAudio.swift */; }; + F47D9C6C21B947C30033AAA4 /* SPAudioPlayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9BE621B947C20033AAA4 /* SPAudioPlayer.swift */; }; + F47D9C6D21B947C30033AAA4 /* SPDevice.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9BE821B947C20033AAA4 /* SPDevice.swift */; }; + F47D9C6E21B947C30033AAA4 /* SPSpotlight.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9BEA21B947C20033AAA4 /* SPSpotlight.swift */; }; + F47D9C6F21B947C30033AAA4 /* SPRandom.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9BEC21B947C20033AAA4 /* SPRandom.swift */; }; + F47D9C7021B947C30033AAA4 /* SPDelay.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9BEE21B947C20033AAA4 /* SPDelay.swift */; }; + F47D9C7121B947C30033AAA4 /* SPPermissionDialogView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9BF121B947C20033AAA4 /* SPPermissionDialogView.swift */; }; + F47D9C7221B947C30033AAA4 /* SPPermissionDialog.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9BF221B947C20033AAA4 /* SPPermissionDialog.swift */; }; + F47D9C7321B947C30033AAA4 /* SPPermissionDialogController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9BF321B947C20033AAA4 /* SPPermissionDialogController.swift */; }; + F47D9C7421B947C30033AAA4 /* SPPermission.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9BF421B947C20033AAA4 /* SPPermission.swift */; }; + F47D9C7521B947C30033AAA4 /* SPRequestPermissionLocationHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9BF621B947C20033AAA4 /* SPRequestPermissionLocationHandler.swift */; }; + F47D9C7621B947C30033AAA4 /* SPShare.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9BF821B947C20033AAA4 /* SPShare.swift */; }; + F47D9C7721B947C30033AAA4 /* SPBadge.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D9BFA21B947C20033AAA4 /* SPBadge.swift */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ - F42A792D21B1AD6500B6200F /* SPInternetConnection.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPInternetConnection.swift; sourceTree = ""; }; - F42A792F21B1AD6500B6200F /* SPVibration.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPVibration.swift; sourceTree = ""; }; - F42A793221B1AD6600B6200F /* SPPlayCircleButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPPlayCircleButton.swift; sourceTree = ""; }; - F42A793321B1AD6600B6200F /* SPSocialIconButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPSocialIconButton.swift; sourceTree = ""; }; - F42A793421B1AD6600B6200F /* SPMengButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPMengButton.swift; sourceTree = ""; }; - F42A793521B1AD6600B6200F /* SPSystemIconButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPSystemIconButton.swift; sourceTree = ""; }; - F42A793621B1AD6600B6200F /* SPDownloadingButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPDownloadingButton.swift; sourceTree = ""; }; - F42A793721B1AD6600B6200F /* SPRoundButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPRoundButton.swift; sourceTree = ""; }; - F42A793821B1AD6600B6200F /* SPNativeOS11Button.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPNativeOS11Button.swift; sourceTree = ""; }; - F42A793921B1AD6600B6200F /* SPGradientButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPGradientButton.swift; sourceTree = ""; }; - F42A793A21B1AD6600B6200F /* SPAppStoreActionButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPAppStoreActionButton.swift; sourceTree = ""; }; - F42A793C21B1AD6600B6200F /* SPProposeViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPProposeViewController.swift; sourceTree = ""; }; - F42A793D21B1AD6600B6200F /* SPProgressLoadingViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPProgressLoadingViewController.swift; sourceTree = ""; }; - F42A793E21B1AD6600B6200F /* SPScrollViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPScrollViewController.swift; sourceTree = ""; }; - F42A793F21B1AD6600B6200F /* SPBaseTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPBaseTableViewController.swift; sourceTree = ""; }; - F42A794021B1AD6600B6200F /* SPBaseViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPBaseViewController.swift; sourceTree = ""; }; - F42A794121B1AD6600B6200F /* SPWelcomeViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPWelcomeViewController.swift; sourceTree = ""; }; - F42A794221B1AD6600B6200F /* SPRootViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPRootViewController.swift; sourceTree = ""; }; - F42A794321B1AD6600B6200F /* SPConfirmActionViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPConfirmActionViewController.swift; sourceTree = ""; }; - F42A794421B1AD6600B6200F /* SPNativeTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPNativeTableViewController.swift; sourceTree = ""; }; - F42A794521B1AD6600B6200F /* SPHiderViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPHiderViewController.swift; sourceTree = ""; }; - F42A794621B1AD6600B6200F /* SPStatusBarManagerViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPStatusBarManagerViewController.swift; sourceTree = ""; }; - F42A794821B1AD6600B6200F /* SPNativeLoginCodeViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPNativeLoginCodeViewController.swift; sourceTree = ""; }; - F42A794921B1AD6600B6200F /* SPNativeLoginNavigationController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPNativeLoginNavigationController.swift; sourceTree = ""; }; - F42A794A21B1AD6600B6200F /* SPNativeLoginViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPNativeLoginViewController.swift; sourceTree = ""; }; - F42A794C21B1AD6600B6200F /* SPStorkTransitioningDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPStorkTransitioningDelegate.swift; sourceTree = ""; }; - F42A794D21B1AD6600B6200F /* SPStorkPresentingAnimationController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPStorkPresentingAnimationController.swift; sourceTree = ""; }; - F42A794E21B1AD6600B6200F /* SPStorkPresentationController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPStorkPresentationController.swift; sourceTree = ""; }; - F42A794F21B1AD6600B6200F /* SPStorkIndicatorView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPStorkIndicatorView.swift; sourceTree = ""; }; - F42A795021B1AD6600B6200F /* SPStorkDismissingAnimationController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPStorkDismissingAnimationController.swift; sourceTree = ""; }; - F42A795321B1AD6600B6200F /* SPEmptyProposeLabel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPEmptyProposeLabel.swift; sourceTree = ""; }; - F42A795421B1AD6600B6200F /* SPTableView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPTableView.swift; sourceTree = ""; }; - F42A795521B1AD6600B6200F /* SPEmptyProposeView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPEmptyProposeView.swift; sourceTree = ""; }; - F42A795621B1AD6600B6200F /* SPScrollView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPScrollView.swift; sourceTree = ""; }; - F42A795721B1AD6600B6200F /* SPFakeBarView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPFakeBarView.swift; sourceTree = ""; }; - F42A795A21B1AD6600B6200F /* SPCollectionViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPCollectionViewCell.swift; sourceTree = ""; }; - F42A795B21B1AD6600B6200F /* SPMengTransformCollectionViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPMengTransformCollectionViewCell.swift; sourceTree = ""; }; - F42A795C21B1AD6600B6200F /* SPImageCollectionViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPImageCollectionViewCell.swift; sourceTree = ""; }; - F42A795E21B1AD6600B6200F /* SPCollectionViewLayout.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPCollectionViewLayout.swift; sourceTree = ""; }; - F42A796021B1AD6600B6200F /* SPMengTransformCollectionView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPMengTransformCollectionView.swift; sourceTree = ""; }; - F42A796121B1AD6600B6200F /* SPCollectionView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPCollectionView.swift; sourceTree = ""; }; - F42A796221B1AD6600B6200F /* SPImagesLineCollectionView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPImagesLineCollectionView.swift; sourceTree = ""; }; - F42A796321B1AD6600B6200F /* SPAligmentView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPAligmentView.swift; sourceTree = ""; }; - F42A796521B1AD6600B6200F /* SPAudioIconView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPAudioIconView.swift; sourceTree = ""; }; - F42A796621B1AD6600B6200F /* SPSocialIconView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPSocialIconView.swift; sourceTree = ""; }; - F42A796721B1AD6600B6200F /* SPSystemIconView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPSystemIconView.swift; sourceTree = ""; }; - F42A796821B1AD6600B6200F /* SPGolubevIconView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPGolubevIconView.swift; sourceTree = ""; }; - F42A796921B1AD6600B6200F /* SPGradeBlurView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPGradeBlurView.swift; sourceTree = ""; }; - F42A796A21B1AD6600B6200F /* SPDownloadingUIImageView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPDownloadingUIImageView.swift; sourceTree = ""; }; - F42A796B21B1AD6600B6200F /* SPGradientView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPGradientView.swift; sourceTree = ""; }; - F42A796C21B1AD6600B6200F /* SPVideoPlayer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPVideoPlayer.swift; sourceTree = ""; }; - F42A796E21B1AD6600B6200F /* SPPromoTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPPromoTableViewCell.swift; sourceTree = ""; }; - F42A797021B1AD6600B6200F /* SPFormButtonTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPFormButtonTableViewCell.swift; sourceTree = ""; }; - F42A797121B1AD6600B6200F /* SPFormMailTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPFormMailTableViewCell.swift; sourceTree = ""; }; - F42A797221B1AD6600B6200F /* SPFormLabelTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPFormLabelTableViewCell.swift; sourceTree = ""; }; - F42A797321B1AD6600B6200F /* SPFormTextFiledTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPFormTextFiledTableViewCell.swift; sourceTree = ""; }; - F42A797421B1AD6600B6200F /* SPFormFeaturedTitleTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPFormFeaturedTitleTableViewCell.swift; sourceTree = ""; }; - F42A797521B1AD6600B6200F /* SPFormTextInputTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPFormTextInputTableViewCell.swift; sourceTree = ""; }; - F42A797621B1AD6600B6200F /* SPFormTextTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPFormTextTableViewCell.swift; sourceTree = ""; }; - F42A797721B1AD6600B6200F /* SPMengTransformTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPMengTransformTableViewCell.swift; sourceTree = ""; }; - F42A797821B1AD6600B6200F /* SPImageTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPImageTableViewCell.swift; sourceTree = ""; }; - F42A797921B1AD6600B6200F /* SPProposeTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPProposeTableViewCell.swift; sourceTree = ""; }; - F42A797A21B1AD6600B6200F /* SPBaseContentTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPBaseContentTableViewCell.swift; sourceTree = ""; }; - F42A797B21B1AD6600B6200F /* SPTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPTableViewCell.swift; sourceTree = ""; }; - F42A797C21B1AD6600B6200F /* SPCollectionImagesTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPCollectionImagesTableViewCell.swift; sourceTree = ""; }; - F42A797D21B1AD6600B6200F /* SPBlurView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPBlurView.swift; sourceTree = ""; }; - F42A797F21B1AD6600B6200F /* SPStyleKit.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPStyleKit.swift; sourceTree = ""; }; - F42A798021B1AD6600B6200F /* SPNativeStyleKit.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPNativeStyleKit.swift; sourceTree = ""; }; - F42A798221B1AD6600B6200F /* SPTypes.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPTypes.swift; sourceTree = ""; }; - F42A798421B1AD6600B6200F /* SPLocale.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPLocale.swift; sourceTree = ""; }; - F42A798621B1AD6600B6200F /* SPUIScreenExtension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPUIScreenExtension.swift; sourceTree = ""; }; - F42A798721B1AD6600B6200F /* SPUIAlertControllerExtenshion.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPUIAlertControllerExtenshion.swift; sourceTree = ""; }; - F42A798821B1AD6600B6200F /* SPUITableViewCellExtenshion.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPUITableViewCellExtenshion.swift; sourceTree = ""; }; - F42A798921B1AD6600B6200F /* SPUITextFieldExtenshion.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPUITextFieldExtenshion.swift; sourceTree = ""; }; - F42A798A21B1AD6600B6200F /* SPUIFontExtenshion.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPUIFontExtenshion.swift; sourceTree = ""; }; - F42A798B21B1AD6600B6200F /* SPUIImageExtension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPUIImageExtension.swift; sourceTree = ""; }; - F42A798C21B1AD6600B6200F /* SPDateExtenshon.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPDateExtenshon.swift; sourceTree = ""; }; - F42A798D21B1AD6600B6200F /* SPUITableView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPUITableView.swift; sourceTree = ""; }; - F42A798E21B1AD6600B6200F /* SPUIViewExtenshion.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPUIViewExtenshion.swift; sourceTree = ""; }; - F42A798F21B1AD6600B6200F /* SPCGPointExtenshion.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPCGPointExtenshion.swift; sourceTree = ""; }; - F42A799021B1AD6600B6200F /* SPArrayExtension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPArrayExtension.swift; sourceTree = ""; }; - F42A799121B1AD6600B6200F /* SPUserDefaultsExtenshion.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPUserDefaultsExtenshion.swift; sourceTree = ""; }; - F42A799221B1AD6600B6200F /* SPUIViewControllerExtenshion.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPUIViewControllerExtenshion.swift; sourceTree = ""; }; - F42A799321B1AD6600B6200F /* SPStringExtenshion.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPStringExtenshion.swift; sourceTree = ""; }; - F42A799421B1AD6600B6200F /* SPStrideableExtension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPStrideableExtension.swift; sourceTree = ""; }; - F42A799521B1AD6600B6200F /* SPUIVisualEffectViewExtenshion.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPUIVisualEffectViewExtenshion.swift; sourceTree = ""; }; - F42A799621B1AD6600B6200F /* SPBezierPathExtension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPBezierPathExtension.swift; sourceTree = ""; }; - F42A799721B1AD6600B6200F /* SPUICollectionViewExtenshion.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPUICollectionViewExtenshion.swift; sourceTree = ""; }; - F42A799821B1AD6600B6200F /* SPUITableViewControllerExtenshion.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPUITableViewControllerExtenshion.swift; sourceTree = ""; }; - F42A799921B1AD6600B6200F /* SPTextFieldExtenshion.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPTextFieldExtenshion.swift; sourceTree = ""; }; - F42A799A21B1AD6600B6200F /* SPUITabBarControllerExtenshion.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPUITabBarControllerExtenshion.swift; sourceTree = ""; }; - F42A799B21B1AD6600B6200F /* SPUINavigationControllerExtenshion.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPUINavigationControllerExtenshion.swift; sourceTree = ""; }; - F42A799C21B1AD6600B6200F /* SPCGRectExtension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPCGRectExtension.swift; sourceTree = ""; }; - F42A799D21B1AD6600B6200F /* SPUIWindowExtenshion.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPUIWindowExtenshion.swift; sourceTree = ""; }; - F42A799E21B1AD6600B6200F /* SPUILabelExtenshion.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPUILabelExtenshion.swift; sourceTree = ""; }; - F42A799F21B1AD6600B6200F /* SPCGSizeExtenshion.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPCGSizeExtenshion.swift; sourceTree = ""; }; - F42A79A021B1AD6600B6200F /* SPUIImageViewExtenshion.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPUIImageViewExtenshion.swift; sourceTree = ""; }; - F42A79A121B1AD6600B6200F /* SPUIColorExtension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPUIColorExtension.swift; sourceTree = ""; }; - F42A79A221B1AD6600B6200F /* SPCollectionExtenshion.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPCollectionExtenshion.swift; sourceTree = ""; }; - F42A79A321B1AD6600B6200F /* SPUIButtonExtenshion.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPUIButtonExtenshion.swift; sourceTree = ""; }; - F42A79A421B1AD6600B6200F /* SPUIDeviceExtenshion.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPUIDeviceExtenshion.swift; sourceTree = ""; }; - F42A79A621B1AD6600B6200F /* SPApp.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPApp.swift; sourceTree = ""; }; - F42A79A821B1AD6600B6200F /* SPConstraintsAssistent.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPConstraintsAssistent.swift; sourceTree = ""; }; - F42A79AA21B1AD6600B6200F /* SPLocalNotification.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPLocalNotification.swift; sourceTree = ""; }; - F42A79AC21B1AD6600B6200F /* SPMail.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPMail.swift; sourceTree = ""; }; - F42A79AE21B1AD6600B6200F /* SPLaunch.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPLaunch.swift; sourceTree = ""; }; - F42A79B021B1AD6600B6200F /* SPLayout.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPLayout.swift; sourceTree = ""; }; - F42A79B221B1AD6600B6200F /* SPShadow.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPShadow.swift; sourceTree = ""; }; - F42A79B321B1AD6600B6200F /* SPShadowDeep.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPShadowDeep.swift; sourceTree = ""; }; - F42A79B521B1AD6600B6200F /* SPCodeAudioIconPack.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPCodeAudioIconPack.swift; sourceTree = ""; }; - F42A79B621B1AD6600B6200F /* SPCodeSocialIconPack.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPCodeSocialIconPack.swift; sourceTree = ""; }; - F42A79B721B1AD6800B6200F /* SPCodeSystemIconPack.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPCodeSystemIconPack.swift; sourceTree = ""; }; - F42A79B821B1AD6800B6200F /* SPCodeDraw.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPCodeDraw.swift; sourceTree = ""; }; - F42A79B921B1AD6800B6200F /* SPGolubevGolubevIconPack.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPGolubevGolubevIconPack.swift; sourceTree = ""; }; - F42A79BB21B1AD6800B6200F /* SPAnimationUpward.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPAnimationUpward.swift; sourceTree = ""; }; - F42A79BC21B1AD6800B6200F /* SPAnimationSpring.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPAnimationSpring.swift; sourceTree = ""; }; - F42A79BD21B1AD6800B6200F /* SPAnimationAlpha.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPAnimationAlpha.swift; sourceTree = ""; }; - F42A79BE21B1AD6800B6200F /* SPAnimation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPAnimation.swift; sourceTree = ""; }; - F42A79C021B1AD6800B6200F /* SPDownloader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPDownloader.swift; sourceTree = ""; }; - F42A79C221B1AD6800B6200F /* SPAppStore.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPAppStore.swift; sourceTree = ""; }; - F42A79C421B1AD6800B6200F /* SPOpener.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPOpener.swift; sourceTree = ""; }; - F42A79C621B1AD6800B6200F /* SPBufer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPBufer.swift; sourceTree = ""; }; - F42A79C921B1AD6800B6200F /* SPTwitter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPTwitter.swift; sourceTree = ""; }; - F42A79CB21B1AD6800B6200F /* SPViber.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPViber.swift; sourceTree = ""; }; - F42A79CD21B1AD6800B6200F /* SPTelegram.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPTelegram.swift; sourceTree = ""; }; - F42A79CF21B1AD6800B6200F /* SPInstagram.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPInstagram.swift; sourceTree = ""; }; - F42A79D121B1AD6800B6200F /* SPWhatsApp.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPWhatsApp.swift; sourceTree = ""; }; - F42A79D321B1AD6800B6200F /* SPAudio.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPAudio.swift; sourceTree = ""; }; - F42A79D421B1AD6800B6200F /* SPAudioPlayer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPAudioPlayer.swift; sourceTree = ""; }; - F42A79D621B1AD6800B6200F /* SPDevice.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPDevice.swift; sourceTree = ""; }; - F42A79D821B1AD6800B6200F /* SPSpotlight.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPSpotlight.swift; sourceTree = ""; }; - F42A79DA21B1AD6800B6200F /* SPRandom.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPRandom.swift; sourceTree = ""; }; - F42A79DC21B1AD6800B6200F /* SPDelay.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPDelay.swift; sourceTree = ""; }; - F42A79DF21B1AD6800B6200F /* SPPermissionDialogView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPPermissionDialogView.swift; sourceTree = ""; }; - F42A79E021B1AD6800B6200F /* SPPermissionDialog.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPPermissionDialog.swift; sourceTree = ""; }; - F42A79E121B1AD6800B6200F /* SPPermissionDialogController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPPermissionDialogController.swift; sourceTree = ""; }; - F42A79E221B1AD6800B6200F /* SPPermission.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPPermission.swift; sourceTree = ""; }; - F42A79E421B1AD6800B6200F /* SPRequestPermissionLocationHandler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPRequestPermissionLocationHandler.swift; sourceTree = ""; }; - F42A79E621B1AD6800B6200F /* SPShare.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPShare.swift; sourceTree = ""; }; - F42A79E821B1AD6800B6200F /* SPBadge.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPBadge.swift; sourceTree = ""; }; F445CA8321AED92600184254 /* stork-controller.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "stork-controller.app"; sourceTree = BUILT_PRODUCTS_DIR; }; F445CA8621AED92600184254 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; F445CA8821AED92600184254 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; @@ -302,6 +153,137 @@ F445CA8D21AED92700184254 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; F445CA9021AED92700184254 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; F445CA9221AED92700184254 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + F47D9B4121B947A20033AAA4 /* SPStorkTransitioningDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPStorkTransitioningDelegate.swift; sourceTree = ""; }; + F47D9B4221B947A20033AAA4 /* SPStorkPresentingAnimationController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPStorkPresentingAnimationController.swift; sourceTree = ""; }; + F47D9B4321B947A20033AAA4 /* SPStorkPresentationController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPStorkPresentationController.swift; sourceTree = ""; }; + F47D9B4421B947A20033AAA4 /* SPStorkController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPStorkController.swift; sourceTree = ""; }; + F47D9B4521B947A20033AAA4 /* SPStorkIndicatorView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPStorkIndicatorView.swift; sourceTree = ""; }; + F47D9B4621B947A20033AAA4 /* SPStorkDismissingAnimationController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPStorkDismissingAnimationController.swift; sourceTree = ""; }; + F47D9B5021B947C20033AAA4 /* SPVibration.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPVibration.swift; sourceTree = ""; }; + F47D9B5321B947C20033AAA4 /* SPPlayCircleButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPPlayCircleButton.swift; sourceTree = ""; }; + F47D9B5421B947C20033AAA4 /* SPSocialButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPSocialButton.swift; sourceTree = ""; }; + F47D9B5521B947C20033AAA4 /* SPDotsButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPDotsButton.swift; sourceTree = ""; }; + F47D9B5621B947C20033AAA4 /* SPSystemIconButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPSystemIconButton.swift; sourceTree = ""; }; + F47D9B5721B947C20033AAA4 /* SPNativeLargeButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPNativeLargeButton.swift; sourceTree = ""; }; + F47D9B5821B947C20033AAA4 /* SPDownloadingButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPDownloadingButton.swift; sourceTree = ""; }; + F47D9B5921B947C20033AAA4 /* SPButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPButton.swift; sourceTree = ""; }; + F47D9B5A21B947C20033AAA4 /* SPAppStoreActionButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPAppStoreActionButton.swift; sourceTree = ""; }; + F47D9B5B21B947C20033AAA4 /* SPAppleMusicButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPAppleMusicButton.swift; sourceTree = ""; }; + F47D9B5D21B947C20033AAA4 /* SPProposeViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPProposeViewController.swift; sourceTree = ""; }; + F47D9B5E21B947C20033AAA4 /* SPBaseTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPBaseTableViewController.swift; sourceTree = ""; }; + F47D9B5F21B947C20033AAA4 /* SPBaseViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPBaseViewController.swift; sourceTree = ""; }; + F47D9B6021B947C20033AAA4 /* SPWelcomeViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPWelcomeViewController.swift; sourceTree = ""; }; + F47D9B6121B947C20033AAA4 /* SPConfirmActionViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPConfirmActionViewController.swift; sourceTree = ""; }; + F47D9B6221B947C20033AAA4 /* SPNativeTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPNativeTableViewController.swift; sourceTree = ""; }; + F47D9B6321B947C20033AAA4 /* SPStatusBarManagerViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPStatusBarManagerViewController.swift; sourceTree = ""; }; + F47D9B6521B947C20033AAA4 /* SPNativeLoginCodeViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPNativeLoginCodeViewController.swift; sourceTree = ""; }; + F47D9B6621B947C20033AAA4 /* SPNativeLoginNavigationController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPNativeLoginNavigationController.swift; sourceTree = ""; }; + F47D9B6721B947C20033AAA4 /* SPNativeLoginViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPNativeLoginViewController.swift; sourceTree = ""; }; + F47D9B6921B947C20033AAA4 /* SPImageView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPImageView.swift; sourceTree = ""; }; + F47D9B6A21B947C20033AAA4 /* SPScrollView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPScrollView.swift; sourceTree = ""; }; + F47D9B6D21B947C20033AAA4 /* SPCollectionViewLayout.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPCollectionViewLayout.swift; sourceTree = ""; }; + F47D9B6F21B947C20033AAA4 /* SPCollectionViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPCollectionViewCell.swift; sourceTree = ""; }; + F47D9B7021B947C20033AAA4 /* SPMengTransformCollectionViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPMengTransformCollectionViewCell.swift; sourceTree = ""; }; + F47D9B7121B947C20033AAA4 /* SPCollectionContainerCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPCollectionContainerCell.swift; sourceTree = ""; }; + F47D9B7221B947C20033AAA4 /* SPImageCollectionViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPImageCollectionViewCell.swift; sourceTree = ""; }; + F47D9B7421B947C20033AAA4 /* SPMengTransformCollectionView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPMengTransformCollectionView.swift; sourceTree = ""; }; + F47D9B7521B947C20033AAA4 /* SPCollectionView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPCollectionView.swift; sourceTree = ""; }; + F47D9B7621B947C20033AAA4 /* SPImagesLineCollectionView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPImagesLineCollectionView.swift; sourceTree = ""; }; + F47D9B7721B947C20033AAA4 /* SPFakeBarView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPFakeBarView.swift; sourceTree = ""; }; + F47D9B7921B947C20033AAA4 /* SPAudioIconView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPAudioIconView.swift; sourceTree = ""; }; + F47D9B7A21B947C20033AAA4 /* SPSocialIconView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPSocialIconView.swift; sourceTree = ""; }; + F47D9B7B21B947C20033AAA4 /* SPSystemIconView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPSystemIconView.swift; sourceTree = ""; }; + F47D9B7C21B947C20033AAA4 /* SPGolubevIconView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPGolubevIconView.swift; sourceTree = ""; }; + F47D9B7D21B947C20033AAA4 /* SPTextField.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPTextField.swift; sourceTree = ""; }; + F47D9B7E21B947C20033AAA4 /* SPGradeBlurView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPGradeBlurView.swift; sourceTree = ""; }; + F47D9B7F21B947C20033AAA4 /* SPDownloadingUIImageView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPDownloadingUIImageView.swift; sourceTree = ""; }; + F47D9B8021B947C20033AAA4 /* SPView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPView.swift; sourceTree = ""; }; + F47D9B8121B947C20033AAA4 /* SPGradientView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPGradientView.swift; sourceTree = ""; }; + F47D9B8321B947C20033AAA4 /* SPEmptyProposeLabel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPEmptyProposeLabel.swift; sourceTree = ""; }; + F47D9B8421B947C20033AAA4 /* SPTableView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPTableView.swift; sourceTree = ""; }; + F47D9B8521B947C20033AAA4 /* SPEmptyProposeView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPEmptyProposeView.swift; sourceTree = ""; }; + F47D9B8721B947C20033AAA4 /* SPPromoTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPPromoTableViewCell.swift; sourceTree = ""; }; + F47D9B8921B947C20033AAA4 /* SPFormButtonTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPFormButtonTableViewCell.swift; sourceTree = ""; }; + F47D9B8A21B947C20033AAA4 /* SPFormMailTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPFormMailTableViewCell.swift; sourceTree = ""; }; + F47D9B8B21B947C20033AAA4 /* SPFormLabelTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPFormLabelTableViewCell.swift; sourceTree = ""; }; + F47D9B8C21B947C20033AAA4 /* SPFormTextFiledTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPFormTextFiledTableViewCell.swift; sourceTree = ""; }; + F47D9B8D21B947C20033AAA4 /* SPFormFeaturedTitleTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPFormFeaturedTitleTableViewCell.swift; sourceTree = ""; }; + F47D9B8E21B947C20033AAA4 /* SPFormTextInputTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPFormTextInputTableViewCell.swift; sourceTree = ""; }; + F47D9B8F21B947C20033AAA4 /* SPFormTextTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPFormTextTableViewCell.swift; sourceTree = ""; }; + F47D9B9021B947C20033AAA4 /* SPMengTransformTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPMengTransformTableViewCell.swift; sourceTree = ""; }; + F47D9B9121B947C20033AAA4 /* SPImageTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPImageTableViewCell.swift; sourceTree = ""; }; + F47D9B9221B947C20033AAA4 /* SPProposeTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPProposeTableViewCell.swift; sourceTree = ""; }; + F47D9B9321B947C20033AAA4 /* SPBaseContentTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPBaseContentTableViewCell.swift; sourceTree = ""; }; + F47D9B9421B947C20033AAA4 /* SPTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPTableViewCell.swift; sourceTree = ""; }; + F47D9B9521B947C20033AAA4 /* SPCollectionImagesTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPCollectionImagesTableViewCell.swift; sourceTree = ""; }; + F47D9B9621B947C20033AAA4 /* SPVideoPlayer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPVideoPlayer.swift; sourceTree = ""; }; + F47D9B9721B947C20033AAA4 /* SPLabel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPLabel.swift; sourceTree = ""; }; + F47D9B9821B947C20033AAA4 /* SPBlurView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPBlurView.swift; sourceTree = ""; }; + F47D9B9A21B947C20033AAA4 /* SPNativeStyleKit.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPNativeStyleKit.swift; sourceTree = ""; }; + F47D9B9C21B947C20033AAA4 /* SPTypes.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPTypes.swift; sourceTree = ""; }; + F47D9B9E21B947C20033AAA4 /* SPLocale.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPLocale.swift; sourceTree = ""; }; + F47D9BA021B947C20033AAA4 /* SPUIAlertControllerExtenshion.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPUIAlertControllerExtenshion.swift; sourceTree = ""; }; + F47D9BA121B947C20033AAA4 /* SPUITableViewCellExtenshion.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPUITableViewCellExtenshion.swift; sourceTree = ""; }; + F47D9BA221B947C20033AAA4 /* SPUITextFieldExtenshion.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPUITextFieldExtenshion.swift; sourceTree = ""; }; + F47D9BA321B947C20033AAA4 /* SPUIFontExtenshion.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPUIFontExtenshion.swift; sourceTree = ""; }; + F47D9BA421B947C20033AAA4 /* SPUIImageExtension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPUIImageExtension.swift; sourceTree = ""; }; + F47D9BA521B947C20033AAA4 /* SPUITableView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPUITableView.swift; sourceTree = ""; }; + F47D9BA621B947C20033AAA4 /* SPUIViewExtenshion.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPUIViewExtenshion.swift; sourceTree = ""; }; + F47D9BA721B947C20033AAA4 /* SPArrayExtension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPArrayExtension.swift; sourceTree = ""; }; + F47D9BA821B947C20033AAA4 /* SPUserDefaultsExtenshion.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPUserDefaultsExtenshion.swift; sourceTree = ""; }; + F47D9BA921B947C20033AAA4 /* SPUIViewControllerExtenshion.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPUIViewControllerExtenshion.swift; sourceTree = ""; }; + F47D9BAA21B947C20033AAA4 /* SPStringExtenshion.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPStringExtenshion.swift; sourceTree = ""; }; + F47D9BAB21B947C20033AAA4 /* SPStrideableExtension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPStrideableExtension.swift; sourceTree = ""; }; + F47D9BAC21B947C20033AAA4 /* SPUIVisualEffectViewExtenshion.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPUIVisualEffectViewExtenshion.swift; sourceTree = ""; }; + F47D9BAD21B947C20033AAA4 /* SPUICollectionViewExtenshion.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPUICollectionViewExtenshion.swift; sourceTree = ""; }; + F47D9BAE21B947C20033AAA4 /* SPTextFieldExtenshion.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPTextFieldExtenshion.swift; sourceTree = ""; }; + F47D9BAF21B947C20033AAA4 /* SPUITabBarControllerExtenshion.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPUITabBarControllerExtenshion.swift; sourceTree = ""; }; + F47D9BB021B947C20033AAA4 /* SPUINavigationControllerExtenshion.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPUINavigationControllerExtenshion.swift; sourceTree = ""; }; + F47D9BB121B947C20033AAA4 /* SPCGRectExtension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPCGRectExtension.swift; sourceTree = ""; }; + F47D9BB221B947C20033AAA4 /* SPUILabelExtenshion.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPUILabelExtenshion.swift; sourceTree = ""; }; + F47D9BB321B947C20033AAA4 /* SPCGSizeExtenshion.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPCGSizeExtenshion.swift; sourceTree = ""; }; + F47D9BB421B947C20033AAA4 /* SPUIImageViewExtenshion.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPUIImageViewExtenshion.swift; sourceTree = ""; }; + F47D9BB521B947C20033AAA4 /* SPUIColorExtension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPUIColorExtension.swift; sourceTree = ""; }; + F47D9BB621B947C20033AAA4 /* SPUIButtonExtenshion.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPUIButtonExtenshion.swift; sourceTree = ""; }; + F47D9BB821B947C20033AAA4 /* SPApp.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPApp.swift; sourceTree = ""; }; + F47D9BBA21B947C20033AAA4 /* SPConstraints.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPConstraints.swift; sourceTree = ""; }; + F47D9BBC21B947C20033AAA4 /* SPLocalNotification.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPLocalNotification.swift; sourceTree = ""; }; + F47D9BBE21B947C20033AAA4 /* SPMail.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPMail.swift; sourceTree = ""; }; + F47D9BC021B947C20033AAA4 /* SPLaunch.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPLaunch.swift; sourceTree = ""; }; + F47D9BC221B947C20033AAA4 /* SPLayout.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPLayout.swift; sourceTree = ""; }; + F47D9BC421B947C20033AAA4 /* SPShadow.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPShadow.swift; sourceTree = ""; }; + F47D9BC521B947C20033AAA4 /* SPShadowDeep.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPShadowDeep.swift; sourceTree = ""; }; + F47D9BC721B947C20033AAA4 /* SPCodeAudioIconPack.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPCodeAudioIconPack.swift; sourceTree = ""; }; + F47D9BC821B947C20033AAA4 /* SPCodeSocialIconPack.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPCodeSocialIconPack.swift; sourceTree = ""; }; + F47D9BC921B947C20033AAA4 /* SPCodeSystemIconPack.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPCodeSystemIconPack.swift; sourceTree = ""; }; + F47D9BCA21B947C20033AAA4 /* SPCodeDraw.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPCodeDraw.swift; sourceTree = ""; }; + F47D9BCB21B947C20033AAA4 /* SPGolubevGolubevIconPack.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPGolubevGolubevIconPack.swift; sourceTree = ""; }; + F47D9BCD21B947C20033AAA4 /* SPAnimationUpward.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPAnimationUpward.swift; sourceTree = ""; }; + F47D9BCE21B947C20033AAA4 /* SPAnimationSpring.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPAnimationSpring.swift; sourceTree = ""; }; + F47D9BCF21B947C20033AAA4 /* SPAnimationAlpha.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPAnimationAlpha.swift; sourceTree = ""; }; + F47D9BD021B947C20033AAA4 /* SPAnimation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPAnimation.swift; sourceTree = ""; }; + F47D9BD221B947C20033AAA4 /* SPDownloader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPDownloader.swift; sourceTree = ""; }; + F47D9BD421B947C20033AAA4 /* SPAppStore.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPAppStore.swift; sourceTree = ""; }; + F47D9BD621B947C20033AAA4 /* SPOpener.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPOpener.swift; sourceTree = ""; }; + F47D9BD821B947C20033AAA4 /* SPBufer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPBufer.swift; sourceTree = ""; }; + F47D9BDB21B947C20033AAA4 /* SPTwitter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPTwitter.swift; sourceTree = ""; }; + F47D9BDD21B947C20033AAA4 /* SPViber.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPViber.swift; sourceTree = ""; }; + F47D9BDF21B947C20033AAA4 /* SPTelegram.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPTelegram.swift; sourceTree = ""; }; + F47D9BE121B947C20033AAA4 /* SPInstagram.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPInstagram.swift; sourceTree = ""; }; + F47D9BE321B947C20033AAA4 /* SPWhatsApp.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPWhatsApp.swift; sourceTree = ""; }; + F47D9BE521B947C20033AAA4 /* SPAudio.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPAudio.swift; sourceTree = ""; }; + F47D9BE621B947C20033AAA4 /* SPAudioPlayer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPAudioPlayer.swift; sourceTree = ""; }; + F47D9BE821B947C20033AAA4 /* SPDevice.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPDevice.swift; sourceTree = ""; }; + F47D9BEA21B947C20033AAA4 /* SPSpotlight.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPSpotlight.swift; sourceTree = ""; }; + F47D9BEC21B947C20033AAA4 /* SPRandom.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPRandom.swift; sourceTree = ""; }; + F47D9BEE21B947C20033AAA4 /* SPDelay.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPDelay.swift; sourceTree = ""; }; + F47D9BF121B947C20033AAA4 /* SPPermissionDialogView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPPermissionDialogView.swift; sourceTree = ""; }; + F47D9BF221B947C20033AAA4 /* SPPermissionDialog.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPPermissionDialog.swift; sourceTree = ""; }; + F47D9BF321B947C20033AAA4 /* SPPermissionDialogController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPPermissionDialogController.swift; sourceTree = ""; }; + F47D9BF421B947C20033AAA4 /* SPPermission.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPPermission.swift; sourceTree = ""; }; + F47D9BF621B947C20033AAA4 /* SPRequestPermissionLocationHandler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPRequestPermissionLocationHandler.swift; sourceTree = ""; }; + F47D9BF821B947C20033AAA4 /* SPShare.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPShare.swift; sourceTree = ""; }; + F47D9BFA21B947C20033AAA4 /* SPBadge.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SPBadge.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -315,545 +297,6 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - F42A792B21B1AD6500B6200F /* Sparrow */ = { - isa = PBXGroup; - children = ( - F42A792C21B1AD6500B6200F /* internet-connection */, - F42A792E21B1AD6500B6200F /* vibration */, - F42A793021B1AD6500B6200F /* ui */, - F42A797E21B1AD6600B6200F /* style-kit */, - F42A798121B1AD6600B6200F /* types */, - F42A798321B1AD6600B6200F /* locale */, - F42A798521B1AD6600B6200F /* extension */, - F42A79A521B1AD6600B6200F /* app */, - F42A79A721B1AD6600B6200F /* constraints */, - F42A79A921B1AD6600B6200F /* notification */, - F42A79AB21B1AD6600B6200F /* mail */, - F42A79AD21B1AD6600B6200F /* launch */, - F42A79AF21B1AD6600B6200F /* layout */, - F42A79B121B1AD6600B6200F /* shadow */, - F42A79B421B1AD6600B6200F /* code-draw */, - F42A79BA21B1AD6800B6200F /* animation */, - F42A79BF21B1AD6800B6200F /* downloader */, - F42A79C121B1AD6800B6200F /* app-store */, - F42A79C321B1AD6800B6200F /* opener */, - F42A79C521B1AD6800B6200F /* bufer */, - F42A79C721B1AD6800B6200F /* social */, - F42A79D221B1AD6800B6200F /* audio */, - F42A79D521B1AD6800B6200F /* device */, - F42A79D721B1AD6800B6200F /* сore-spotlight */, - F42A79D921B1AD6800B6200F /* random */, - F42A79DB21B1AD6800B6200F /* delay */, - F42A79DD21B1AD6800B6200F /* permission */, - F42A79E521B1AD6800B6200F /* share */, - F42A79E721B1AD6800B6200F /* badge */, - ); - path = Sparrow; - sourceTree = ""; - }; - F42A792C21B1AD6500B6200F /* internet-connection */ = { - isa = PBXGroup; - children = ( - F42A792D21B1AD6500B6200F /* SPInternetConnection.swift */, - ); - path = "internet-connection"; - sourceTree = ""; - }; - F42A792E21B1AD6500B6200F /* vibration */ = { - isa = PBXGroup; - children = ( - F42A792F21B1AD6500B6200F /* SPVibration.swift */, - ); - path = vibration; - sourceTree = ""; - }; - F42A793021B1AD6500B6200F /* ui */ = { - isa = PBXGroup; - children = ( - F42A793121B1AD6500B6200F /* buttons */, - F42A793B21B1AD6600B6200F /* controllers */, - F42A795121B1AD6600B6200F /* views */, - ); - path = ui; - sourceTree = ""; - }; - F42A793121B1AD6500B6200F /* buttons */ = { - isa = PBXGroup; - children = ( - F42A793221B1AD6600B6200F /* SPPlayCircleButton.swift */, - F42A793321B1AD6600B6200F /* SPSocialIconButton.swift */, - F42A793421B1AD6600B6200F /* SPMengButton.swift */, - F42A793521B1AD6600B6200F /* SPSystemIconButton.swift */, - F42A793621B1AD6600B6200F /* SPDownloadingButton.swift */, - F42A793721B1AD6600B6200F /* SPRoundButton.swift */, - F42A793821B1AD6600B6200F /* SPNativeOS11Button.swift */, - F42A793921B1AD6600B6200F /* SPGradientButton.swift */, - F42A793A21B1AD6600B6200F /* SPAppStoreActionButton.swift */, - ); - path = buttons; - sourceTree = ""; - }; - F42A793B21B1AD6600B6200F /* controllers */ = { - isa = PBXGroup; - children = ( - F42A793C21B1AD6600B6200F /* SPProposeViewController.swift */, - F42A793D21B1AD6600B6200F /* SPProgressLoadingViewController.swift */, - F42A793E21B1AD6600B6200F /* SPScrollViewController.swift */, - F42A793F21B1AD6600B6200F /* SPBaseTableViewController.swift */, - F42A794021B1AD6600B6200F /* SPBaseViewController.swift */, - F42A794121B1AD6600B6200F /* SPWelcomeViewController.swift */, - F42A794221B1AD6600B6200F /* SPRootViewController.swift */, - F42A794321B1AD6600B6200F /* SPConfirmActionViewController.swift */, - F42A794421B1AD6600B6200F /* SPNativeTableViewController.swift */, - F42A794521B1AD6600B6200F /* SPHiderViewController.swift */, - F42A794621B1AD6600B6200F /* SPStatusBarManagerViewController.swift */, - F42A794721B1AD6600B6200F /* login */, - F42A794B21B1AD6600B6200F /* stork */, - ); - path = controllers; - sourceTree = ""; - }; - F42A794721B1AD6600B6200F /* login */ = { - isa = PBXGroup; - children = ( - F42A794821B1AD6600B6200F /* SPNativeLoginCodeViewController.swift */, - F42A794921B1AD6600B6200F /* SPNativeLoginNavigationController.swift */, - F42A794A21B1AD6600B6200F /* SPNativeLoginViewController.swift */, - ); - path = login; - sourceTree = ""; - }; - F42A794B21B1AD6600B6200F /* stork */ = { - isa = PBXGroup; - children = ( - F42A794C21B1AD6600B6200F /* SPStorkTransitioningDelegate.swift */, - F42A794D21B1AD6600B6200F /* SPStorkPresentingAnimationController.swift */, - F42A794E21B1AD6600B6200F /* SPStorkPresentationController.swift */, - F42A794F21B1AD6600B6200F /* SPStorkIndicatorView.swift */, - F42A795021B1AD6600B6200F /* SPStorkDismissingAnimationController.swift */, - ); - path = stork; - sourceTree = ""; - }; - F42A795121B1AD6600B6200F /* views */ = { - isa = PBXGroup; - children = ( - F42A795221B1AD6600B6200F /* tableView */, - F42A795621B1AD6600B6200F /* SPScrollView.swift */, - F42A795721B1AD6600B6200F /* SPFakeBarView.swift */, - F42A795821B1AD6600B6200F /* collectionView */, - F42A796321B1AD6600B6200F /* SPAligmentView.swift */, - F42A796421B1AD6600B6200F /* code-draw */, - F42A796921B1AD6600B6200F /* SPGradeBlurView.swift */, - F42A796A21B1AD6600B6200F /* SPDownloadingUIImageView.swift */, - F42A796B21B1AD6600B6200F /* SPGradientView.swift */, - F42A796C21B1AD6600B6200F /* SPVideoPlayer.swift */, - F42A796D21B1AD6600B6200F /* tableViewCell */, - F42A797D21B1AD6600B6200F /* SPBlurView.swift */, - ); - path = views; - sourceTree = ""; - }; - F42A795221B1AD6600B6200F /* tableView */ = { - isa = PBXGroup; - children = ( - F42A795321B1AD6600B6200F /* SPEmptyProposeLabel.swift */, - F42A795421B1AD6600B6200F /* SPTableView.swift */, - F42A795521B1AD6600B6200F /* SPEmptyProposeView.swift */, - ); - path = tableView; - sourceTree = ""; - }; - F42A795821B1AD6600B6200F /* collectionView */ = { - isa = PBXGroup; - children = ( - F42A795921B1AD6600B6200F /* cells */, - F42A795D21B1AD6600B6200F /* layouts */, - F42A795F21B1AD6600B6200F /* collectionViews */, - ); - path = collectionView; - sourceTree = ""; - }; - F42A795921B1AD6600B6200F /* cells */ = { - isa = PBXGroup; - children = ( - F42A795A21B1AD6600B6200F /* SPCollectionViewCell.swift */, - F42A795B21B1AD6600B6200F /* SPMengTransformCollectionViewCell.swift */, - F42A795C21B1AD6600B6200F /* SPImageCollectionViewCell.swift */, - ); - path = cells; - sourceTree = ""; - }; - F42A795D21B1AD6600B6200F /* layouts */ = { - isa = PBXGroup; - children = ( - F42A795E21B1AD6600B6200F /* SPCollectionViewLayout.swift */, - ); - path = layouts; - sourceTree = ""; - }; - F42A795F21B1AD6600B6200F /* collectionViews */ = { - isa = PBXGroup; - children = ( - F42A796021B1AD6600B6200F /* SPMengTransformCollectionView.swift */, - F42A796121B1AD6600B6200F /* SPCollectionView.swift */, - F42A796221B1AD6600B6200F /* SPImagesLineCollectionView.swift */, - ); - path = collectionViews; - sourceTree = ""; - }; - F42A796421B1AD6600B6200F /* code-draw */ = { - isa = PBXGroup; - children = ( - F42A796521B1AD6600B6200F /* SPAudioIconView.swift */, - F42A796621B1AD6600B6200F /* SPSocialIconView.swift */, - F42A796721B1AD6600B6200F /* SPSystemIconView.swift */, - F42A796821B1AD6600B6200F /* SPGolubevIconView.swift */, - ); - path = "code-draw"; - sourceTree = ""; - }; - F42A796D21B1AD6600B6200F /* tableViewCell */ = { - isa = PBXGroup; - children = ( - F42A796E21B1AD6600B6200F /* SPPromoTableViewCell.swift */, - F42A796F21B1AD6600B6200F /* form */, - F42A797721B1AD6600B6200F /* SPMengTransformTableViewCell.swift */, - F42A797821B1AD6600B6200F /* SPImageTableViewCell.swift */, - F42A797921B1AD6600B6200F /* SPProposeTableViewCell.swift */, - F42A797A21B1AD6600B6200F /* SPBaseContentTableViewCell.swift */, - F42A797B21B1AD6600B6200F /* SPTableViewCell.swift */, - F42A797C21B1AD6600B6200F /* SPCollectionImagesTableViewCell.swift */, - ); - path = tableViewCell; - sourceTree = ""; - }; - F42A796F21B1AD6600B6200F /* form */ = { - isa = PBXGroup; - children = ( - F42A797021B1AD6600B6200F /* SPFormButtonTableViewCell.swift */, - F42A797121B1AD6600B6200F /* SPFormMailTableViewCell.swift */, - F42A797221B1AD6600B6200F /* SPFormLabelTableViewCell.swift */, - F42A797321B1AD6600B6200F /* SPFormTextFiledTableViewCell.swift */, - F42A797421B1AD6600B6200F /* SPFormFeaturedTitleTableViewCell.swift */, - F42A797521B1AD6600B6200F /* SPFormTextInputTableViewCell.swift */, - F42A797621B1AD6600B6200F /* SPFormTextTableViewCell.swift */, - ); - path = form; - sourceTree = ""; - }; - F42A797E21B1AD6600B6200F /* style-kit */ = { - isa = PBXGroup; - children = ( - F42A797F21B1AD6600B6200F /* SPStyleKit.swift */, - F42A798021B1AD6600B6200F /* SPNativeStyleKit.swift */, - ); - path = "style-kit"; - sourceTree = ""; - }; - F42A798121B1AD6600B6200F /* types */ = { - isa = PBXGroup; - children = ( - F42A798221B1AD6600B6200F /* SPTypes.swift */, - ); - path = types; - sourceTree = ""; - }; - F42A798321B1AD6600B6200F /* locale */ = { - isa = PBXGroup; - children = ( - F42A798421B1AD6600B6200F /* SPLocale.swift */, - ); - path = locale; - sourceTree = ""; - }; - F42A798521B1AD6600B6200F /* extension */ = { - isa = PBXGroup; - children = ( - F42A798621B1AD6600B6200F /* SPUIScreenExtension.swift */, - F42A798721B1AD6600B6200F /* SPUIAlertControllerExtenshion.swift */, - F42A798821B1AD6600B6200F /* SPUITableViewCellExtenshion.swift */, - F42A798921B1AD6600B6200F /* SPUITextFieldExtenshion.swift */, - F42A798A21B1AD6600B6200F /* SPUIFontExtenshion.swift */, - F42A798B21B1AD6600B6200F /* SPUIImageExtension.swift */, - F42A798C21B1AD6600B6200F /* SPDateExtenshon.swift */, - F42A798D21B1AD6600B6200F /* SPUITableView.swift */, - F42A798E21B1AD6600B6200F /* SPUIViewExtenshion.swift */, - F42A798F21B1AD6600B6200F /* SPCGPointExtenshion.swift */, - F42A799021B1AD6600B6200F /* SPArrayExtension.swift */, - F42A799121B1AD6600B6200F /* SPUserDefaultsExtenshion.swift */, - F42A799221B1AD6600B6200F /* SPUIViewControllerExtenshion.swift */, - F42A799321B1AD6600B6200F /* SPStringExtenshion.swift */, - F42A799421B1AD6600B6200F /* SPStrideableExtension.swift */, - F42A799521B1AD6600B6200F /* SPUIVisualEffectViewExtenshion.swift */, - F42A799621B1AD6600B6200F /* SPBezierPathExtension.swift */, - F42A799721B1AD6600B6200F /* SPUICollectionViewExtenshion.swift */, - F42A799821B1AD6600B6200F /* SPUITableViewControllerExtenshion.swift */, - F42A799921B1AD6600B6200F /* SPTextFieldExtenshion.swift */, - F42A799A21B1AD6600B6200F /* SPUITabBarControllerExtenshion.swift */, - F42A799B21B1AD6600B6200F /* SPUINavigationControllerExtenshion.swift */, - F42A799C21B1AD6600B6200F /* SPCGRectExtension.swift */, - F42A799D21B1AD6600B6200F /* SPUIWindowExtenshion.swift */, - F42A799E21B1AD6600B6200F /* SPUILabelExtenshion.swift */, - F42A799F21B1AD6600B6200F /* SPCGSizeExtenshion.swift */, - F42A79A021B1AD6600B6200F /* SPUIImageViewExtenshion.swift */, - F42A79A121B1AD6600B6200F /* SPUIColorExtension.swift */, - F42A79A221B1AD6600B6200F /* SPCollectionExtenshion.swift */, - F42A79A321B1AD6600B6200F /* SPUIButtonExtenshion.swift */, - F42A79A421B1AD6600B6200F /* SPUIDeviceExtenshion.swift */, - ); - path = extension; - sourceTree = ""; - }; - F42A79A521B1AD6600B6200F /* app */ = { - isa = PBXGroup; - children = ( - F42A79A621B1AD6600B6200F /* SPApp.swift */, - ); - path = app; - sourceTree = ""; - }; - F42A79A721B1AD6600B6200F /* constraints */ = { - isa = PBXGroup; - children = ( - F42A79A821B1AD6600B6200F /* SPConstraintsAssistent.swift */, - ); - path = constraints; - sourceTree = ""; - }; - F42A79A921B1AD6600B6200F /* notification */ = { - isa = PBXGroup; - children = ( - F42A79AA21B1AD6600B6200F /* SPLocalNotification.swift */, - ); - path = notification; - sourceTree = ""; - }; - F42A79AB21B1AD6600B6200F /* mail */ = { - isa = PBXGroup; - children = ( - F42A79AC21B1AD6600B6200F /* SPMail.swift */, - ); - path = mail; - sourceTree = ""; - }; - F42A79AD21B1AD6600B6200F /* launch */ = { - isa = PBXGroup; - children = ( - F42A79AE21B1AD6600B6200F /* SPLaunch.swift */, - ); - path = launch; - sourceTree = ""; - }; - F42A79AF21B1AD6600B6200F /* layout */ = { - isa = PBXGroup; - children = ( - F42A79B021B1AD6600B6200F /* SPLayout.swift */, - ); - path = layout; - sourceTree = ""; - }; - F42A79B121B1AD6600B6200F /* shadow */ = { - isa = PBXGroup; - children = ( - F42A79B221B1AD6600B6200F /* SPShadow.swift */, - F42A79B321B1AD6600B6200F /* SPShadowDeep.swift */, - ); - path = shadow; - sourceTree = ""; - }; - F42A79B421B1AD6600B6200F /* code-draw */ = { - isa = PBXGroup; - children = ( - F42A79B521B1AD6600B6200F /* SPCodeAudioIconPack.swift */, - F42A79B621B1AD6600B6200F /* SPCodeSocialIconPack.swift */, - F42A79B721B1AD6800B6200F /* SPCodeSystemIconPack.swift */, - F42A79B821B1AD6800B6200F /* SPCodeDraw.swift */, - F42A79B921B1AD6800B6200F /* SPGolubevGolubevIconPack.swift */, - ); - path = "code-draw"; - sourceTree = ""; - }; - F42A79BA21B1AD6800B6200F /* animation */ = { - isa = PBXGroup; - children = ( - F42A79BB21B1AD6800B6200F /* SPAnimationUpward.swift */, - F42A79BC21B1AD6800B6200F /* SPAnimationSpring.swift */, - F42A79BD21B1AD6800B6200F /* SPAnimationAlpha.swift */, - F42A79BE21B1AD6800B6200F /* SPAnimation.swift */, - ); - path = animation; - sourceTree = ""; - }; - F42A79BF21B1AD6800B6200F /* downloader */ = { - isa = PBXGroup; - children = ( - F42A79C021B1AD6800B6200F /* SPDownloader.swift */, - ); - path = downloader; - sourceTree = ""; - }; - F42A79C121B1AD6800B6200F /* app-store */ = { - isa = PBXGroup; - children = ( - F42A79C221B1AD6800B6200F /* SPAppStore.swift */, - ); - path = "app-store"; - sourceTree = ""; - }; - F42A79C321B1AD6800B6200F /* opener */ = { - isa = PBXGroup; - children = ( - F42A79C421B1AD6800B6200F /* SPOpener.swift */, - ); - path = opener; - sourceTree = ""; - }; - F42A79C521B1AD6800B6200F /* bufer */ = { - isa = PBXGroup; - children = ( - F42A79C621B1AD6800B6200F /* SPBufer.swift */, - ); - path = bufer; - sourceTree = ""; - }; - F42A79C721B1AD6800B6200F /* social */ = { - isa = PBXGroup; - children = ( - F42A79C821B1AD6800B6200F /* twitter */, - F42A79CA21B1AD6800B6200F /* viber */, - F42A79CC21B1AD6800B6200F /* telegram */, - F42A79CE21B1AD6800B6200F /* instagram */, - F42A79D021B1AD6800B6200F /* whatsapp */, - ); - path = social; - sourceTree = ""; - }; - F42A79C821B1AD6800B6200F /* twitter */ = { - isa = PBXGroup; - children = ( - F42A79C921B1AD6800B6200F /* SPTwitter.swift */, - ); - path = twitter; - sourceTree = ""; - }; - F42A79CA21B1AD6800B6200F /* viber */ = { - isa = PBXGroup; - children = ( - F42A79CB21B1AD6800B6200F /* SPViber.swift */, - ); - path = viber; - sourceTree = ""; - }; - F42A79CC21B1AD6800B6200F /* telegram */ = { - isa = PBXGroup; - children = ( - F42A79CD21B1AD6800B6200F /* SPTelegram.swift */, - ); - path = telegram; - sourceTree = ""; - }; - F42A79CE21B1AD6800B6200F /* instagram */ = { - isa = PBXGroup; - children = ( - F42A79CF21B1AD6800B6200F /* SPInstagram.swift */, - ); - path = instagram; - sourceTree = ""; - }; - F42A79D021B1AD6800B6200F /* whatsapp */ = { - isa = PBXGroup; - children = ( - F42A79D121B1AD6800B6200F /* SPWhatsApp.swift */, - ); - path = whatsapp; - sourceTree = ""; - }; - F42A79D221B1AD6800B6200F /* audio */ = { - isa = PBXGroup; - children = ( - F42A79D321B1AD6800B6200F /* SPAudio.swift */, - F42A79D421B1AD6800B6200F /* SPAudioPlayer.swift */, - ); - path = audio; - sourceTree = ""; - }; - F42A79D521B1AD6800B6200F /* device */ = { - isa = PBXGroup; - children = ( - F42A79D621B1AD6800B6200F /* SPDevice.swift */, - ); - path = device; - sourceTree = ""; - }; - F42A79D721B1AD6800B6200F /* сore-spotlight */ = { - isa = PBXGroup; - children = ( - F42A79D821B1AD6800B6200F /* SPSpotlight.swift */, - ); - path = "сore-spotlight"; - sourceTree = ""; - }; - F42A79D921B1AD6800B6200F /* random */ = { - isa = PBXGroup; - children = ( - F42A79DA21B1AD6800B6200F /* SPRandom.swift */, - ); - path = random; - sourceTree = ""; - }; - F42A79DB21B1AD6800B6200F /* delay */ = { - isa = PBXGroup; - children = ( - F42A79DC21B1AD6800B6200F /* SPDelay.swift */, - ); - path = delay; - sourceTree = ""; - }; - F42A79DD21B1AD6800B6200F /* permission */ = { - isa = PBXGroup; - children = ( - F42A79DE21B1AD6800B6200F /* dialog */, - F42A79E221B1AD6800B6200F /* SPPermission.swift */, - F42A79E321B1AD6800B6200F /* handlers */, - ); - path = permission; - sourceTree = ""; - }; - F42A79DE21B1AD6800B6200F /* dialog */ = { - isa = PBXGroup; - children = ( - F42A79DF21B1AD6800B6200F /* SPPermissionDialogView.swift */, - F42A79E021B1AD6800B6200F /* SPPermissionDialog.swift */, - F42A79E121B1AD6800B6200F /* SPPermissionDialogController.swift */, - ); - path = dialog; - sourceTree = ""; - }; - F42A79E321B1AD6800B6200F /* handlers */ = { - isa = PBXGroup; - children = ( - F42A79E421B1AD6800B6200F /* SPRequestPermissionLocationHandler.swift */, - ); - path = handlers; - sourceTree = ""; - }; - F42A79E521B1AD6800B6200F /* share */ = { - isa = PBXGroup; - children = ( - F42A79E621B1AD6800B6200F /* SPShare.swift */, - ); - path = share; - sourceTree = ""; - }; - F42A79E721B1AD6800B6200F /* badge */ = { - isa = PBXGroup; - children = ( - F42A79E821B1AD6800B6200F /* SPBadge.swift */, - ); - path = badge; - sourceTree = ""; - }; F445CA7A21AED92600184254 = { isa = PBXGroup; children = ( @@ -887,11 +330,541 @@ F445CA9821AED98500184254 /* Frameworks */ = { isa = PBXGroup; children = ( - F42A792B21B1AD6500B6200F /* Sparrow */, + F47D9B4D21B947C20033AAA4 /* Sparrow */, + F47D9B4021B947A20033AAA4 /* StorkController */, ); path = Frameworks; sourceTree = ""; }; + F47D9B4021B947A20033AAA4 /* StorkController */ = { + isa = PBXGroup; + children = ( + F47D9B4121B947A20033AAA4 /* SPStorkTransitioningDelegate.swift */, + F47D9B4221B947A20033AAA4 /* SPStorkPresentingAnimationController.swift */, + F47D9B4321B947A20033AAA4 /* SPStorkPresentationController.swift */, + F47D9B4421B947A20033AAA4 /* SPStorkController.swift */, + F47D9B4521B947A20033AAA4 /* SPStorkIndicatorView.swift */, + F47D9B4621B947A20033AAA4 /* SPStorkDismissingAnimationController.swift */, + ); + path = StorkController; + sourceTree = ""; + }; + F47D9B4D21B947C20033AAA4 /* Sparrow */ = { + isa = PBXGroup; + children = ( + F47D9B4E21B947C20033AAA4 /* internet-connection */, + F47D9B4F21B947C20033AAA4 /* vibration */, + F47D9B5121B947C20033AAA4 /* ui */, + F47D9B9921B947C20033AAA4 /* style-kit */, + F47D9B9B21B947C20033AAA4 /* types */, + F47D9B9D21B947C20033AAA4 /* locale */, + F47D9B9F21B947C20033AAA4 /* extension */, + F47D9BB721B947C20033AAA4 /* app */, + F47D9BB921B947C20033AAA4 /* constraints */, + F47D9BBB21B947C20033AAA4 /* notification */, + F47D9BBD21B947C20033AAA4 /* mail */, + F47D9BBF21B947C20033AAA4 /* launch */, + F47D9BC121B947C20033AAA4 /* layout */, + F47D9BC321B947C20033AAA4 /* shadow */, + F47D9BC621B947C20033AAA4 /* code-draw */, + F47D9BCC21B947C20033AAA4 /* animation */, + F47D9BD121B947C20033AAA4 /* downloader */, + F47D9BD321B947C20033AAA4 /* app-store */, + F47D9BD521B947C20033AAA4 /* opener */, + F47D9BD721B947C20033AAA4 /* bufer */, + F47D9BD921B947C20033AAA4 /* social */, + F47D9BE421B947C20033AAA4 /* audio */, + F47D9BE721B947C20033AAA4 /* device */, + F47D9BE921B947C20033AAA4 /* сore-spotlight */, + F47D9BEB21B947C20033AAA4 /* random */, + F47D9BED21B947C20033AAA4 /* delay */, + F47D9BEF21B947C20033AAA4 /* permission */, + F47D9BF721B947C20033AAA4 /* share */, + F47D9BF921B947C20033AAA4 /* badge */, + ); + path = Sparrow; + sourceTree = ""; + }; + F47D9B4E21B947C20033AAA4 /* internet-connection */ = { + isa = PBXGroup; + children = ( + ); + path = "internet-connection"; + sourceTree = ""; + }; + F47D9B4F21B947C20033AAA4 /* vibration */ = { + isa = PBXGroup; + children = ( + F47D9B5021B947C20033AAA4 /* SPVibration.swift */, + ); + path = vibration; + sourceTree = ""; + }; + F47D9B5121B947C20033AAA4 /* ui */ = { + isa = PBXGroup; + children = ( + F47D9B5221B947C20033AAA4 /* buttons */, + F47D9B5C21B947C20033AAA4 /* controllers */, + F47D9B6821B947C20033AAA4 /* views */, + ); + path = ui; + sourceTree = ""; + }; + F47D9B5221B947C20033AAA4 /* buttons */ = { + isa = PBXGroup; + children = ( + F47D9B5321B947C20033AAA4 /* SPPlayCircleButton.swift */, + F47D9B5421B947C20033AAA4 /* SPSocialButton.swift */, + F47D9B5521B947C20033AAA4 /* SPDotsButton.swift */, + F47D9B5621B947C20033AAA4 /* SPSystemIconButton.swift */, + F47D9B5721B947C20033AAA4 /* SPNativeLargeButton.swift */, + F47D9B5821B947C20033AAA4 /* SPDownloadingButton.swift */, + F47D9B5921B947C20033AAA4 /* SPButton.swift */, + F47D9B5A21B947C20033AAA4 /* SPAppStoreActionButton.swift */, + F47D9B5B21B947C20033AAA4 /* SPAppleMusicButton.swift */, + ); + path = buttons; + sourceTree = ""; + }; + F47D9B5C21B947C20033AAA4 /* controllers */ = { + isa = PBXGroup; + children = ( + F47D9B5D21B947C20033AAA4 /* SPProposeViewController.swift */, + F47D9B5E21B947C20033AAA4 /* SPBaseTableViewController.swift */, + F47D9B5F21B947C20033AAA4 /* SPBaseViewController.swift */, + F47D9B6021B947C20033AAA4 /* SPWelcomeViewController.swift */, + F47D9B6121B947C20033AAA4 /* SPConfirmActionViewController.swift */, + F47D9B6221B947C20033AAA4 /* SPNativeTableViewController.swift */, + F47D9B6321B947C20033AAA4 /* SPStatusBarManagerViewController.swift */, + F47D9B6421B947C20033AAA4 /* login */, + ); + path = controllers; + sourceTree = ""; + }; + F47D9B6421B947C20033AAA4 /* login */ = { + isa = PBXGroup; + children = ( + F47D9B6521B947C20033AAA4 /* SPNativeLoginCodeViewController.swift */, + F47D9B6621B947C20033AAA4 /* SPNativeLoginNavigationController.swift */, + F47D9B6721B947C20033AAA4 /* SPNativeLoginViewController.swift */, + ); + path = login; + sourceTree = ""; + }; + F47D9B6821B947C20033AAA4 /* views */ = { + isa = PBXGroup; + children = ( + F47D9B6921B947C20033AAA4 /* SPImageView.swift */, + F47D9B6A21B947C20033AAA4 /* SPScrollView.swift */, + F47D9B6B21B947C20033AAA4 /* collection */, + F47D9B7721B947C20033AAA4 /* SPFakeBarView.swift */, + F47D9B7821B947C20033AAA4 /* code-draw */, + F47D9B7D21B947C20033AAA4 /* SPTextField.swift */, + F47D9B7E21B947C20033AAA4 /* SPGradeBlurView.swift */, + F47D9B7F21B947C20033AAA4 /* SPDownloadingUIImageView.swift */, + F47D9B8021B947C20033AAA4 /* SPView.swift */, + F47D9B8121B947C20033AAA4 /* SPGradientView.swift */, + F47D9B8221B947C20033AAA4 /* table */, + F47D9B9621B947C20033AAA4 /* SPVideoPlayer.swift */, + F47D9B9721B947C20033AAA4 /* SPLabel.swift */, + F47D9B9821B947C20033AAA4 /* SPBlurView.swift */, + ); + path = views; + sourceTree = ""; + }; + F47D9B6B21B947C20033AAA4 /* collection */ = { + isa = PBXGroup; + children = ( + F47D9B6C21B947C20033AAA4 /* layout */, + F47D9B6E21B947C20033AAA4 /* cell */, + F47D9B7321B947C20033AAA4 /* view */, + ); + path = collection; + sourceTree = ""; + }; + F47D9B6C21B947C20033AAA4 /* layout */ = { + isa = PBXGroup; + children = ( + F47D9B6D21B947C20033AAA4 /* SPCollectionViewLayout.swift */, + ); + path = layout; + sourceTree = ""; + }; + F47D9B6E21B947C20033AAA4 /* cell */ = { + isa = PBXGroup; + children = ( + F47D9B6F21B947C20033AAA4 /* SPCollectionViewCell.swift */, + F47D9B7021B947C20033AAA4 /* SPMengTransformCollectionViewCell.swift */, + F47D9B7121B947C20033AAA4 /* SPCollectionContainerCell.swift */, + F47D9B7221B947C20033AAA4 /* SPImageCollectionViewCell.swift */, + ); + path = cell; + sourceTree = ""; + }; + F47D9B7321B947C20033AAA4 /* view */ = { + isa = PBXGroup; + children = ( + F47D9B7421B947C20033AAA4 /* SPMengTransformCollectionView.swift */, + F47D9B7521B947C20033AAA4 /* SPCollectionView.swift */, + F47D9B7621B947C20033AAA4 /* SPImagesLineCollectionView.swift */, + ); + path = view; + sourceTree = ""; + }; + F47D9B7821B947C20033AAA4 /* code-draw */ = { + isa = PBXGroup; + children = ( + F47D9B7921B947C20033AAA4 /* SPAudioIconView.swift */, + F47D9B7A21B947C20033AAA4 /* SPSocialIconView.swift */, + F47D9B7B21B947C20033AAA4 /* SPSystemIconView.swift */, + F47D9B7C21B947C20033AAA4 /* SPGolubevIconView.swift */, + ); + path = "code-draw"; + sourceTree = ""; + }; + F47D9B8221B947C20033AAA4 /* table */ = { + isa = PBXGroup; + children = ( + F47D9B8321B947C20033AAA4 /* SPEmptyProposeLabel.swift */, + F47D9B8421B947C20033AAA4 /* SPTableView.swift */, + F47D9B8521B947C20033AAA4 /* SPEmptyProposeView.swift */, + F47D9B8621B947C20033AAA4 /* cell */, + ); + path = table; + sourceTree = ""; + }; + F47D9B8621B947C20033AAA4 /* cell */ = { + isa = PBXGroup; + children = ( + F47D9B8721B947C20033AAA4 /* SPPromoTableViewCell.swift */, + F47D9B8821B947C20033AAA4 /* form */, + F47D9B9021B947C20033AAA4 /* SPMengTransformTableViewCell.swift */, + F47D9B9121B947C20033AAA4 /* SPImageTableViewCell.swift */, + F47D9B9221B947C20033AAA4 /* SPProposeTableViewCell.swift */, + F47D9B9321B947C20033AAA4 /* SPBaseContentTableViewCell.swift */, + F47D9B9421B947C20033AAA4 /* SPTableViewCell.swift */, + F47D9B9521B947C20033AAA4 /* SPCollectionImagesTableViewCell.swift */, + ); + path = cell; + sourceTree = ""; + }; + F47D9B8821B947C20033AAA4 /* form */ = { + isa = PBXGroup; + children = ( + F47D9B8921B947C20033AAA4 /* SPFormButtonTableViewCell.swift */, + F47D9B8A21B947C20033AAA4 /* SPFormMailTableViewCell.swift */, + F47D9B8B21B947C20033AAA4 /* SPFormLabelTableViewCell.swift */, + F47D9B8C21B947C20033AAA4 /* SPFormTextFiledTableViewCell.swift */, + F47D9B8D21B947C20033AAA4 /* SPFormFeaturedTitleTableViewCell.swift */, + F47D9B8E21B947C20033AAA4 /* SPFormTextInputTableViewCell.swift */, + F47D9B8F21B947C20033AAA4 /* SPFormTextTableViewCell.swift */, + ); + path = form; + sourceTree = ""; + }; + F47D9B9921B947C20033AAA4 /* style-kit */ = { + isa = PBXGroup; + children = ( + F47D9B9A21B947C20033AAA4 /* SPNativeStyleKit.swift */, + ); + path = "style-kit"; + sourceTree = ""; + }; + F47D9B9B21B947C20033AAA4 /* types */ = { + isa = PBXGroup; + children = ( + F47D9B9C21B947C20033AAA4 /* SPTypes.swift */, + ); + path = types; + sourceTree = ""; + }; + F47D9B9D21B947C20033AAA4 /* locale */ = { + isa = PBXGroup; + children = ( + F47D9B9E21B947C20033AAA4 /* SPLocale.swift */, + ); + path = locale; + sourceTree = ""; + }; + F47D9B9F21B947C20033AAA4 /* extension */ = { + isa = PBXGroup; + children = ( + F47D9BA021B947C20033AAA4 /* SPUIAlertControllerExtenshion.swift */, + F47D9BA121B947C20033AAA4 /* SPUITableViewCellExtenshion.swift */, + F47D9BA221B947C20033AAA4 /* SPUITextFieldExtenshion.swift */, + F47D9BA321B947C20033AAA4 /* SPUIFontExtenshion.swift */, + F47D9BA421B947C20033AAA4 /* SPUIImageExtension.swift */, + F47D9BA521B947C20033AAA4 /* SPUITableView.swift */, + F47D9BA621B947C20033AAA4 /* SPUIViewExtenshion.swift */, + F47D9BA721B947C20033AAA4 /* SPArrayExtension.swift */, + F47D9BA821B947C20033AAA4 /* SPUserDefaultsExtenshion.swift */, + F47D9BA921B947C20033AAA4 /* SPUIViewControllerExtenshion.swift */, + F47D9BAA21B947C20033AAA4 /* SPStringExtenshion.swift */, + F47D9BAB21B947C20033AAA4 /* SPStrideableExtension.swift */, + F47D9BAC21B947C20033AAA4 /* SPUIVisualEffectViewExtenshion.swift */, + F47D9BAD21B947C20033AAA4 /* SPUICollectionViewExtenshion.swift */, + F47D9BAE21B947C20033AAA4 /* SPTextFieldExtenshion.swift */, + F47D9BAF21B947C20033AAA4 /* SPUITabBarControllerExtenshion.swift */, + F47D9BB021B947C20033AAA4 /* SPUINavigationControllerExtenshion.swift */, + F47D9BB121B947C20033AAA4 /* SPCGRectExtension.swift */, + F47D9BB221B947C20033AAA4 /* SPUILabelExtenshion.swift */, + F47D9BB321B947C20033AAA4 /* SPCGSizeExtenshion.swift */, + F47D9BB421B947C20033AAA4 /* SPUIImageViewExtenshion.swift */, + F47D9BB521B947C20033AAA4 /* SPUIColorExtension.swift */, + F47D9BB621B947C20033AAA4 /* SPUIButtonExtenshion.swift */, + ); + path = extension; + sourceTree = ""; + }; + F47D9BB721B947C20033AAA4 /* app */ = { + isa = PBXGroup; + children = ( + F47D9BB821B947C20033AAA4 /* SPApp.swift */, + ); + path = app; + sourceTree = ""; + }; + F47D9BB921B947C20033AAA4 /* constraints */ = { + isa = PBXGroup; + children = ( + F47D9BBA21B947C20033AAA4 /* SPConstraints.swift */, + ); + path = constraints; + sourceTree = ""; + }; + F47D9BBB21B947C20033AAA4 /* notification */ = { + isa = PBXGroup; + children = ( + F47D9BBC21B947C20033AAA4 /* SPLocalNotification.swift */, + ); + path = notification; + sourceTree = ""; + }; + F47D9BBD21B947C20033AAA4 /* mail */ = { + isa = PBXGroup; + children = ( + F47D9BBE21B947C20033AAA4 /* SPMail.swift */, + ); + path = mail; + sourceTree = ""; + }; + F47D9BBF21B947C20033AAA4 /* launch */ = { + isa = PBXGroup; + children = ( + F47D9BC021B947C20033AAA4 /* SPLaunch.swift */, + ); + path = launch; + sourceTree = ""; + }; + F47D9BC121B947C20033AAA4 /* layout */ = { + isa = PBXGroup; + children = ( + F47D9BC221B947C20033AAA4 /* SPLayout.swift */, + ); + path = layout; + sourceTree = ""; + }; + F47D9BC321B947C20033AAA4 /* shadow */ = { + isa = PBXGroup; + children = ( + F47D9BC421B947C20033AAA4 /* SPShadow.swift */, + F47D9BC521B947C20033AAA4 /* SPShadowDeep.swift */, + ); + path = shadow; + sourceTree = ""; + }; + F47D9BC621B947C20033AAA4 /* code-draw */ = { + isa = PBXGroup; + children = ( + F47D9BC721B947C20033AAA4 /* SPCodeAudioIconPack.swift */, + F47D9BC821B947C20033AAA4 /* SPCodeSocialIconPack.swift */, + F47D9BC921B947C20033AAA4 /* SPCodeSystemIconPack.swift */, + F47D9BCA21B947C20033AAA4 /* SPCodeDraw.swift */, + F47D9BCB21B947C20033AAA4 /* SPGolubevGolubevIconPack.swift */, + ); + path = "code-draw"; + sourceTree = ""; + }; + F47D9BCC21B947C20033AAA4 /* animation */ = { + isa = PBXGroup; + children = ( + F47D9BCD21B947C20033AAA4 /* SPAnimationUpward.swift */, + F47D9BCE21B947C20033AAA4 /* SPAnimationSpring.swift */, + F47D9BCF21B947C20033AAA4 /* SPAnimationAlpha.swift */, + F47D9BD021B947C20033AAA4 /* SPAnimation.swift */, + ); + path = animation; + sourceTree = ""; + }; + F47D9BD121B947C20033AAA4 /* downloader */ = { + isa = PBXGroup; + children = ( + F47D9BD221B947C20033AAA4 /* SPDownloader.swift */, + ); + path = downloader; + sourceTree = ""; + }; + F47D9BD321B947C20033AAA4 /* app-store */ = { + isa = PBXGroup; + children = ( + F47D9BD421B947C20033AAA4 /* SPAppStore.swift */, + ); + path = "app-store"; + sourceTree = ""; + }; + F47D9BD521B947C20033AAA4 /* opener */ = { + isa = PBXGroup; + children = ( + F47D9BD621B947C20033AAA4 /* SPOpener.swift */, + ); + path = opener; + sourceTree = ""; + }; + F47D9BD721B947C20033AAA4 /* bufer */ = { + isa = PBXGroup; + children = ( + F47D9BD821B947C20033AAA4 /* SPBufer.swift */, + ); + path = bufer; + sourceTree = ""; + }; + F47D9BD921B947C20033AAA4 /* social */ = { + isa = PBXGroup; + children = ( + F47D9BDA21B947C20033AAA4 /* twitter */, + F47D9BDC21B947C20033AAA4 /* viber */, + F47D9BDE21B947C20033AAA4 /* telegram */, + F47D9BE021B947C20033AAA4 /* instagram */, + F47D9BE221B947C20033AAA4 /* whatsapp */, + ); + path = social; + sourceTree = ""; + }; + F47D9BDA21B947C20033AAA4 /* twitter */ = { + isa = PBXGroup; + children = ( + F47D9BDB21B947C20033AAA4 /* SPTwitter.swift */, + ); + path = twitter; + sourceTree = ""; + }; + F47D9BDC21B947C20033AAA4 /* viber */ = { + isa = PBXGroup; + children = ( + F47D9BDD21B947C20033AAA4 /* SPViber.swift */, + ); + path = viber; + sourceTree = ""; + }; + F47D9BDE21B947C20033AAA4 /* telegram */ = { + isa = PBXGroup; + children = ( + F47D9BDF21B947C20033AAA4 /* SPTelegram.swift */, + ); + path = telegram; + sourceTree = ""; + }; + F47D9BE021B947C20033AAA4 /* instagram */ = { + isa = PBXGroup; + children = ( + F47D9BE121B947C20033AAA4 /* SPInstagram.swift */, + ); + path = instagram; + sourceTree = ""; + }; + F47D9BE221B947C20033AAA4 /* whatsapp */ = { + isa = PBXGroup; + children = ( + F47D9BE321B947C20033AAA4 /* SPWhatsApp.swift */, + ); + path = whatsapp; + sourceTree = ""; + }; + F47D9BE421B947C20033AAA4 /* audio */ = { + isa = PBXGroup; + children = ( + F47D9BE521B947C20033AAA4 /* SPAudio.swift */, + F47D9BE621B947C20033AAA4 /* SPAudioPlayer.swift */, + ); + path = audio; + sourceTree = ""; + }; + F47D9BE721B947C20033AAA4 /* device */ = { + isa = PBXGroup; + children = ( + F47D9BE821B947C20033AAA4 /* SPDevice.swift */, + ); + path = device; + sourceTree = ""; + }; + F47D9BE921B947C20033AAA4 /* сore-spotlight */ = { + isa = PBXGroup; + children = ( + F47D9BEA21B947C20033AAA4 /* SPSpotlight.swift */, + ); + path = "сore-spotlight"; + sourceTree = ""; + }; + F47D9BEB21B947C20033AAA4 /* random */ = { + isa = PBXGroup; + children = ( + F47D9BEC21B947C20033AAA4 /* SPRandom.swift */, + ); + path = random; + sourceTree = ""; + }; + F47D9BED21B947C20033AAA4 /* delay */ = { + isa = PBXGroup; + children = ( + F47D9BEE21B947C20033AAA4 /* SPDelay.swift */, + ); + path = delay; + sourceTree = ""; + }; + F47D9BEF21B947C20033AAA4 /* permission */ = { + isa = PBXGroup; + children = ( + F47D9BF021B947C20033AAA4 /* dialog */, + F47D9BF421B947C20033AAA4 /* SPPermission.swift */, + F47D9BF521B947C20033AAA4 /* handlers */, + ); + path = permission; + sourceTree = ""; + }; + F47D9BF021B947C20033AAA4 /* dialog */ = { + isa = PBXGroup; + children = ( + F47D9BF121B947C20033AAA4 /* SPPermissionDialogView.swift */, + F47D9BF221B947C20033AAA4 /* SPPermissionDialog.swift */, + F47D9BF321B947C20033AAA4 /* SPPermissionDialogController.swift */, + ); + path = dialog; + sourceTree = ""; + }; + F47D9BF521B947C20033AAA4 /* handlers */ = { + isa = PBXGroup; + children = ( + F47D9BF621B947C20033AAA4 /* SPRequestPermissionLocationHandler.swift */, + ); + path = handlers; + sourceTree = ""; + }; + F47D9BF721B947C20033AAA4 /* share */ = { + isa = PBXGroup; + children = ( + F47D9BF821B947C20033AAA4 /* SPShare.swift */, + ); + path = share; + sourceTree = ""; + }; + F47D9BF921B947C20033AAA4 /* badge */ = { + isa = PBXGroup; + children = ( + F47D9BFA21B947C20033AAA4 /* SPBadge.swift */, + ); + path = badge; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -963,148 +936,139 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - F42A79F921B1AD6800B6200F /* SPWelcomeViewController.swift in Sources */, - F42A7A6521B1AD6800B6200F /* SPTelegram.swift in Sources */, - F42A79FC21B1AD6800B6200F /* SPNativeTableViewController.swift in Sources */, - F42A7A3021B1AD6800B6200F /* SPUIAlertControllerExtenshion.swift in Sources */, - F42A7A5921B1AD6800B6200F /* SPCodeDraw.swift in Sources */, - F42A7A2C21B1AD6800B6200F /* SPNativeStyleKit.swift in Sources */, - F42A7A0A21B1AD6800B6200F /* SPScrollView.swift in Sources */, - F42A7A0421B1AD6800B6200F /* SPStorkPresentationController.swift in Sources */, - F42A79F821B1AD6800B6200F /* SPBaseViewController.swift in Sources */, - F42A7A2621B1AD6800B6200F /* SPProposeTableViewCell.swift in Sources */, - F42A7A4021B1AD6800B6200F /* SPUICollectionViewExtenshion.swift in Sources */, - F42A7A7221B1AD6800B6200F /* SPRequestPermissionLocationHandler.swift in Sources */, - F42A7A1E21B1AD6800B6200F /* SPFormMailTableViewCell.swift in Sources */, - F42A7A3321B1AD6800B6200F /* SPUIFontExtenshion.swift in Sources */, - F42A7A0721B1AD6800B6200F /* SPEmptyProposeLabel.swift in Sources */, - F42A7A1121B1AD6800B6200F /* SPCollectionView.swift in Sources */, - F42A7A3D21B1AD6800B6200F /* SPStrideableExtension.swift in Sources */, - F42A7A4321B1AD6800B6200F /* SPUITabBarControllerExtenshion.swift in Sources */, - F42A7A0D21B1AD6800B6200F /* SPMengTransformCollectionViewCell.swift in Sources */, - F42A7A5821B1AD6800B6200F /* SPCodeSystemIconPack.swift in Sources */, - F42A79EE21B1AD6800B6200F /* SPSystemIconButton.swift in Sources */, - F42A7A1D21B1AD6800B6200F /* SPFormButtonTableViewCell.swift in Sources */, - F42A7A5121B1AD6800B6200F /* SPMail.swift in Sources */, - F42A7A4E21B1AD6800B6200F /* SPApp.swift in Sources */, - F42A7A1421B1AD6800B6200F /* SPAudioIconView.swift in Sources */, - F42A79ED21B1AD6800B6200F /* SPMengButton.swift in Sources */, - F42A79F221B1AD6800B6200F /* SPGradientButton.swift in Sources */, - F42A79F721B1AD6800B6200F /* SPBaseTableViewController.swift in Sources */, - F42A79FE21B1AD6800B6200F /* SPStatusBarManagerViewController.swift in Sources */, - F42A7A1821B1AD6800B6200F /* SPGradeBlurView.swift in Sources */, - F42A7A0321B1AD6800B6200F /* SPStorkPresentingAnimationController.swift in Sources */, - F42A7A5B21B1AD6800B6200F /* SPAnimationUpward.swift in Sources */, - F42A7A3C21B1AD6800B6200F /* SPStringExtenshion.swift in Sources */, - F42A7A2321B1AD6800B6200F /* SPFormTextTableViewCell.swift in Sources */, - F42A7A3E21B1AD6800B6200F /* SPUIVisualEffectViewExtenshion.swift in Sources */, - F42A7A7321B1AD6800B6200F /* SPShare.swift in Sources */, - F42A7A2121B1AD6800B6200F /* SPFormFeaturedTitleTableViewCell.swift in Sources */, - F42A7A1C21B1AD6800B6200F /* SPPromoTableViewCell.swift in Sources */, - F42A7A6B21B1AD6800B6200F /* SPSpotlight.swift in Sources */, - F42A7A2921B1AD6800B6200F /* SPCollectionImagesTableViewCell.swift in Sources */, - F42A79FD21B1AD6800B6200F /* SPHiderViewController.swift in Sources */, - F42A7A4D21B1AD6800B6200F /* SPUIDeviceExtenshion.swift in Sources */, - F42A7A0C21B1AD6800B6200F /* SPCollectionViewCell.swift in Sources */, - F42A7A7021B1AD6800B6200F /* SPPermissionDialogController.swift in Sources */, - F42A7A0121B1AD6800B6200F /* SPNativeLoginViewController.swift in Sources */, + F47D9C6321B947C30033AAA4 /* SPAppStore.swift in Sources */, + F47D9C0121B947C30033AAA4 /* SPDownloadingButton.swift in Sources */, + F47D9C2121B947C30033AAA4 /* SPView.swift in Sources */, + F47D9B4A21B947A20033AAA4 /* SPStorkController.swift in Sources */, + F47D9C1921B947C30033AAA4 /* SPFakeBarView.swift in Sources */, + F47D9C1121B947C30033AAA4 /* SPCollectionViewLayout.swift in Sources */, + F47D9C5421B947C30033AAA4 /* SPMail.swift in Sources */, + F47D9C0E21B947C30033AAA4 /* SPNativeLoginViewController.swift in Sources */, + F47D9C2D21B947C30033AAA4 /* SPFormTextTableViewCell.swift in Sources */, + F47D9C6E21B947C30033AAA4 /* SPSpotlight.swift in Sources */, + F47D9B4C21B947A20033AAA4 /* SPStorkDismissingAnimationController.swift in Sources */, + F47D9C4321B947C30033AAA4 /* SPUIViewControllerExtenshion.swift in Sources */, + F47D9C0521B947C30033AAA4 /* SPProposeViewController.swift in Sources */, + F47D9C7721B947C30033AAA4 /* SPBadge.swift in Sources */, + F47D9C6D21B947C30033AAA4 /* SPDevice.swift in Sources */, + F47D9C3421B947C30033AAA4 /* SPVideoPlayer.swift in Sources */, + F47D9C7221B947C30033AAA4 /* SPPermissionDialog.swift in Sources */, + F47D9C1421B947C30033AAA4 /* SPCollectionContainerCell.swift in Sources */, + F47D9C4E21B947C30033AAA4 /* SPUIImageViewExtenshion.swift in Sources */, + F47D9C6021B947C30033AAA4 /* SPAnimationAlpha.swift in Sources */, + F47D9C0B21B947C30033AAA4 /* SPStatusBarManagerViewController.swift in Sources */, + F47D9C3721B947C30033AAA4 /* SPNativeStyleKit.swift in Sources */, + F47D9C4C21B947C30033AAA4 /* SPUILabelExtenshion.swift in Sources */, F445CA8921AED92600184254 /* ViewController.swift in Sources */, - F42A7A4421B1AD6800B6200F /* SPUINavigationControllerExtenshion.swift in Sources */, - F42A7A5521B1AD6800B6200F /* SPShadowDeep.swift in Sources */, - F42A7A6921B1AD6800B6200F /* SPAudioPlayer.swift in Sources */, - F42A7A3421B1AD6800B6200F /* SPUIImageExtension.swift in Sources */, - F42A7A3521B1AD6800B6200F /* SPDateExtenshon.swift in Sources */, - F42A7A4521B1AD6800B6200F /* SPCGRectExtension.swift in Sources */, - F42A7A0821B1AD6800B6200F /* SPTableView.swift in Sources */, - F42A7A0221B1AD6800B6200F /* SPStorkTransitioningDelegate.swift in Sources */, - F42A7A3221B1AD6800B6200F /* SPUITextFieldExtenshion.swift in Sources */, - F42A7A5A21B1AD6800B6200F /* SPGolubevGolubevIconPack.swift in Sources */, - F42A7A4221B1AD6800B6200F /* SPTextFieldExtenshion.swift in Sources */, - F42A7A6E21B1AD6800B6200F /* SPPermissionDialogView.swift in Sources */, - F42A7A4121B1AD6800B6200F /* SPUITableViewControllerExtenshion.swift in Sources */, - F42A7A6621B1AD6800B6200F /* SPInstagram.swift in Sources */, - F42A79EB21B1AD6800B6200F /* SPPlayCircleButton.swift in Sources */, - F42A7A6321B1AD6800B6200F /* SPTwitter.swift in Sources */, - F42A7A7421B1AD6800B6200F /* SPBadge.swift in Sources */, - F42A79F121B1AD6800B6200F /* SPNativeOS11Button.swift in Sources */, - F42A7A1921B1AD6800B6200F /* SPDownloadingUIImageView.swift in Sources */, - F42A79F421B1AD6800B6200F /* SPProposeViewController.swift in Sources */, - F42A7A5321B1AD6800B6200F /* SPLayout.swift in Sources */, - F42A7A5221B1AD6800B6200F /* SPLaunch.swift in Sources */, - F42A7A6021B1AD6800B6200F /* SPAppStore.swift in Sources */, - F42A7A0521B1AD6800B6200F /* SPStorkIndicatorView.swift in Sources */, - F42A7A6D21B1AD6800B6200F /* SPDelay.swift in Sources */, - F42A7A6821B1AD6800B6200F /* SPAudio.swift in Sources */, - F42A7A2A21B1AD6800B6200F /* SPBlurView.swift in Sources */, - F42A7A3921B1AD6800B6200F /* SPArrayExtension.swift in Sources */, - F42A7A6421B1AD6800B6200F /* SPViber.swift in Sources */, - F42A7A4621B1AD6800B6200F /* SPUIWindowExtenshion.swift in Sources */, - F42A7A1B21B1AD6800B6200F /* SPVideoPlayer.swift in Sources */, - F42A7A5021B1AD6800B6200F /* SPLocalNotification.swift in Sources */, - F42A7A0B21B1AD6800B6200F /* SPFakeBarView.swift in Sources */, - F42A7A3A21B1AD6800B6200F /* SPUserDefaultsExtenshion.swift in Sources */, - F42A79EA21B1AD6800B6200F /* SPVibration.swift in Sources */, - F42A7A1221B1AD6800B6200F /* SPImagesLineCollectionView.swift in Sources */, - F42A7A1521B1AD6800B6200F /* SPSocialIconView.swift in Sources */, - F42A79FA21B1AD6800B6200F /* SPRootViewController.swift in Sources */, - F42A79F621B1AD6800B6200F /* SPScrollViewController.swift in Sources */, - F42A7A0921B1AD6800B6200F /* SPEmptyProposeView.swift in Sources */, - F42A7A2721B1AD6800B6200F /* SPBaseContentTableViewCell.swift in Sources */, - F42A7A4B21B1AD6800B6200F /* SPCollectionExtenshion.swift in Sources */, - F42A7A2421B1AD6800B6200F /* SPMengTransformTableViewCell.swift in Sources */, - F42A7A7121B1AD6800B6200F /* SPPermission.swift in Sources */, - F42A7A2021B1AD6800B6200F /* SPFormTextFiledTableViewCell.swift in Sources */, - F42A7A5D21B1AD6800B6200F /* SPAnimationAlpha.swift in Sources */, - F42A79FF21B1AD6800B6200F /* SPNativeLoginCodeViewController.swift in Sources */, - F42A7A2F21B1AD6800B6200F /* SPUIScreenExtension.swift in Sources */, - F42A7A6C21B1AD6800B6200F /* SPRandom.swift in Sources */, + F47D9C3521B947C30033AAA4 /* SPLabel.swift in Sources */, + F47D9B4721B947A20033AAA4 /* SPStorkTransitioningDelegate.swift in Sources */, + F47D9C2621B947C30033AAA4 /* SPPromoTableViewCell.swift in Sources */, + F47D9C0C21B947C30033AAA4 /* SPNativeLoginCodeViewController.swift in Sources */, + F47D9C6621B947C30033AAA4 /* SPTwitter.swift in Sources */, + F47D9C6821B947C30033AAA4 /* SPTelegram.swift in Sources */, + F47D9C5621B947C30033AAA4 /* SPLayout.swift in Sources */, + F47D9C3821B947C30033AAA4 /* SPTypes.swift in Sources */, + F47D9C7121B947C30033AAA4 /* SPPermissionDialogView.swift in Sources */, + F47D9BFD21B947C30033AAA4 /* SPSocialButton.swift in Sources */, + F47D9C6921B947C30033AAA4 /* SPInstagram.swift in Sources */, + F47D9C5B21B947C30033AAA4 /* SPCodeSystemIconPack.swift in Sources */, + F47D9C5321B947C30033AAA4 /* SPLocalNotification.swift in Sources */, + F47D9C5021B947C30033AAA4 /* SPUIButtonExtenshion.swift in Sources */, + F47D9C6B21B947C30033AAA4 /* SPAudio.swift in Sources */, + F47D9C0621B947C30033AAA4 /* SPBaseTableViewController.swift in Sources */, + F47D9C1F21B947C30033AAA4 /* SPGradeBlurView.swift in Sources */, + F47D9C7021B947C30033AAA4 /* SPDelay.swift in Sources */, + F47D9C7421B947C30033AAA4 /* SPPermission.swift in Sources */, + F47D9C6C21B947C30033AAA4 /* SPAudioPlayer.swift in Sources */, + F47D9C2421B947C30033AAA4 /* SPTableView.swift in Sources */, + F47D9B4B21B947A20033AAA4 /* SPStorkIndicatorView.swift in Sources */, + F47D9C1821B947C30033AAA4 /* SPImagesLineCollectionView.swift in Sources */, + F47D9C0F21B947C30033AAA4 /* SPImageView.swift in Sources */, + F47D9C3221B947C30033AAA4 /* SPTableViewCell.swift in Sources */, + F47D9C5F21B947C30033AAA4 /* SPAnimationSpring.swift in Sources */, + F47D9C4D21B947C30033AAA4 /* SPCGSizeExtenshion.swift in Sources */, + F47D9C3121B947C30033AAA4 /* SPBaseContentTableViewCell.swift in Sources */, + F47D9C2821B947C30033AAA4 /* SPFormMailTableViewCell.swift in Sources */, + F47D9C1621B947C30033AAA4 /* SPMengTransformCollectionView.swift in Sources */, + F47D9C5C21B947C30033AAA4 /* SPCodeDraw.swift in Sources */, + F47D9C4821B947C30033AAA4 /* SPTextFieldExtenshion.swift in Sources */, + F47D9B4921B947A20033AAA4 /* SPStorkPresentationController.swift in Sources */, + F47D9C1321B947C30033AAA4 /* SPMengTransformCollectionViewCell.swift in Sources */, + F47D9C4F21B947C30033AAA4 /* SPUIColorExtension.swift in Sources */, + F47D9C4021B947C30033AAA4 /* SPUIViewExtenshion.swift in Sources */, + F47D9C6121B947C30033AAA4 /* SPAnimation.swift in Sources */, + F47D9C5D21B947C30033AAA4 /* SPGolubevGolubevIconPack.swift in Sources */, + F47D9C5521B947C30033AAA4 /* SPLaunch.swift in Sources */, + F47D9C1021B947C30033AAA4 /* SPScrollView.swift in Sources */, + F47D9C5721B947C30033AAA4 /* SPShadow.swift in Sources */, + F47D9C3321B947C30033AAA4 /* SPCollectionImagesTableViewCell.swift in Sources */, + F47D9C4521B947C30033AAA4 /* SPStrideableExtension.swift in Sources */, + F47D9C0821B947C30033AAA4 /* SPWelcomeViewController.swift in Sources */, + F47D9C0221B947C30033AAA4 /* SPButton.swift in Sources */, + F47D9C3621B947C30033AAA4 /* SPBlurView.swift in Sources */, + F47D9C6521B947C30033AAA4 /* SPBufer.swift in Sources */, + F47D9C4921B947C30033AAA4 /* SPUITabBarControllerExtenshion.swift in Sources */, + F47D9C2721B947C30033AAA4 /* SPFormButtonTableViewCell.swift in Sources */, + F47D9C4421B947C30033AAA4 /* SPStringExtenshion.swift in Sources */, + F47D9C6721B947C30033AAA4 /* SPViber.swift in Sources */, + F47D9C7621B947C30033AAA4 /* SPShare.swift in Sources */, + F47D9BFC21B947C30033AAA4 /* SPPlayCircleButton.swift in Sources */, + F47D9C2C21B947C30033AAA4 /* SPFormTextInputTableViewCell.swift in Sources */, + F47D9C1E21B947C30033AAA4 /* SPTextField.swift in Sources */, + F47D9C7521B947C30033AAA4 /* SPRequestPermissionLocationHandler.swift in Sources */, + F47D9C6221B947C30033AAA4 /* SPDownloader.swift in Sources */, + F47D9C2B21B947C30033AAA4 /* SPFormFeaturedTitleTableViewCell.swift in Sources */, + F47D9C2021B947C30033AAA4 /* SPDownloadingUIImageView.swift in Sources */, + F47D9C3921B947C30033AAA4 /* SPLocale.swift in Sources */, + F47D9C5821B947C30033AAA4 /* SPShadowDeep.swift in Sources */, + F47D9C5921B947C30033AAA4 /* SPCodeAudioIconPack.swift in Sources */, + F47D9C2921B947C30033AAA4 /* SPFormLabelTableViewCell.swift in Sources */, + F47D9C4621B947C30033AAA4 /* SPUIVisualEffectViewExtenshion.swift in Sources */, + F47D9C1521B947C30033AAA4 /* SPImageCollectionViewCell.swift in Sources */, + F47D9C6F21B947C30033AAA4 /* SPRandom.swift in Sources */, + F47D9C7321B947C30033AAA4 /* SPPermissionDialogController.swift in Sources */, + F47D9C2521B947C30033AAA4 /* SPEmptyProposeView.swift in Sources */, + F47D9C4121B947C30033AAA4 /* SPArrayExtension.swift in Sources */, + F47D9C1A21B947C30033AAA4 /* SPAudioIconView.swift in Sources */, + F47D9C3F21B947C30033AAA4 /* SPUITableView.swift in Sources */, + F47D9C0321B947C30033AAA4 /* SPAppStoreActionButton.swift in Sources */, + F47D9BFF21B947C30033AAA4 /* SPSystemIconButton.swift in Sources */, + F47D9C1D21B947C30033AAA4 /* SPGolubevIconView.swift in Sources */, + F47D9C0A21B947C30033AAA4 /* SPNativeTableViewController.swift in Sources */, + F47D9C3E21B947C30033AAA4 /* SPUIImageExtension.swift in Sources */, + F47D9C4221B947C30033AAA4 /* SPUserDefaultsExtenshion.swift in Sources */, + F47D9C0021B947C30033AAA4 /* SPNativeLargeButton.swift in Sources */, + F47D9B4821B947A20033AAA4 /* SPStorkPresentingAnimationController.swift in Sources */, + F47D9BFB21B947C30033AAA4 /* SPVibration.swift in Sources */, + F47D9C0921B947C30033AAA4 /* SPConfirmActionViewController.swift in Sources */, + F47D9C3A21B947C30033AAA4 /* SPUIAlertControllerExtenshion.swift in Sources */, + F47D9C5221B947C30033AAA4 /* SPConstraints.swift in Sources */, + F47D9C0421B947C30033AAA4 /* SPAppleMusicButton.swift in Sources */, + F47D9C4B21B947C30033AAA4 /* SPCGRectExtension.swift in Sources */, + F47D9C1721B947C30033AAA4 /* SPCollectionView.swift in Sources */, + F47D9C4721B947C30033AAA4 /* SPUICollectionViewExtenshion.swift in Sources */, + F47D9C3C21B947C30033AAA4 /* SPUITextFieldExtenshion.swift in Sources */, + F47D9C5A21B947C30033AAA4 /* SPCodeSocialIconPack.swift in Sources */, + F47D9C1B21B947C30033AAA4 /* SPSocialIconView.swift in Sources */, + F47D9C2E21B947C30033AAA4 /* SPMengTransformTableViewCell.swift in Sources */, + F47D9C5E21B947C30033AAA4 /* SPAnimationUpward.swift in Sources */, + F47D9C2F21B947C30033AAA4 /* SPImageTableViewCell.swift in Sources */, + F47D9C0D21B947C30033AAA4 /* SPNativeLoginNavigationController.swift in Sources */, + F47D9C5121B947C30033AAA4 /* SPApp.swift in Sources */, + F47D9C2A21B947C30033AAA4 /* SPFormTextFiledTableViewCell.swift in Sources */, + F47D9C2321B947C30033AAA4 /* SPEmptyProposeLabel.swift in Sources */, + F47D9C3021B947C30033AAA4 /* SPProposeTableViewCell.swift in Sources */, + F47D9C0721B947C30033AAA4 /* SPBaseViewController.swift in Sources */, + F47D9C2221B947C30033AAA4 /* SPGradientView.swift in Sources */, + F47D9BFE21B947C30033AAA4 /* SPDotsButton.swift in Sources */, + F47D9C1C21B947C30033AAA4 /* SPSystemIconView.swift in Sources */, F445CA8721AED92600184254 /* AppDelegate.swift in Sources */, - F42A7A2821B1AD6800B6200F /* SPTableViewCell.swift in Sources */, - F42A7A5621B1AD6800B6200F /* SPCodeAudioIconPack.swift in Sources */, - F42A7A4A21B1AD6800B6200F /* SPUIColorExtension.swift in Sources */, - F42A7A3F21B1AD6800B6200F /* SPBezierPathExtension.swift in Sources */, - F42A7A3721B1AD6800B6200F /* SPUIViewExtenshion.swift in Sources */, - F42A79F321B1AD6800B6200F /* SPAppStoreActionButton.swift in Sources */, - F42A7A0F21B1AD6800B6200F /* SPCollectionViewLayout.swift in Sources */, - F42A7A0E21B1AD6800B6200F /* SPImageCollectionViewCell.swift in Sources */, - F42A7A5721B1AD6800B6200F /* SPCodeSocialIconPack.swift in Sources */, - F42A7A6A21B1AD6800B6200F /* SPDevice.swift in Sources */, - F42A7A5C21B1AD6800B6200F /* SPAnimationSpring.swift in Sources */, - F42A7A1A21B1AD6800B6200F /* SPGradientView.swift in Sources */, - F42A7A1721B1AD6800B6200F /* SPGolubevIconView.swift in Sources */, - F42A7A1021B1AD6800B6200F /* SPMengTransformCollectionView.swift in Sources */, - F42A7A6121B1AD6800B6200F /* SPOpener.swift in Sources */, - F42A7A0021B1AD6800B6200F /* SPNativeLoginNavigationController.swift in Sources */, - F42A7A1321B1AD6800B6200F /* SPAligmentView.swift in Sources */, - F42A7A0621B1AD6800B6200F /* SPStorkDismissingAnimationController.swift in Sources */, - F42A7A4921B1AD6800B6200F /* SPUIImageViewExtenshion.swift in Sources */, - F42A7A6F21B1AD6800B6200F /* SPPermissionDialog.swift in Sources */, - F42A79EF21B1AD6800B6200F /* SPDownloadingButton.swift in Sources */, - F42A7A3621B1AD6800B6200F /* SPUITableView.swift in Sources */, - F42A7A3821B1AD6800B6200F /* SPCGPointExtenshion.swift in Sources */, - F42A7A4C21B1AD6800B6200F /* SPUIButtonExtenshion.swift in Sources */, - F42A7A3B21B1AD6800B6200F /* SPUIViewControllerExtenshion.swift in Sources */, - F42A7A2221B1AD6800B6200F /* SPFormTextInputTableViewCell.swift in Sources */, - F42A7A6721B1AD6800B6200F /* SPWhatsApp.swift in Sources */, - F42A7A4F21B1AD6800B6200F /* SPConstraintsAssistent.swift in Sources */, - F42A7A2521B1AD6800B6200F /* SPImageTableViewCell.swift in Sources */, - F42A79F521B1AD6800B6200F /* SPProgressLoadingViewController.swift in Sources */, - F42A79F021B1AD6800B6200F /* SPRoundButton.swift in Sources */, - F42A7A1F21B1AD6800B6200F /* SPFormLabelTableViewCell.swift in Sources */, - F42A79FB21B1AD6800B6200F /* SPConfirmActionViewController.swift in Sources */, - F42A7A5F21B1AD6800B6200F /* SPDownloader.swift in Sources */, - F42A7A1621B1AD6800B6200F /* SPSystemIconView.swift in Sources */, - F42A7A4721B1AD6800B6200F /* SPUILabelExtenshion.swift in Sources */, - F42A7A5421B1AD6800B6200F /* SPShadow.swift in Sources */, - F42A7A6221B1AD6800B6200F /* SPBufer.swift in Sources */, - F42A7A2D21B1AD6800B6200F /* SPTypes.swift in Sources */, - F42A7A4821B1AD6800B6200F /* SPCGSizeExtenshion.swift in Sources */, - F42A7A2E21B1AD6800B6200F /* SPLocale.swift in Sources */, - F42A79EC21B1AD6800B6200F /* SPSocialIconButton.swift in Sources */, - F42A7A2B21B1AD6800B6200F /* SPStyleKit.swift in Sources */, - F42A79E921B1AD6800B6200F /* SPInternetConnection.swift in Sources */, - F42A7A3121B1AD6800B6200F /* SPUITableViewCellExtenshion.swift in Sources */, - F42A7A5E21B1AD6800B6200F /* SPAnimation.swift in Sources */, + F47D9C6421B947C30033AAA4 /* SPOpener.swift in Sources */, + F47D9C3B21B947C30033AAA4 /* SPUITableViewCellExtenshion.swift in Sources */, + F47D9C4A21B947C30033AAA4 /* SPUINavigationControllerExtenshion.swift in Sources */, + F47D9C3D21B947C30033AAA4 /* SPUIFontExtenshion.swift in Sources */, + F47D9C6A21B947C30033AAA4 /* SPWhatsApp.swift in Sources */, + F47D9C1221B947C30033AAA4 /* SPCollectionViewCell.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Example/stork-controller.xcodeproj/project.xcworkspace/xcuserdata/ivanvorobei.xcuserdatad/UserInterfaceState.xcuserstate b/Example/stork-controller.xcodeproj/project.xcworkspace/xcuserdata/ivanvorobei.xcuserdatad/UserInterfaceState.xcuserstate index c9fbb24..b3a3393 100644 Binary files a/Example/stork-controller.xcodeproj/project.xcworkspace/xcuserdata/ivanvorobei.xcuserdatad/UserInterfaceState.xcuserstate and b/Example/stork-controller.xcodeproj/project.xcworkspace/xcuserdata/ivanvorobei.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/Example/stork-controller/Frameworks/sparrow/extension/SPUITableViewControllerExtenshion.swift b/Example/stork-controller/Frameworks/Sparrow/constraints/SPConstraints.swift similarity index 70% rename from Example/stork-controller/Frameworks/sparrow/extension/SPUITableViewControllerExtenshion.swift rename to Example/stork-controller/Frameworks/Sparrow/constraints/SPConstraints.swift index db6e274..fddf531 100644 --- a/Example/stork-controller/Frameworks/sparrow/extension/SPUITableViewControllerExtenshion.swift +++ b/Example/stork-controller/Frameworks/Sparrow/constraints/SPConstraints.swift @@ -21,14 +21,18 @@ import UIKit -extension UITableViewController { +public struct SPConstraints { - func refreshManually() { - self.refreshControl?.beginRefreshing() - self.tableView.setContentOffset( - CGPoint.init( - x: 0, - y: self.tableView.contentOffset.y - (self.refreshControl?.frame.size.height ?? 0) - ), animated: true) + static func setEqualSize(_ view: UIView, superVuew: UIView) { + view.translatesAutoresizingMaskIntoConstraints = false + NSLayoutConstraint.activate([ + view.topAnchor.constraint(equalTo: superVuew.topAnchor), + view.leftAnchor.constraint(equalTo: superVuew.leftAnchor), + view.rightAnchor.constraint(equalTo: superVuew.rightAnchor), + view.bottomAnchor.constraint(equalTo: superVuew.bottomAnchor) + ]) } } + + + diff --git a/Example/stork-controller/Frameworks/Sparrow/extension/SPUIVisualEffectViewExtenshion.swift b/Example/stork-controller/Frameworks/Sparrow/extension/SPUIVisualEffectViewExtenshion.swift index d37c3dd..a3533b6 100644 --- a/Example/stork-controller/Frameworks/Sparrow/extension/SPUIVisualEffectViewExtenshion.swift +++ b/Example/stork-controller/Frameworks/Sparrow/extension/SPUIVisualEffectViewExtenshion.swift @@ -24,7 +24,13 @@ import UIKit extension UIVisualEffectView { convenience init(style: UIBlurEffect.Style) { - let effect = UIBlurEffect(style: .extraLight) + let effect = UIBlurEffect(style: style) self.init(effect: effect) } + + convenience init(vibrancy style: UIBlurEffect.Style) { + let effect = UIBlurEffect(style: style) + let vibrancyEffect = UIVibrancyEffect(blurEffect: effect) + self.init(effect: vibrancyEffect) + } } diff --git a/Example/stork-controller/Frameworks/sparrow/extension/SPBezierPathExtension.swift b/Example/stork-controller/Frameworks/Sparrow/ui/buttons/SPAppleMusicButton.swift similarity index 52% rename from Example/stork-controller/Frameworks/sparrow/extension/SPBezierPathExtension.swift rename to Example/stork-controller/Frameworks/Sparrow/ui/buttons/SPAppleMusicButton.swift index 26a7efc..4bac32a 100644 --- a/Example/stork-controller/Frameworks/sparrow/extension/SPBezierPathExtension.swift +++ b/Example/stork-controller/Frameworks/Sparrow/ui/buttons/SPAppleMusicButton.swift @@ -21,38 +21,50 @@ import UIKit -extension UIBezierPath { +class SPAppleMusicButton: SPButton { - func resizeTo(width: CGFloat) { - let currentWidth = self.bounds.width - let relativeFactor = width / currentWidth - self.apply(CGAffineTransform(scaleX: relativeFactor, y: relativeFactor)) + var mode: Mode = .unselect { + didSet { + self.updateStyle(animated: false) + } } - func convertToImage(fill: Bool, stroke: Bool, color: UIColor = .black) -> UIImage { - UIGraphicsBeginImageContextWithOptions(CGSize(width: self.bounds.width, height: self.bounds.height), false, 0.0) - let context = UIGraphicsGetCurrentContext() - context!.setStrokeColor(color.cgColor) - context!.setFillColor(color.cgColor) - if stroke { - self.stroke() + var selectColor: UIColor = UIColor.init(hex: "FD2D55") { + didSet { + self.updateStyle(animated: false) } - if fill { - self.fill() + } + + var baseColor: UIColor = UIColor.init(hex: "F8F7FC") { + didSet { + self.updateStyle(animated: false) } - let image = UIGraphicsGetImageFromCurrentImageContext() - UIGraphicsEndImageContext() - return image! + } + + override func commonInit() { + super.commonInit() + self.layer.cornerRadius = 8 + self.titleLabel?.font = UIFont.system(type: .DemiBold, size: 15) + self.contentEdgeInsets = UIEdgeInsets.init(top: 12, left: 27, bottom: 12, right: 27) + self.mode = .unselect + } + + private func updateStyle(animated: Bool) { + switch self.mode { + case .select: + self.backgroundColor = self.selectColor + self.setTitleColor(UIColor.white) + break + case .unselect: + self.backgroundColor = self.baseColor + self.setTitleColor(self.selectColor) + break + } + } + + enum Mode { + case select + case unselect } } -public struct SPBezierPath { - - public static func setContext() { - UIGraphicsBeginImageContextWithOptions(CGSize(width: 1, height: 1), false, 0) - } - - public static func endContext() { - UIGraphicsEndImageContext() - } -} diff --git a/Example/stork-controller/Frameworks/sparrow/extension/SPUIWindowExtenshion.swift b/Example/stork-controller/Frameworks/Sparrow/ui/buttons/SPButton.swift similarity index 59% rename from Example/stork-controller/Frameworks/sparrow/extension/SPUIWindowExtenshion.swift rename to Example/stork-controller/Frameworks/Sparrow/ui/buttons/SPButton.swift index 198b81d..146e849 100644 --- a/Example/stork-controller/Frameworks/sparrow/extension/SPUIWindowExtenshion.swift +++ b/Example/stork-controller/Frameworks/Sparrow/ui/buttons/SPButton.swift @@ -21,35 +21,42 @@ import UIKit -extension UIWindow { +public class SPButton: UIButton { - static var key: UIWindow? { - return UIApplication.shared.keyWindow + var gradientView: SPGradientView? { + didSet { + self.gradientView?.isUserInteractionEnabled = false + if self.gradientView?.superview == nil { + if self.gradientView != nil { + self.insertSubview(self.gradientView!, at: 0) + } + } + } } - static var topSafeArea: CGFloat { - var topSafeArea: CGFloat = 0 - if let window = UIWindow.key { - if #available(iOS 11.0, *) { - topSafeArea = window.safeAreaInsets.top - } - } else { - topSafeArea = 0 + var round: Bool = false { + didSet { + self.layoutSubviews() } - - return topSafeArea } - static var bottomSafeArea: CGFloat { - var bottomSafeArea: CGFloat = 0 - if let window = UIWindow.key { - if #available(iOS 11.0, *) { - bottomSafeArea = window.safeAreaInsets.bottom - } - } else { - bottomSafeArea = 0 + init() { + super.init(frame: CGRect.zero) + self.commonInit() + } + + required init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + self.commonInit() + } + + internal func commonInit() {} + + override public func layoutSubviews() { + super.layoutSubviews() + self.gradientView?.setEqualsBoundsFromSuperview() + if self.round { + self.round() } - - return bottomSafeArea } } diff --git a/Example/stork-controller/Frameworks/Sparrow/ui/buttons/SPDotsButton.swift b/Example/stork-controller/Frameworks/Sparrow/ui/buttons/SPDotsButton.swift new file mode 100644 index 0000000..87e9901 --- /dev/null +++ b/Example/stork-controller/Frameworks/Sparrow/ui/buttons/SPDotsButton.swift @@ -0,0 +1,100 @@ +// The MIT License (MIT) +// Copyright © 2017 Ivan Vorobei (hello@ivanvorobei.by) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +import UIKit + +class SPDotButton: SPButton { + + var customSideSize: CGFloat = 26 { + didSet { + self.sizeToFit() + } + } + + var dotColor: UIColor = UIColor.white { + didSet { + for dotView in self.dotsView { + dotView.backgroundColor = self.dotColor + } + } + } + + override var isHighlighted: Bool{ + didSet{ + if isHighlighted{ + UIView.animate(withDuration: 0.1, delay: 0.0, usingSpringWithDamping: 1, initialSpringVelocity: 1.0, options: [.curveEaseOut, .beginFromCurrentState], animations: { + for dotView in self.dotsView { + dotView.alpha = 0.35 + } + }, completion: nil) + }else{ + UIView.animate(withDuration: 0.35, delay: 0.0, usingSpringWithDamping: 1, initialSpringVelocity: 1.0, options: [.curveEaseOut, .beginFromCurrentState], animations: { + for dotView in self.dotsView { + dotView.alpha = 1 + } + }, completion: nil) + } + } + } + + private var dotsView: [UIView] = [] + + override func commonInit() { + super.commonInit() + self.backgroundColor = UIColor.black.withAlphaComponent(0.2) + for _ in 0...2 { + let dotView = UIView() + dotView.isUserInteractionEnabled = false + dotView.backgroundColor = self.dotColor + self.dotsView.append(dotView) + self.addSubview(dotView) + } + } + + override func sizeToFit() { + super.sizeToFit() + self.setWidth(self.customSideSize) + self.setHeight(self.customSideSize) + self.layoutSubviews() + } + + override func layoutSubviews() { + super.layoutSubviews() + + let space: CGFloat = 2 + let sideSize: CGFloat = 4 + + let insest: CGFloat = (self.frame.width - (sideSize * 3) - (space * 2)) / 2 + + var currentXPosition: CGFloat = insest + + for dotView in self.dotsView { + dotView.setWidth(sideSize) + dotView.setHeight(sideSize) + dotView.setYCenteringFromSuperview() + dotView.frame.origin.x = currentXPosition + dotView.round() + currentXPosition += (sideSize + space) + } + + self.round() + } +} diff --git a/Example/stork-controller/Frameworks/sparrow/ui/buttons/SPNativeOS11Button.swift b/Example/stork-controller/Frameworks/Sparrow/ui/buttons/SPNativeLargeButton.swift similarity index 68% rename from Example/stork-controller/Frameworks/sparrow/ui/buttons/SPNativeOS11Button.swift rename to Example/stork-controller/Frameworks/Sparrow/ui/buttons/SPNativeLargeButton.swift index c3df408..9198477 100644 --- a/Example/stork-controller/Frameworks/sparrow/ui/buttons/SPNativeOS11Button.swift +++ b/Example/stork-controller/Frameworks/Sparrow/ui/buttons/SPNativeLargeButton.swift @@ -21,31 +21,31 @@ import UIKit -class SPNativeOS11Button: SPDownloadingButton { +class SPNativeLargeButton: SPDownloadingButton { override var isHighlighted: Bool { didSet { - if isHighlighted { - self.backgroundColor = self.backgroundColor?.withAlphaComponent(0.7) + if self.gradientView == nil { + if isHighlighted { + self.backgroundColor = self.backgroundColor?.withAlphaComponent(0.7) + } else { + self.backgroundColor = self.backgroundColor?.withAlphaComponent(1) + } } else { - self.backgroundColor = self.backgroundColor?.withAlphaComponent(1) + self.backgroundColor = self.backgroundColor?.withAlphaComponent(0) + if isHighlighted { + self.gradientView?.alpha = 0.7 + } else { + self.gradientView?.alpha = 1 + } } } } - - init() { - super.init(frame: CGRect.zero) - self.commonInit() - } - required init?(coder aDecoder: NSCoder) { - super.init(coder: aDecoder) - self.commonInit() - } - - private func commonInit() { + override func commonInit() { + super.commonInit() self.titleLabel?.font = UIFont.system(type: UIFont.BoldType.DemiBold, size: 16) - self.setTitleColorForNoramlAndHightlightedStates(color: UIColor.white) + self.setTitleColor(UIColor.white) self.backgroundColor = SPNativeStyleKit.Colors.blue self.layer.masksToBounds = true self.layer.cornerRadius = 8 @@ -61,5 +61,12 @@ class SPNativeOS11Button: SPDownloadingButton { self.setWidth(width) } } + + override func layoutSubviews() { + super.layoutSubviews() + self.gradientView?.setEqualsBoundsFromSuperview() + self.gradientView?.layer.cornerRadius = self.layer.cornerRadius + self.gradientView?.gradientLayer.cornerRadius = self.layer.cornerRadius + } } diff --git a/Example/stork-controller/Frameworks/sparrow/ui/buttons/SPSocialIconButton.swift b/Example/stork-controller/Frameworks/Sparrow/ui/buttons/SPSocialButton.swift similarity index 98% rename from Example/stork-controller/Frameworks/sparrow/ui/buttons/SPSocialIconButton.swift rename to Example/stork-controller/Frameworks/Sparrow/ui/buttons/SPSocialButton.swift index 35505e8..8149d94 100644 --- a/Example/stork-controller/Frameworks/sparrow/ui/buttons/SPSocialIconButton.swift +++ b/Example/stork-controller/Frameworks/Sparrow/ui/buttons/SPSocialButton.swift @@ -21,7 +21,7 @@ import UIKit -class SPSocialIconButton: UIButton { +class SPSocialButton: UIButton { let iconView = SPSocialIconView.init() var widthIconFactor: CGFloat = 0.5 diff --git a/Example/stork-controller/Frameworks/Sparrow/ui/views/SPFakeBarView.swift b/Example/stork-controller/Frameworks/Sparrow/ui/views/SPFakeBarView.swift index 6b95603..150367b 100644 --- a/Example/stork-controller/Frameworks/Sparrow/ui/views/SPFakeBarView.swift +++ b/Example/stork-controller/Frameworks/Sparrow/ui/views/SPFakeBarView.swift @@ -1,8 +1,29 @@ +// The MIT License (MIT) +// Copyright © 2017 Ivan Vorobei (hello@ivanvorobei.by) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + import UIKit public class SPFakeBarView: UIView { - var style: Style = . small { + var style: SPNavigationTitleStyle = . small { didSet { self.updateStyle() } @@ -47,7 +68,7 @@ public class SPFakeBarView: UIView { private let blurView = UIVisualEffectView.init(style: .extraLight) private let separatorView = UIView() - init(style: Style) { + init(style: SPNavigationTitleStyle) { super.init(frame: CGRect.zero) self.style = style self.commonInit() @@ -94,7 +115,7 @@ public class SPFakeBarView: UIView { self.leftButton.setTitleColor(self.elementsColor) self.leftButton.titleLabel?.textAlignment = .left - self.leftButton.titleLabel?.font = UIFont.system(type: .Regular, size: 17) + self.leftButton.titleLabel?.font = UIFont.system(type: .DemiBold, size: 16) self.leftButton.contentEdgeInsets = UIEdgeInsets(top: 0, left: 17, bottom: 0, right: 0) self.addSubview(self.leftButton) self.leftButton.translatesAutoresizingMaskIntoConstraints = false @@ -103,8 +124,8 @@ public class SPFakeBarView: UIView { self.rightButton.setTitleColor(self.elementsColor) self.rightButton.titleLabel?.textAlignment = .right - self.rightButton.titleLabel?.font = UIFont.system(type: .Regular, size: 17) - self.rightButton.contentEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 17) + self.rightButton.titleLabel?.font = UIFont.system(type: .DemiBold, size: 17) + self.rightButton.contentEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 16) self.addSubview(self.rightButton) self.rightButton.translatesAutoresizingMaskIntoConstraints = false self.rightButton.trailingAnchor.constraint(equalTo: self.trailingAnchor).isActive = true @@ -177,10 +198,5 @@ public class SPFakeBarView: UIView { self.heightConstraint?.constant = self.height self.updateConstraints() } - - enum Style { - case small - case large - case stork - } } + diff --git a/Example/stork-controller/Frameworks/sparrow/ui/buttons/SPGradientButton.swift b/Example/stork-controller/Frameworks/Sparrow/ui/views/SPImageView.swift similarity index 66% rename from Example/stork-controller/Frameworks/sparrow/ui/buttons/SPGradientButton.swift rename to Example/stork-controller/Frameworks/Sparrow/ui/views/SPImageView.swift index b8dbb5b..810c5b1 100644 --- a/Example/stork-controller/Frameworks/sparrow/ui/buttons/SPGradientButton.swift +++ b/Example/stork-controller/Frameworks/Sparrow/ui/views/SPImageView.swift @@ -21,28 +21,36 @@ import UIKit -class SPGradientButton: SPDownloadingButton { +class SPImageView: UIImageView { - let gradientView = SPGradientView.init() + var round: Bool = false { + didSet { + self.layoutSubviews() + } + } init() { super.init(frame: CGRect.zero) - self.gradientView.setStartColorPosition(SPGradientView.Position.MediumLeft) - self.gradientView.setEndColorPosition(SPGradientView.Position.MediumRight) - self.gradientView.startColor = UIColor.init(hex: "5737F6") - self.gradientView.endColor = UIColor.init(hex: "956BFE") - self.gradientView.isUserInteractionEnabled = false - self.layer.masksToBounds = true - self.addSubview(self.gradientView) + self.commonInit() + } + + override init(image: UIImage?) { + super.init(image: image) + self.commonInit() } required init?(coder aDecoder: NSCoder) { - fatalError("init(coder:) has not been implemented") + super.init(coder: aDecoder) + self.commonInit() } - override func layoutSubviews() { + internal func commonInit() {} + + override public func layoutSubviews() { super.layoutSubviews() - self.gradientView.setEqualsBoundsFromSuperview() + if self.round { + self.layer.masksToBounds = true + self.round() + } } - } diff --git a/Example/stork-controller/Frameworks/sparrow/extension/SPUIScreenExtension.swift b/Example/stork-controller/Frameworks/Sparrow/ui/views/SPLabel.swift similarity index 82% rename from Example/stork-controller/Frameworks/sparrow/extension/SPUIScreenExtension.swift rename to Example/stork-controller/Frameworks/Sparrow/ui/views/SPLabel.swift index 5495063..0482be6 100644 --- a/Example/stork-controller/Frameworks/sparrow/extension/SPUIScreenExtension.swift +++ b/Example/stork-controller/Frameworks/Sparrow/ui/views/SPLabel.swift @@ -21,13 +21,17 @@ import UIKit -extension UIScreen { +public class SPLabel: UILabel { - var minSideSize: CGFloat { - return min(UIScreen.main.bounds.width, UIScreen.main.bounds.height) + init() { + super.init(frame: CGRect.zero) + self.commonInit() } - var widthLessThanHeight: Bool { - return UIScreen.main.bounds.width < UIScreen.main.bounds.height + required init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + self.commonInit() } + + internal func commonInit() {} } diff --git a/Example/stork-controller/Frameworks/sparrow/ui/buttons/SPMengButton.swift b/Example/stork-controller/Frameworks/Sparrow/ui/views/SPTextField.swift similarity index 55% rename from Example/stork-controller/Frameworks/sparrow/ui/buttons/SPMengButton.swift rename to Example/stork-controller/Frameworks/Sparrow/ui/views/SPTextField.swift index 232dfbb..3856b77 100644 --- a/Example/stork-controller/Frameworks/sparrow/ui/buttons/SPMengButton.swift +++ b/Example/stork-controller/Frameworks/Sparrow/ui/views/SPTextField.swift @@ -21,35 +21,43 @@ import UIKit -class SPMengButton: SPGradientButton { +class SPTextField: UITextField { - override init() { - super.init() - - self.isFrameRounded = true - - self.contentEdgeInsets = UIEdgeInsets.init(top: 12, left: 21, bottom: 12, right: 21) - self.titleLabel?.font = UIFont.system(type: UIFont.BoldType.Bold, size: 17) - self.setTitleColorForNoramlAndHightlightedStates(color: UIColor.white) - self.layer.masksToBounds = true - self.gradientView.layer.masksToBounds = true - - self.gradientView.setStartColorPosition(SPGradientView.Position.MediumLeft) - self.gradientView.setEndColorPosition(SPGradientView.Position.MediumRight) - self.gradientView.startColor = UIColor.init(hex: "5737F6") - self.gradientView.endColor = UIColor.init(hex: "956BFE") + public var textInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0) { + didSet { setNeedsDisplay() } + } + + var cursorColor: UIColor = UIColor.blue { + didSet { + self.tintColor = self.cursorColor + } + } + + init() { + super.init(frame: .zero) + self.commonInit() } required init?(coder aDecoder: NSCoder) { - fatalError("init(coder:) has not been implemented") + super.init(coder: aDecoder) + self.commonInit() } - override func layoutSubviews() { - super.layoutSubviews() - - if self.isFrameRounded { - self.gradientView.round() - self.round() - } + internal func commonInit() {} + + open override func textRect(forBounds bounds: CGRect) -> CGRect { + return bounds.inset(by: textInsets) + } + + open override func editingRect(forBounds bounds: CGRect) -> CGRect { + return bounds.inset(by: textInsets) + } + + open override func placeholderRect(forBounds bounds: CGRect) -> CGRect { + return bounds.inset(by: textInsets) + } + + open override func drawText(in rect: CGRect) { + super.drawText(in: rect.inset(by: textInsets)) } } diff --git a/Example/stork-controller/Frameworks/sparrow/extension/SPUIDeviceExtenshion.swift b/Example/stork-controller/Frameworks/Sparrow/ui/views/SPView.swift similarity index 70% rename from Example/stork-controller/Frameworks/sparrow/extension/SPUIDeviceExtenshion.swift rename to Example/stork-controller/Frameworks/Sparrow/ui/views/SPView.swift index fb62539..6b6d661 100644 --- a/Example/stork-controller/Frameworks/sparrow/extension/SPUIDeviceExtenshion.swift +++ b/Example/stork-controller/Frameworks/Sparrow/ui/views/SPView.swift @@ -21,13 +21,30 @@ import UIKit -public extension UIDevice { +public class SPView: UIView { - public var isIphone: Bool { - return UIDevice.current.userInterfaceIdiom == .phone + var round: Bool = false { + didSet { + self.layoutSubviews() + } } - public var isIpad: Bool { - return UIDevice.current.userInterfaceIdiom == .pad + init() { + super.init(frame: CGRect.zero) + self.commonInit() + } + + required init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + self.commonInit() + } + + internal func commonInit() {} + + public override func layoutSubviews() { + super.layoutSubviews() + if self.round { + self.round() + } } } diff --git a/Example/stork-controller/Frameworks/sparrow/style-kit/SPStyleKit.swift b/Example/stork-controller/Frameworks/Sparrow/ui/views/collection/cell/SPCollectionContainerCell.swift similarity index 67% rename from Example/stork-controller/Frameworks/sparrow/style-kit/SPStyleKit.swift rename to Example/stork-controller/Frameworks/Sparrow/ui/views/collection/cell/SPCollectionContainerCell.swift index 6c8acff..bab65fc 100644 --- a/Example/stork-controller/Frameworks/sparrow/style-kit/SPStyleKit.swift +++ b/Example/stork-controller/Frameworks/Sparrow/ui/views/collection/cell/SPCollectionContainerCell.swift @@ -21,7 +21,23 @@ import UIKit -public struct SPStyleKit { +public class SPCollectionContainerCell: UICollectionViewCell { - private init() {} + let view = ContentView.init() + var currentIndexPath: IndexPath? + + override init(frame: CGRect) { + super.init(frame: frame) + self.backgroundColor = UIColor.clear + self.addSubview(view) + } + + required public init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override public func layoutSubviews() { + super.layoutSubviews() + self.view.setEqualsFrameFromBounds(self) + } } diff --git a/Example/stork-controller/Frameworks/sparrow/ui/views/collectionView/cells/SPCollectionViewCell.swift b/Example/stork-controller/Frameworks/Sparrow/ui/views/collection/cell/SPCollectionViewCell.swift similarity index 75% rename from Example/stork-controller/Frameworks/sparrow/ui/views/collectionView/cells/SPCollectionViewCell.swift rename to Example/stork-controller/Frameworks/Sparrow/ui/views/collection/cell/SPCollectionViewCell.swift index 5fddad5..dfafa5e 100644 --- a/Example/stork-controller/Frameworks/sparrow/ui/views/collectionView/cells/SPCollectionViewCell.swift +++ b/Example/stork-controller/Frameworks/Sparrow/ui/views/collection/cell/SPCollectionViewCell.swift @@ -25,29 +25,20 @@ public class SPCollectionViewCell: UICollectionViewCell { var currentIndexPath: IndexPath? + override init(frame: CGRect) { + super.init(frame: frame) + self.commonInit() + } + + required init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + self.commonInit() + } + + internal func commonInit() {} + public override func prepareForReuse() { super.prepareForReuse() self.currentIndexPath = nil } } - -public class SPCollectionContainerCell: UICollectionViewCell { - - let view = ContentView.init() - var currentIndexPath: IndexPath? - - override init(frame: CGRect) { - super.init(frame: frame) - self.backgroundColor = UIColor.clear - self.addSubview(view) - } - - required public init?(coder aDecoder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - override public func layoutSubviews() { - super.layoutSubviews() - self.view.setEqualsFrameFromBounds(self) - } -} diff --git a/Example/stork-controller/Frameworks/sparrow/ui/views/collectionView/cells/SPImageCollectionViewCell.swift b/Example/stork-controller/Frameworks/Sparrow/ui/views/collection/cell/SPImageCollectionViewCell.swift similarity index 96% rename from Example/stork-controller/Frameworks/sparrow/ui/views/collectionView/cells/SPImageCollectionViewCell.swift rename to Example/stork-controller/Frameworks/Sparrow/ui/views/collection/cell/SPImageCollectionViewCell.swift index e0ada59..3c2d210 100644 --- a/Example/stork-controller/Frameworks/sparrow/ui/views/collectionView/cells/SPImageCollectionViewCell.swift +++ b/Example/stork-controller/Frameworks/Sparrow/ui/views/collection/cell/SPImageCollectionViewCell.swift @@ -27,7 +27,7 @@ class SPImageCollectionViewCell: SPCollectionContainerCell= 0 { + scrollView.subviews.forEach { + $0.transform = CGAffineTransform(translationX: 0, y: -translation) + } + if presentationController.pan?.state != UIGestureRecognizer.State.changed { + presentationController.scrollViewDidScroll(translation) + } + } else { + presentationController.scrollViewDidScroll(0) + } + } + } + } + + static private func controller(for view: UIView) -> UIViewController? { + var nextResponder = view.next + while nextResponder != nil && !(nextResponder! is UIViewController) { + nextResponder = nextResponder!.next + } + return nextResponder as? UIViewController + } + + private init() {} +} + +extension UIViewController { + + var isPresentedAsStork: Bool { + return transitioningDelegate is SPStorkTransitioningDelegate + && modalPresentationStyle == .custom + && presentingViewController != nil + } +} diff --git a/Example/stork-controller/Frameworks/sparrow/ui/controllers/stork/SPStorkDismissingAnimationController.swift b/Example/stork-controller/Frameworks/StorkController/SPStorkDismissingAnimationController.swift similarity index 99% rename from Example/stork-controller/Frameworks/sparrow/ui/controllers/stork/SPStorkDismissingAnimationController.swift rename to Example/stork-controller/Frameworks/StorkController/SPStorkDismissingAnimationController.swift index 8728eac..f897c2a 100644 --- a/Example/stork-controller/Frameworks/sparrow/ui/controllers/stork/SPStorkDismissingAnimationController.swift +++ b/Example/stork-controller/Frameworks/StorkController/SPStorkDismissingAnimationController.swift @@ -28,9 +28,10 @@ final class SPStorkDismissingAnimationController: NSObject, UIViewControllerAnim guard let presentedViewController = transitionContext.viewController(forKey: .from) else { return } - + let containerView = transitionContext.containerView let offscreenFrame = CGRect(x: 0, y: containerView.bounds.height, width: containerView.bounds.width, height: containerView.bounds.height) + UIView.animate( withDuration: transitionDuration(using: transitionContext), delay: 0, diff --git a/Example/stork-controller/Frameworks/sparrow/ui/controllers/stork/SPStorkIndicatorView.swift b/Example/stork-controller/Frameworks/StorkController/SPStorkIndicatorView.swift similarity index 75% rename from Example/stork-controller/Frameworks/sparrow/ui/controllers/stork/SPStorkIndicatorView.swift rename to Example/stork-controller/Frameworks/StorkController/SPStorkIndicatorView.swift index 14b0220..ee503fe 100644 --- a/Example/stork-controller/Frameworks/sparrow/ui/controllers/stork/SPStorkIndicatorView.swift +++ b/Example/stork-controller/Frameworks/StorkController/SPStorkIndicatorView.swift @@ -27,16 +27,16 @@ class SPStorkIndicatorView: UIView { didSet { switch self.style { case .line: - SPAnimationSpring.animate(0.5, animations: { + self.animate { self.leftView.transform = .identity self.rightView.transform = .identity - }, options: .curveEaseOut) + } case .arrow: - SPAnimationSpring.animate(0.5, animations: { + self.animate { let angle = CGFloat(20 * Float.pi / 180) self.leftView.transform = CGAffineTransform.init(rotationAngle: angle) self.rightView.transform = CGAffineTransform.init(rotationAngle: -angle) - }, options: .curveEaseOut) + } } } @@ -50,30 +50,34 @@ class SPStorkIndicatorView: UIView { self.backgroundColor = UIColor.clear self.addSubview(self.leftView) self.addSubview(self.rightView) - self.leftView.backgroundColor = UIColor.init(hex: "CAC9CF") - self.rightView.backgroundColor = UIColor.init(hex: "CAC9CF") + self.leftView.backgroundColor = UIColor.init(red: 202/255, green: 201/255, blue: 207/255, alpha: 1) + self.rightView.backgroundColor = UIColor.init(red: 202/255, green: 201/255, blue: 207/255, alpha: 1) } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } - override func sizeToFit() { super.sizeToFit() - self.setWidth(36) - self.setHeight(13) + self.frame = CGRect.init(x: self.frame.origin.x, y: self.frame.origin.y, width: 36, height: 13) let height: CGFloat = 5 let correction = height / 2 self.leftView.frame = CGRect.init(x: 0, y: 0, width: self.frame.width / 2 + correction, height: height) self.leftView.center.y = self.frame.height / 2 - self.leftView.round() + self.leftView.layer.cornerRadius = min(self.leftView.frame.width, self.leftView.frame.height) / 2 self.rightView.frame = CGRect.init(x: self.frame.width / 2 - correction, y: 0, width: self.frame.width / 2 + correction, height: height) self.rightView.center.y = self.frame.height / 2 - self.rightView.round() + self.rightView.layer.cornerRadius = min(self.leftView.frame.width, self.leftView.frame.height) / 2 + } + + private func animate(animations: @escaping (() -> Void)) { + UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: [.beginFromCurrentState, .curveEaseOut], animations: { + animations() + }) } enum Style { diff --git a/Example/stork-controller/Frameworks/StorkController/SPStorkPresentationController.swift b/Example/stork-controller/Frameworks/StorkController/SPStorkPresentationController.swift new file mode 100644 index 0000000..d8fc9cf --- /dev/null +++ b/Example/stork-controller/Frameworks/StorkController/SPStorkPresentationController.swift @@ -0,0 +1,397 @@ +// The MIT License (MIT) +// Copyright © 2017 Ivan Vorobei (hello@ivanvorobei.by) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +import UIKit + +class SPStorkPresentationController: UIPresentationController, UIGestureRecognizerDelegate { + + var isSwipeToDismissEnabled: Bool = true + var showIndicator: Bool = true + var transitioningDelegate: SPStorkTransitioningDelegate? + var pan: UIPanGestureRecognizer? + + private var indicatorView = SPStorkIndicatorView() + private var gradeView: UIView = UIView() + private let snapshotViewContainer = UIView() + private var snapshotView: UIView? + private let backgroundView = UIView() + + private var snapshotViewTopConstraint: NSLayoutConstraint? + private var snapshotViewWidthConstraint: NSLayoutConstraint? + private var snapshotViewAspectRatioConstraint: NSLayoutConstraint? + private var workGester: Bool = false + private var startDismissing: Bool = false + + private var topSpace: CGFloat { + let statusBarHeight: CGFloat = UIApplication.shared.statusBarFrame.height + return (statusBarHeight < 25) ? 30 : statusBarHeight + } + + private var alpha: CGFloat { + return 0.51 + } + + private var cornerRadius: CGFloat { + return 10 + } + + private var scaleForPresentingView: CGFloat { + guard let containerView = containerView else { return 0 } + let factor = 1 - (topSpace * 2 / containerView.frame.height) + return factor + } + + override var frameOfPresentedViewInContainerView: CGRect { + guard let containerView = containerView else { return .zero } + let yOffset: CGFloat = topSpace + 13 + return CGRect(x: 0, y: yOffset, width: containerView.bounds.width, height: containerView.bounds.height - yOffset) + } + + override func presentationTransitionWillBegin() { + super.presentationTransitionWillBegin() + + guard let containerView = self.containerView, let presentedView = self.presentedView, let window = containerView.window else { return } + + if self.showIndicator { + presentedView.addSubview(self.indicatorView) + } + self.updateLayoutIndicator() + self.indicatorView.style = .arrow + self.gradeView.alpha = 0 + + let initialFrame: CGRect = presentingViewController.isPresentedAsStork ? presentingViewController.view.frame : containerView.bounds + + containerView.insertSubview(self.snapshotViewContainer, belowSubview: presentedViewController.view) + self.snapshotViewContainer.frame = initialFrame + self.updateSnapshot() + self.backgroundView.backgroundColor = UIColor.black + self.backgroundView.translatesAutoresizingMaskIntoConstraints = false + containerView.insertSubview(self.backgroundView, belowSubview: self.snapshotViewContainer) + NSLayoutConstraint.activate([ + self.backgroundView.topAnchor.constraint(equalTo: window.topAnchor), + self.backgroundView.leftAnchor.constraint(equalTo: window.leftAnchor), + self.backgroundView.rightAnchor.constraint(equalTo: window.rightAnchor), + self.backgroundView.bottomAnchor.constraint(equalTo: window.bottomAnchor) + ]) + + let transformForSnapshotView = CGAffineTransform.identity + .translatedBy(x: 0, y: -snapshotViewContainer.frame.origin.y) + .translatedBy(x: 0, y: self.topSpace) + .translatedBy(x: 0, y: -snapshotViewContainer.frame.height / 2) + .scaledBy(x: scaleForPresentingView, y: scaleForPresentingView) + .translatedBy(x: 0, y: snapshotViewContainer.frame.height / 2) + + self.addCornerRadiusAnimation(for: self.snapshotView, cornerRadius: self.cornerRadius, duration: 0.6) + self.snapshotView?.layer.masksToBounds = true + if #available(iOS 11.0, *) { + presentedView.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner] + } + presentedView.layer.cornerRadius = self.cornerRadius + presentedView.layer.masksToBounds = true + + var rootSnapshotView: UIView? + var rootSnapshotRoundedView: UIView? + + if presentingViewController.isPresentedAsStork { + guard let rootController = presentingViewController.presentingViewController, let snapshotView = rootController.view.snapshotView(afterScreenUpdates: false) else { return } + + containerView.insertSubview(snapshotView, aboveSubview: self.backgroundView) + snapshotView.frame = initialFrame + snapshotView.transform = transformForSnapshotView + snapshotView.alpha = self.alpha + snapshotView.layer.cornerRadius = self.cornerRadius + snapshotView.layer.masksToBounds = true + rootSnapshotView = snapshotView + + let snapshotRoundedView = UIView() + snapshotRoundedView.layer.cornerRadius = self.cornerRadius + snapshotRoundedView.layer.masksToBounds = true + containerView.insertSubview(snapshotRoundedView, aboveSubview: snapshotView) + snapshotRoundedView.frame = initialFrame + snapshotRoundedView.transform = transformForSnapshotView + rootSnapshotRoundedView = snapshotRoundedView + } + + presentedViewController.transitionCoordinator?.animate( + alongsideTransition: { [weak self] context in + guard let `self` = self else { return } + self.snapshotView?.transform = transformForSnapshotView + self.gradeView.alpha = self.alpha + }, completion: { _ in + self.snapshotView?.transform = .identity + rootSnapshotView?.removeFromSuperview() + rootSnapshotRoundedView?.removeFromSuperview() + }) + } + + override func presentationTransitionDidEnd(_ completed: Bool) { + super.presentationTransitionDidEnd(completed) + guard let containerView = containerView else { return } + self.presentedViewController.view.frame = self.frameOfPresentedViewInContainerView + self.snapshotViewContainer.transform = .identity + self.snapshotViewContainer.translatesAutoresizingMaskIntoConstraints = false + self.snapshotViewContainer.centerXAnchor.constraint(equalTo: containerView.centerXAnchor).isActive = true + self.updateSnapshotAspectRatio() + + if self.isSwipeToDismissEnabled { + self.pan = UIPanGestureRecognizer(target: self, action: #selector(handlePan)) + self.pan!.delegate = self + self.pan!.maximumNumberOfTouches = 1 + self.pan!.cancelsTouchesInView = false + self.presentedViewController.view.addGestureRecognizer(self.pan!) + } + } + + override func dismissalTransitionWillBegin() { + super.dismissalTransitionWillBegin() + guard let containerView = containerView else { return } + self.startDismissing = true + + let initialFrame: CGRect = presentingViewController.isPresentedAsStork ? presentingViewController.view.frame : containerView.bounds + + let initialTransform = CGAffineTransform.identity + .translatedBy(x: 0, y: -initialFrame.origin.y) + .translatedBy(x: 0, y: self.topSpace) + .translatedBy(x: 0, y: -initialFrame.height / 2) + .scaledBy(x: scaleForPresentingView, y: scaleForPresentingView) + .translatedBy(x: 0, y: initialFrame.height / 2) + + self.snapshotViewTopConstraint?.isActive = false + self.snapshotViewWidthConstraint?.isActive = false + self.snapshotViewAspectRatioConstraint?.isActive = false + self.snapshotViewContainer.translatesAutoresizingMaskIntoConstraints = true + self.snapshotViewContainer.frame = initialFrame + self.snapshotViewContainer.transform = initialTransform + + let finalCornerRadius = presentingViewController.isPresentedAsStork ? self.cornerRadius : 0 + let finalTransform: CGAffineTransform = .identity + + self.addCornerRadiusAnimation(for: self.snapshotView, cornerRadius: finalCornerRadius, duration: 0.6) + + var rootSnapshotView: UIView? + var rootSnapshotRoundedView: UIView? + + if presentingViewController.isPresentedAsStork { + guard let rootController = presentingViewController.presentingViewController, let snapshotView = rootController.view.snapshotView(afterScreenUpdates: false) else { return } + + containerView.insertSubview(snapshotView, aboveSubview: backgroundView) + snapshotView.frame = initialFrame + snapshotView.transform = initialTransform + rootSnapshotView = snapshotView + snapshotView.layer.cornerRadius = self.cornerRadius + snapshotView.layer.masksToBounds = true + + let snapshotRoundedView = UIView() + snapshotRoundedView.layer.cornerRadius = self.cornerRadius + snapshotRoundedView.layer.masksToBounds = true + snapshotRoundedView.backgroundColor = UIColor.black.withAlphaComponent(1 - self.alpha) + containerView.insertSubview(snapshotRoundedView, aboveSubview: snapshotView) + snapshotRoundedView.frame = initialFrame + snapshotRoundedView.transform = initialTransform + rootSnapshotRoundedView = snapshotRoundedView + } + + presentedViewController.transitionCoordinator?.animate( + alongsideTransition: { [weak self] context in + guard let `self` = self else { return } + self.snapshotView?.transform = .identity + self.snapshotViewContainer.transform = finalTransform + self.gradeView.alpha = 0 + }, completion: { _ in + rootSnapshotView?.removeFromSuperview() + rootSnapshotRoundedView?.removeFromSuperview() + }) + } + + override func dismissalTransitionDidEnd(_ completed: Bool) { + super.dismissalTransitionDidEnd(completed) + guard let containerView = containerView else { return } + + self.backgroundView.removeFromSuperview() + self.snapshotView?.removeFromSuperview() + self.snapshotViewContainer.removeFromSuperview() + + let offscreenFrame = CGRect(x: 0, y: containerView.bounds.height, width: containerView.bounds.width, height: containerView.bounds.height) + presentedViewController.view.frame = offscreenFrame + presentedViewController.view.transform = .identity + } +} + +extension SPStorkPresentationController { + + @objc func handlePan(gestureRecognizer: UIPanGestureRecognizer) { + guard gestureRecognizer.isEqual(pan), self.isSwipeToDismissEnabled else { return } + + switch gestureRecognizer.state { + case .began: + self.workGester = true + self.indicatorView.style = .line + self.presentingViewController.view.layer.removeAllAnimations() + gestureRecognizer.setTranslation(CGPoint(x: 0, y: 0), in: containerView) + case .changed: + self.workGester = true + if self.isSwipeToDismissEnabled { + let translation = gestureRecognizer.translation(in: presentedView) + self.updatePresentedViewForTranslation(inVerticalDirection: translation.y) + } else { + gestureRecognizer.setTranslation(.zero, in: presentedView) + } + case .ended: + self.workGester = false + let translation = gestureRecognizer.translation(in: presentedView).y + if translation >= 240 { + presentedViewController.dismiss(animated: true, completion: nil) + } else { + self.indicatorView.style = .arrow + UIView.animate( + withDuration: 0.6, + delay: 0, + usingSpringWithDamping: 1, + initialSpringVelocity: 1, + options: [.curveEaseOut, .allowUserInteraction], + animations: { + self.snapshotView?.transform = .identity + self.presentedView?.transform = .identity + }) + } + default: + break + } + } + + func scrollViewDidScroll(_ translation: CGFloat) { + if !self.workGester { + self.updatePresentedViewForTranslation(inVerticalDirection: translation) + } + } + + private func updatePresentedViewForTranslation(inVerticalDirection translation: CGFloat) { + if self.startDismissing { return } + + let elasticThreshold: CGFloat = 120 + let translationFactor: CGFloat = 1 / 2 + + if translation >= 0 { + let translationForModal: CGFloat = { + if translation >= elasticThreshold { + let frictionLength = translation - elasticThreshold + let frictionTranslation = 30 * atan(frictionLength / 120) + frictionLength / 10 + return frictionTranslation + (elasticThreshold * translationFactor) + } else { + return translation * translationFactor + } + }() + + self.presentedView?.transform = CGAffineTransform(translationX: 0, y: translationForModal) + + if !self.presentingViewController.isPresentedAsStork { + let factor = 1 + (translationForModal / 6000) + self.snapshotView?.transform = CGAffineTransform.init(scaleX: factor, y: factor) + self.gradeView.alpha = self.alpha - ((factor - 1) * 15) + } + } + } +} + +extension SPStorkPresentationController { + + override func containerViewWillLayoutSubviews() { + super.containerViewWillLayoutSubviews() + guard let containerView = containerView else { return } + self.updateSnapshotAspectRatio() + if presentedViewController.view.isDescendant(of: containerView) { + UIView.animate(withDuration: 0.1) { [weak self] in + guard let `self` = self else { return } + self.presentedViewController.view.frame = self.frameOfPresentedViewInContainerView + } + } + } + + override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { + super.viewWillTransition(to: size, with: coordinator) + coordinator.animate(alongsideTransition: { contex in + self.updateLayoutIndicator() + }, completion: { [weak self] _ in + self?.updateSnapshotAspectRatio() + self?.updateSnapshot() + }) + } + + private func updateLayoutIndicator() { + guard let presentedView = self.presentedView else { return } + self.indicatorView.style = .line + self.indicatorView.sizeToFit() + self.indicatorView.frame.origin.y = 12 + self.indicatorView.center.x = presentedView.frame.width / 2 + } + + private func updateSnapshot() { + guard let currentSnapshotView = presentingViewController.view.snapshotView(afterScreenUpdates: true) else { return } + self.snapshotView?.removeFromSuperview() + self.snapshotViewContainer.addSubview(currentSnapshotView) + self.constraints(view: currentSnapshotView, to: self.snapshotViewContainer) + self.snapshotView = currentSnapshotView + self.gradeView.removeFromSuperview() + self.gradeView.backgroundColor = UIColor.black + self.snapshotView!.addSubview(self.gradeView) + self.constraints(view: self.gradeView, to: self.snapshotView!) + } + + private func updateSnapshotAspectRatio() { + guard let containerView = containerView, snapshotViewContainer.translatesAutoresizingMaskIntoConstraints == false else { return } + + self.snapshotViewTopConstraint?.isActive = false + self.snapshotViewWidthConstraint?.isActive = false + self.snapshotViewAspectRatioConstraint?.isActive = false + + let snapshotReferenceSize = presentingViewController.view.frame.size + let aspectRatio = snapshotReferenceSize.width / snapshotReferenceSize.height + + self.snapshotViewTopConstraint = snapshotViewContainer.topAnchor.constraint(equalTo: containerView.topAnchor, constant: self.topSpace) + self.snapshotViewWidthConstraint = snapshotViewContainer.widthAnchor.constraint(equalTo: containerView.widthAnchor, multiplier: scaleForPresentingView) + self.snapshotViewAspectRatioConstraint = snapshotViewContainer.widthAnchor.constraint(equalTo: snapshotViewContainer.heightAnchor, multiplier: aspectRatio) + + self.snapshotViewTopConstraint?.isActive = true + self.snapshotViewWidthConstraint?.isActive = true + self.snapshotViewAspectRatioConstraint?.isActive = true + } + + private func constraints(view: UIView, to superView: UIView) { + view.translatesAutoresizingMaskIntoConstraints = false + NSLayoutConstraint.activate([ + view.topAnchor.constraint(equalTo: superView.topAnchor), + view.leftAnchor.constraint(equalTo: superView.leftAnchor), + view.rightAnchor.constraint(equalTo: superView.rightAnchor), + view.bottomAnchor.constraint(equalTo: superView.bottomAnchor) + ]) + } + + private func addCornerRadiusAnimation(for view: UIView?, cornerRadius: CGFloat, duration: CFTimeInterval) { + guard let view = view else { return } + let animation = CABasicAnimation(keyPath:"cornerRadius") + animation.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeOut) + animation.fromValue = view.layer.cornerRadius + animation.toValue = cornerRadius + animation.duration = duration + view.layer.add(animation, forKey: "cornerRadius") + view.layer.cornerRadius = cornerRadius + } +} diff --git a/Example/stork-controller/Frameworks/sparrow/ui/controllers/stork/SPStorkPresentingAnimationController.swift b/Example/stork-controller/Frameworks/StorkController/SPStorkPresentingAnimationController.swift similarity index 99% rename from Example/stork-controller/Frameworks/sparrow/ui/controllers/stork/SPStorkPresentingAnimationController.swift rename to Example/stork-controller/Frameworks/StorkController/SPStorkPresentingAnimationController.swift index e659c39..16c8e67 100644 --- a/Example/stork-controller/Frameworks/sparrow/ui/controllers/stork/SPStorkPresentingAnimationController.swift +++ b/Example/stork-controller/Frameworks/StorkController/SPStorkPresentingAnimationController.swift @@ -24,9 +24,11 @@ import UIKit final class SPStorkPresentingAnimationController: NSObject, UIViewControllerAnimatedTransitioning { func animateTransition(using transitionContext: UIViewControllerContextTransitioning) { + guard let presentedViewController = transitionContext.viewController(forKey: .to) else { return } + let containerView = transitionContext.containerView containerView.addSubview(presentedViewController.view) presentedViewController.view.frame = CGRect(x: 0, y: containerView.bounds.height, width: containerView.bounds.width, height: containerView.bounds.height) diff --git a/Example/stork-controller/Frameworks/sparrow/ui/controllers/stork/SPStorkTransitioningDelegate.swift b/Example/stork-controller/Frameworks/StorkController/SPStorkTransitioningDelegate.swift similarity index 96% rename from Example/stork-controller/Frameworks/sparrow/ui/controllers/stork/SPStorkTransitioningDelegate.swift rename to Example/stork-controller/Frameworks/StorkController/SPStorkTransitioningDelegate.swift index 93bcc95..61004cc 100644 --- a/Example/stork-controller/Frameworks/sparrow/ui/controllers/stork/SPStorkTransitioningDelegate.swift +++ b/Example/stork-controller/Frameworks/StorkController/SPStorkTransitioningDelegate.swift @@ -23,6 +23,9 @@ import UIKit public final class SPStorkTransitioningDelegate: NSObject, UIViewControllerTransitioningDelegate { + var isSwipeToDismissEnabled: Bool = true + var showIndicator: Bool = true + public func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? { let controller = SPStorkPresentationController(presentedViewController: presented, presenting: presenting) controller.transitioningDelegate = self diff --git a/Example/stork-controller/Frameworks/sparrow/app/SPApp.swift b/Example/stork-controller/Frameworks/sparrow/app/SPApp.swift index 6ffbe15..ea829e3 100644 --- a/Example/stork-controller/Frameworks/sparrow/app/SPApp.swift +++ b/Example/stork-controller/Frameworks/sparrow/app/SPApp.swift @@ -31,5 +31,30 @@ struct SPApp { return Bundle.main.object(forInfoDictionaryKey: "CFBundleDisplayName") as? String } + static var rootController: UIViewController? { + return UIApplication.shared.keyWindow?.rootViewController + } + + static func set(rootController: UIViewController, animatable: Bool = true) { + + rootController.view.frame = UIScreen.main.bounds + + let replaceRootViewController = { + UIApplication.shared.keyWindow?.rootViewController = rootController + } + + if animatable { + UIView.transition( + with: UIApplication.shared.keyWindow ?? UIWindow(), + duration: 0.5, + options: UIView.AnimationOptions.transitionCrossDissolve, + animations: { + replaceRootViewController() + }, completion: nil) + } else { + replaceRootViewController() + } + } + private init() {} } diff --git a/Example/stork-controller/Frameworks/sparrow/constraints/SPConstraintsAssistent.swift b/Example/stork-controller/Frameworks/sparrow/constraints/SPConstraintsAssistent.swift deleted file mode 100644 index 6dacc8e..0000000 --- a/Example/stork-controller/Frameworks/sparrow/constraints/SPConstraintsAssistent.swift +++ /dev/null @@ -1,71 +0,0 @@ -// The MIT License (MIT) -// Copyright © 2017 Ivan Vorobei (hello@ivanvorobei.by) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. - -import UIKit - -public struct SPConstraintsAssistent { - - static func setEqualSizeConstraint(_ subView: UIView, superVuew: UIView) { - subView.translatesAutoresizingMaskIntoConstraints = false; - let topMarginConstraint = NSLayoutConstraint( - item: subView, - attribute: NSLayoutConstraint.Attribute.topMargin, - relatedBy: NSLayoutConstraint.Relation.equal, - toItem: superVuew, - attribute: NSLayoutConstraint.Attribute.top, - multiplier: 1, - constant: 0) - - let bottomMarginConstraint = NSLayoutConstraint( - item: subView, - attribute: NSLayoutConstraint.Attribute.bottomMargin, - relatedBy: NSLayoutConstraint.Relation.equal, - toItem: superVuew, - attribute: NSLayoutConstraint.Attribute.bottom, - multiplier: 1, - constant: 0) - - let leadingMarginConstraint = NSLayoutConstraint( - item: subView, - attribute: NSLayoutConstraint.Attribute.leadingMargin, - relatedBy: NSLayoutConstraint.Relation.equal, - toItem: superVuew, - attribute: NSLayoutConstraint.Attribute.leading, - multiplier: 1, - constant: 0) - - let trailingMarginConstraint = NSLayoutConstraint( - item: subView, - attribute: NSLayoutConstraint.Attribute.trailingMargin, - relatedBy: NSLayoutConstraint.Relation.equal, - toItem: superVuew, - attribute: NSLayoutConstraint.Attribute.trailing, - multiplier: 1, - constant: 0) - - superVuew.addConstraints([ - topMarginConstraint, bottomMarginConstraint, leadingMarginConstraint, trailingMarginConstraint - ]) - } -} - - - diff --git a/Example/stork-controller/Frameworks/sparrow/device/SPDevice.swift b/Example/stork-controller/Frameworks/sparrow/device/SPDevice.swift index c1bce04..29ef854 100644 --- a/Example/stork-controller/Frameworks/sparrow/device/SPDevice.swift +++ b/Example/stork-controller/Frameworks/sparrow/device/SPDevice.swift @@ -24,11 +24,11 @@ import UIKit struct SPDevice { static var isIphone: Bool { - return UIDevice.current.isIphone + return UIDevice.current.userInterfaceIdiom == .phone } static var isIpad: Bool { - return UIDevice.current.isIpad + return UIDevice.current.userInterfaceIdiom == .pad } struct Orientation { diff --git a/Example/stork-controller/Frameworks/sparrow/extension/SPArrayExtension.swift b/Example/stork-controller/Frameworks/sparrow/extension/SPArrayExtension.swift index 4d7401a..5df5c1f 100644 --- a/Example/stork-controller/Frameworks/sparrow/extension/SPArrayExtension.swift +++ b/Example/stork-controller/Frameworks/sparrow/extension/SPArrayExtension.swift @@ -23,10 +23,8 @@ import Foundation extension Array { - func takeElements(count: Int) -> Array { - if (count < self.count) { - return Array(self[0.. Array { + if (count < self.count) { return Array(self[0.. Element? { - if let index = self.index(of: item), index + 1 < self.count { - return self[index + 1] - } + if let index = self.index(of: item), index + 1 < self.count { return self[index + 1] } return nil } } diff --git a/Example/stork-controller/Frameworks/sparrow/extension/SPCGPointExtenshion.swift b/Example/stork-controller/Frameworks/sparrow/extension/SPCGPointExtenshion.swift deleted file mode 100644 index 4dec6b8..0000000 --- a/Example/stork-controller/Frameworks/sparrow/extension/SPCGPointExtenshion.swift +++ /dev/null @@ -1,26 +0,0 @@ -// The MIT License (MIT) -// Copyright © 2017 Ivan Vorobei (hello@ivanvorobei.by) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. - -import UIKit - -func + (left: CGPoint, right: CGPoint) -> CGPoint { - return CGPoint(x: left.x + right.x, y: left.y + right.y) -} diff --git a/Example/stork-controller/Frameworks/sparrow/extension/SPCGRectExtension.swift b/Example/stork-controller/Frameworks/sparrow/extension/SPCGRectExtension.swift index ec05690..f1442f6 100644 --- a/Example/stork-controller/Frameworks/sparrow/extension/SPCGRectExtension.swift +++ b/Example/stork-controller/Frameworks/sparrow/extension/SPCGRectExtension.swift @@ -23,34 +23,17 @@ import UIKit extension CGRect { - static var displayFrame: CGRect { - let screenSize = UIScreen.main.bounds - return CGRect.init(origin: .zero, size: screenSize.size) - } - var bottomXPosition: CGFloat { - get { - return self.origin.x + self.width - } - set { - self.origin.x = newValue - self.width - } + get { return self.origin.x + self.width } + set { self.origin.x = newValue - self.width } } var bottomYPosition: CGFloat { - get { - return self.origin.y + self.height - } - set { - self.origin.y = newValue - self.height - } + get { return self.origin.y + self.height } + set { self.origin.y = newValue - self.height } } var minSideSize: CGFloat { return min(self.width, self.height) } - - var isWidthLessThanHeight: Bool { - return self.width < self.height - } } diff --git a/Example/stork-controller/Frameworks/sparrow/extension/SPCGSizeExtenshion.swift b/Example/stork-controller/Frameworks/sparrow/extension/SPCGSizeExtenshion.swift index 769276f..1376a52 100644 --- a/Example/stork-controller/Frameworks/sparrow/extension/SPCGSizeExtenshion.swift +++ b/Example/stork-controller/Frameworks/sparrow/extension/SPCGSizeExtenshion.swift @@ -23,15 +23,15 @@ import UIKit extension CGSize { - func resize(newWidth: CGFloat) -> CGSize { + func resize(width: CGFloat) -> CGSize { let relativeSideSize = self.width / self.height - let newHeight = newWidth / relativeSideSize - return CGSize.init(width: newWidth, height: newHeight) + let newHeight = width / relativeSideSize + return CGSize.init(width: width, height: newHeight) } - func resize(newHeight: CGFloat) -> CGSize { + func resize(height: CGFloat) -> CGSize { let relativeSideSize = self.width / self.height - let newWidth = newHeight * relativeSideSize - return CGSize.init(width: newWidth, height: newHeight) + let newWidth = height * relativeSideSize + return CGSize.init(width: newWidth, height: height) } } diff --git a/Example/stork-controller/Frameworks/sparrow/extension/SPCollectionExtenshion.swift b/Example/stork-controller/Frameworks/sparrow/extension/SPCollectionExtenshion.swift deleted file mode 100644 index 5f20b48..0000000 --- a/Example/stork-controller/Frameworks/sparrow/extension/SPCollectionExtenshion.swift +++ /dev/null @@ -1,29 +0,0 @@ -// The MIT License (MIT) -// Copyright © 2017 Ivan Vorobei (hello@ivanvorobei.by) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. - -import Foundation - -extension Collection { - - subscript (safe index: Index) -> Element? { - return indices.contains(index) ? self[index] : nil - } -} diff --git a/Example/stork-controller/Frameworks/sparrow/extension/SPDateExtenshon.swift b/Example/stork-controller/Frameworks/sparrow/extension/SPDateExtenshon.swift deleted file mode 100644 index e4f90ea..0000000 --- a/Example/stork-controller/Frameworks/sparrow/extension/SPDateExtenshon.swift +++ /dev/null @@ -1,32 +0,0 @@ -// The MIT License (MIT) -// Copyright © 2017 Ivan Vorobei (hello@ivanvorobei.by) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. - -import Foundation - -extension Date { - - func formatted(as dateFormat: String) -> String { - - let dateFormatter = DateFormatter() - dateFormatter.dateFormat = dateFormat - return dateFormatter.string(from: self) - } -} diff --git a/Example/stork-controller/Frameworks/sparrow/extension/SPStringExtenshion.swift b/Example/stork-controller/Frameworks/sparrow/extension/SPStringExtenshion.swift index 2df4c45..741ad77 100644 --- a/Example/stork-controller/Frameworks/sparrow/extension/SPStringExtenshion.swift +++ b/Example/stork-controller/Frameworks/sparrow/extension/SPStringExtenshion.swift @@ -66,20 +66,6 @@ extension String { return false } - mutating func reduce(minimumFractionDigits: Int = 0, maximumFractionDigits: Int) { - let formatter = NumberFormatter() - formatter.minimumFractionDigits = minimumFractionDigits - formatter.maximumFractionDigits = maximumFractionDigits - let int = Double(self) - if int != nil { - let number = NSNumber.init(value: int!) - if var newValue = formatter.string(from: number) { - newValue.replace(",", with: ".") - self = newValue - } - } - } - mutating func replace(_ replacingString: String, with newString: String) { self = self.replacingOccurrences(of: replacingString, with: newString) } diff --git a/Example/stork-controller/Frameworks/sparrow/extension/SPUIButtonExtenshion.swift b/Example/stork-controller/Frameworks/sparrow/extension/SPUIButtonExtenshion.swift index 1b0fea4..c072a9d 100644 --- a/Example/stork-controller/Frameworks/sparrow/extension/SPUIButtonExtenshion.swift +++ b/Example/stork-controller/Frameworks/sparrow/extension/SPUIButtonExtenshion.swift @@ -65,7 +65,8 @@ extension UIButton { } func setTitleColor(_ color: UIColor) { - self.setTitleColorForNoramlAndHightlightedStates(color: color) + self.setTitleColor(color, for: .normal) + self.setTitleColor(color.withAlphaComponent(0.7), for: .highlighted) } func removeAllTargets() { @@ -74,23 +75,18 @@ extension UIButton { func showText(_ text: String, withComplection completion: (() -> Void)! = {}) { let baseText = self.titleLabel?.text ?? " " - - SPAnimation.animate(0.2, - animations: { - self.titleLabel?.alpha = 0 + SPAnimation.animate(0.2, animations: { + self.titleLabel?.alpha = 0 }, withComplection: { self.setTitle(text, for: .normal) - SPAnimation.animate(0.2, animations: { self.titleLabel?.alpha = 1 }, withComplection: { - SPAnimation.animate(0.2, animations: { self.titleLabel?.alpha = 0 }, delay: 0.35, withComplection: { self.setTitle(baseText, for: .normal) - SPAnimation.animate(0.2, animations: { self.titleLabel?.alpha = 1 }, withComplection: { @@ -102,13 +98,10 @@ extension UIButton { } func setAnimatableText(_ text: String, withComplection completion: (() -> Void)! = {}) { - - SPAnimation.animate(0.2, - animations: { - self.titleLabel?.alpha = 0 + SPAnimation.animate(0.2, animations: { + self.titleLabel?.alpha = 0 }, withComplection: { self.setTitle(text, for: .normal) - SPAnimation.animate(0.2, animations: { self.titleLabel?.alpha = 1 }, withComplection: { @@ -118,25 +111,18 @@ extension UIButton { } func hideContent(completion: (() -> Void)! = {}) { - SPAnimation.animate(0.2, - animations: { - self.titleLabel?.alpha = 0 + SPAnimation.animate(0.2, animations: { + self.titleLabel?.alpha = 0 }, withComplection: { completion() }) } func showContent(completion: (() -> Void)! = {}) { - SPAnimation.animate(0.2, - animations: { - self.titleLabel?.alpha = 1 + SPAnimation.animate(0.2, animations: { + self.titleLabel?.alpha = 1 }, withComplection: { completion() }) } - - func setTitleColorForNoramlAndHightlightedStates(color: UIColor) { - self.setTitleColor(color, for: .normal) - self.setTitleColor(color.withAlphaComponent(0.7), for: .highlighted) - } } diff --git a/Example/stork-controller/Frameworks/sparrow/extension/SPUIFontExtenshion.swift b/Example/stork-controller/Frameworks/sparrow/extension/SPUIFontExtenshion.swift index d3dc28d..abadbb8 100644 --- a/Example/stork-controller/Frameworks/sparrow/extension/SPUIFontExtenshion.swift +++ b/Example/stork-controller/Frameworks/sparrow/extension/SPUIFontExtenshion.swift @@ -42,7 +42,7 @@ public extension UIFont { return UIFont.init( name: self.getFontNameBy(fontType: fontType) + self.getBoldTypeNameBy(boldType: boldType), size: size - )! + )! } private static func getFontNameBy(fontType: FontType) -> String { diff --git a/Example/stork-controller/Frameworks/sparrow/extension/SPUIImageExtension.swift b/Example/stork-controller/Frameworks/sparrow/extension/SPUIImageExtension.swift index f8a4e42..98dc51e 100644 --- a/Example/stork-controller/Frameworks/sparrow/extension/SPUIImageExtension.swift +++ b/Example/stork-controller/Frameworks/sparrow/extension/SPUIImageExtension.swift @@ -23,334 +23,13 @@ import UIKit public extension UIImage { - public func resize(newWidth: CGFloat) -> UIImage { - let scale = newWidth / self.size.width + public func resize(width: CGFloat) -> UIImage { + let scale = width / self.size.width let newHeight = self.size.height * scale - UIGraphicsBeginImageContext(CGSize(width: newWidth, height: newHeight)) - self.draw(in: CGRect(x: 0, y: 0, width: newWidth, height: newHeight)) + UIGraphicsBeginImageContext(CGSize(width: width, height: newHeight)) + self.draw(in: CGRect(x: 0, y: 0, width: width, height: newHeight)) let newImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return newImage! } - - public func resize(to size: CGSize) -> UIImage { - UIGraphicsBeginImageContextWithOptions(size, false, 0.0); - self.draw(in: CGRect(origin: CGPoint.zero, size: CGSize(width: size.width, height: size.height))) - let resizeImage:UIImage = UIGraphicsGetImageFromCurrentImageContext()! - UIGraphicsEndImageContext() - return resizeImage - } - - public class func drawFromView(view: UIView) -> UIImage { - UIGraphicsBeginImageContext(view.frame.size) - view.layer.render(in: UIGraphicsGetCurrentContext()!) - let image = UIGraphicsGetImageFromCurrentImageContext() - UIGraphicsEndImageContext() - return image! - } -} - -//MARK: - get assest colors - -extension UIImage { - private func resizeForUIImageColors(newSize: CGSize) -> UIImage { - UIGraphicsBeginImageContextWithOptions(newSize, false, 0) - defer { - UIGraphicsEndImageContext() - } - self.draw(in: CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height)) - guard let result = UIGraphicsGetImageFromCurrentImageContext() else { - fatalError("UIImageColors.resizeForUIImageColors failed: UIGraphicsGetImageFromCurrentImageContext returned nil.") - } - - return result - } - - - public func getColors(quality: UIImageAssestColorsQuality = .high, _ completion: @escaping (UIImageAssestColors) -> Void) { - DispatchQueue.global(qos: .background).async { - let result = self.getColors(quality: quality) - DispatchQueue.main.async { - completion(result) - } - } - } - - - public func getColors(quality: UIImageAssestColorsQuality = .high) -> UIImageAssestColors { - var scaleDownSize: CGSize = self.size - if quality != .highest { - if self.size.width < self.size.height { - let ratio = self.size.height/self.size.width - scaleDownSize = CGSize(width: quality.rawValue/ratio, height: quality.rawValue) - } else { - let ratio = self.size.width/self.size.height - scaleDownSize = CGSize(width: quality.rawValue, height: quality.rawValue/ratio) - } - } - - let cgImage = self.resizeForUIImageColors(newSize: scaleDownSize).cgImage! - let width: Int = cgImage.width - let height: Int = cgImage.height - - let threshold = Int(CGFloat(height)*0.01) - var proposed: [Double] = [-1,-1,-1,-1] - - guard let data = CFDataGetBytePtr(cgImage.dataProvider!.data) else { - fatalError("UIImageColors.getColors failed: could not get cgImage data.") - } - - let imageColors = NSCountedSet(capacity: width*height) - for x in 0.. ComparisonResult in - let m = main as! UIImageColorsCounter, o = other as! UIImageColorsCounter - if m.count < o.count { - return .orderedDescending - } else if m.count == o.count { - return .orderedSame - } else { - return .orderedAscending - } - } - - var enumerator = imageColors.objectEnumerator() - var sortedColors = NSMutableArray(capacity: imageColors.count) - while let K = enumerator.nextObject() as? Double { - let C = imageColors.count(for: K) - if threshold < C { - sortedColors.add(UIImageColorsCounter(color: K, count: C)) - } - } - sortedColors.sort(comparator: sortedColorComparator) - - var proposedEdgeColor: UIImageColorsCounter - if 0 < sortedColors.count { - proposedEdgeColor = sortedColors.object(at: 0) as! UIImageColorsCounter - } else { - proposedEdgeColor = UIImageColorsCounter(color: 0, count: 1) - } - - if proposedEdgeColor.color.isBlackOrWhite && 0 < sortedColors.count { - for i in 1.. 0.3 { - if !nextProposedEdgeColor.color.isBlackOrWhite { - proposedEdgeColor = nextProposedEdgeColor - break - } - } else { - break - } - } - } - proposed[0] = proposedEdgeColor.color - - enumerator = imageColors.objectEnumerator() - sortedColors.removeAllObjects() - sortedColors = NSMutableArray(capacity: imageColors.count) - let findDarkTextColor = !proposed[0].isDarkColor - - while var K = enumerator.nextObject() as? Double { - K = K.with(minSaturation: 0.15) - if K.isDarkColor == findDarkTextColor { - let C = imageColors.count(for: K) - sortedColors.add(UIImageColorsCounter(color: K, count: C)) - } - } - sortedColors.sort(comparator: sortedColorComparator) - - for color in sortedColors { - let color = (color as! UIImageColorsCounter).color - - if proposed[1] == -1 { - if color.isContrasting(proposed[0]) { - proposed[1] = color - } - } else if proposed[2] == -1 { - if !color.isContrasting(proposed[0]) || !proposed[1].isDistinct(color) { - continue - } - proposed[2] = color - } else if proposed[3] == -1 { - if !color.isContrasting(proposed[0]) || !proposed[2].isDistinct(color) || !proposed[1].isDistinct(color) { - continue - } - proposed[3] = color - break - } - } - - let isDarkBackground = proposed[0].isDarkColor - for i in 1...3 { - if proposed[i] == -1 { - proposed[i] = isDarkBackground ? 255255255:0 - } - } - - return UIImageAssestColors( - background: proposed[0].uicolor, - primary: proposed[1].uicolor, - secondary: proposed[2].uicolor, - detail: proposed[3].uicolor - ) - } -} - -public struct UIImageAssestColors { - public var background: UIColor! - public var primary: UIColor! - public var secondary: UIColor! - public var detail: UIColor! -} - -public enum UIImageAssestColorsQuality: CGFloat { - case lowest = 50 // 50px - case low = 100 // 100px - case high = 250 // 250px - case highest = 0 // No scale -} - -fileprivate struct UIImageColorsCounter { - let color: Double - let count: Int - init(color: Double, count: Int) { - self.color = color - self.count = count - } -} - -fileprivate extension Double { - - private var r: Double { - return fmod(floor(self/1000000),1000000) - } - - private var g: Double { - return fmod(floor(self/1000),1000) - } - - private var b: Double { - return fmod(self,1000) - } - - fileprivate var isDarkColor: Bool { - return (r*0.2126) + (g*0.7152) + (b*0.0722) < 127.5 - } - - fileprivate var isBlackOrWhite: Bool { - return (r > 232 && g > 232 && b > 232) || (r < 23 && g < 23 && b < 23) - } - - fileprivate func isDistinct(_ other: Double) -> Bool { - let _r = self.r - let _g = self.g - let _b = self.b - let o_r = other.r - let o_g = other.g - let o_b = other.b - - return (fabs(_r-o_r) > 63.75 || fabs(_g-o_g) > 63.75 || fabs(_b-o_b) > 63.75) - && !(fabs(_r-_g) < 7.65 && fabs(_r-_b) < 7.65 && fabs(o_r-o_g) < 7.65 && fabs(o_r-o_b) < 7.65) - } - - fileprivate func with(minSaturation: Double) -> Double { - // Ref: https://en.wikipedia.org/wiki/HSL_and_HSV - - // Convert RGB to HSV - - let _r = r/255 - let _g = g/255 - let _b = b/255 - var H, S, V: Double - let M = fmax(_r,fmax(_g, _b)) - var C = M-fmin(_r,fmin(_g, _b)) - - V = M - S = V == 0 ? 0:C/V - - if minSaturation <= S { - return self - } - - if C == 0 { - H = 0 - } else if _r == M { - H = fmod((_g-_b)/C, 6) - } else if _g == M { - H = 2+((_b-_r)/C) - } else { - H = 4+((_r-_g)/C) - } - - if H < 0 { - H += 6 - } - - // Back to RGB - - C = V*minSaturation - let X = C*(1-fabs(fmod(H,2)-1)) - var R, G, B: Double - - switch H { - case 0...1: - R = C - G = X - B = 0 - case 1...2: - R = X - G = C - B = 0 - case 2...3: - R = 0 - G = C - B = X - case 3...4: - R = 0 - G = X - B = C - case 4...5: - R = X - G = 0 - B = C - case 5..<6: - R = C - G = 0 - B = X - default: - R = 0 - G = 0 - B = 0 - } - - let m = V-C - - return (floor((R + m)*255)*1000000)+(floor((G + m)*255)*1000)+floor((B + m)*255) - } - - fileprivate func isContrasting(_ color: Double) -> Bool { - let bgLum = (0.2126*r)+(0.7152*g)+(0.0722*b)+12.75 - let fgLum = (0.2126*color.r)+(0.7152*color.g)+(0.0722*color.b)+12.75 - if bgLum > fgLum { - return 1.6 < bgLum/fgLum - } else { - return 1.6 < fgLum/bgLum - } - } - - fileprivate var uicolor: UIColor { - return UIColor(red: CGFloat(r)/255, green: CGFloat(g)/255, blue: CGFloat(b)/255, alpha: 1) - } - - fileprivate var pretty: String { - return "\(Int(self.r)), \(Int(self.g)), \(Int(self.b))" - } } diff --git a/Example/stork-controller/Frameworks/sparrow/extension/SPUIImageViewExtenshion.swift b/Example/stork-controller/Frameworks/sparrow/extension/SPUIImageViewExtenshion.swift index aa83aed..c8e9be9 100644 --- a/Example/stork-controller/Frameworks/sparrow/extension/SPUIImageViewExtenshion.swift +++ b/Example/stork-controller/Frameworks/sparrow/extension/SPUIImageViewExtenshion.swift @@ -23,17 +23,12 @@ import UIKit extension UIImageView { - public func setNativeStyle() { + public func setNative() { self.layer.borderWidth = 0.5 self.layer.borderColor = SPNativeStyleKit.Colors.midGray.cgColor self.layer.masksToBounds = true } - public func removeNativeStyle() { - self.layer.borderWidth = 0 - self.layer.borderColor = UIColor.clear.cgColor - } - public func downloadedFrom(url: URL, contentMode mode: UIView.ContentMode = .scaleAspectFit, withComplection complection: @escaping (UIImage?) -> () = {_ in }) { DispatchQueue.main.async { self.contentMode = mode diff --git a/Example/stork-controller/Frameworks/sparrow/extension/SPUITabBarControllerExtenshion.swift b/Example/stork-controller/Frameworks/sparrow/extension/SPUITabBarControllerExtenshion.swift index a2e0ec5..d67d5b7 100644 --- a/Example/stork-controller/Frameworks/sparrow/extension/SPUITabBarControllerExtenshion.swift +++ b/Example/stork-controller/Frameworks/sparrow/extension/SPUITabBarControllerExtenshion.swift @@ -23,50 +23,17 @@ import UIKit extension UITabBarController { - func addTabBarItem(titleName: String, imageName: String, viewController: UIViewController) { - - let image = UIImage.init(named: imageName) - - self.addTabBarItem( - titleName: titleName, - image: image ?? UIImage(), - viewController: viewController - ) - } - - func addTabBarItem(titleName: String, image: UIImage, viewController: UIViewController) { + func addTabBarItem(title: String, image: UIImage, selectedImage: UIImage? = nil, controller: UIViewController) { let tabBarItem = UITabBarItem( - title: titleName, + title: title, image: image, - selectedImage: image + selectedImage: selectedImage ?? image ) - viewController.tabBarItem = tabBarItem + controller.tabBarItem = tabBarItem - if self.viewControllers == nil { - self.viewControllers = [viewController] - } else { - self.viewControllers?.append(viewController) - } + if self.viewControllers == nil { self.viewControllers = [controller] } + else { self.viewControllers?.append(controller) } } - - @objc func addTabBarItem(titleName: String, image: UIImage, selectedImage: UIImage, viewController: UIViewController) { - - let tabBarItem = UITabBarItem( - title: titleName, - image: image, - selectedImage: selectedImage - ) - - viewController.tabBarItem = tabBarItem - - if self.viewControllers == nil { - self.viewControllers = [viewController] - } else { - self.viewControllers?.append(viewController) - } - } - - } diff --git a/Example/stork-controller/Frameworks/sparrow/extension/SPUITableView.swift b/Example/stork-controller/Frameworks/sparrow/extension/SPUITableView.swift index 23d29bd..c1015f9 100644 --- a/Example/stork-controller/Frameworks/sparrow/extension/SPUITableView.swift +++ b/Example/stork-controller/Frameworks/sparrow/extension/SPUITableView.swift @@ -36,50 +36,24 @@ extension UITableView { } var lastSectionWithRows: Int? { - - if self.numberOfSections == 0 { - return nil - } - + if self.numberOfSections == 0 { return nil } var section = self.numberOfSections - 1 - - if section < 0 { - return nil - } - + if section < 0 { return nil } while section >= 0 { - - if self.numberOfRows(inSection: section) != 0 { - return section - } - + if self.numberOfRows(inSection: section) != 0 { return section } section -= 1 } - return nil } var firstSectionWithRows: Int? { - - if self.numberOfSections == 0 { - return nil - } - + if self.numberOfSections == 0 { return nil } var section = 0 - - if section > self.numberOfSections - 1 { - return nil - } - + if section > self.numberOfSections - 1 { return nil } while section <= (self.numberOfSections - 1) { - - if self.numberOfRows(inSection: section) != 0 { - return section - } - + if self.numberOfRows(inSection: section) != 0 { return section } section += 1 } - return nil } } diff --git a/Example/stork-controller/Frameworks/sparrow/extension/SPUIViewControllerExtenshion.swift b/Example/stork-controller/Frameworks/sparrow/extension/SPUIViewControllerExtenshion.swift index 0894eae..3cecd3b 100644 --- a/Example/stork-controller/Frameworks/sparrow/extension/SPUIViewControllerExtenshion.swift +++ b/Example/stork-controller/Frameworks/sparrow/extension/SPUIViewControllerExtenshion.swift @@ -39,7 +39,6 @@ extension UIViewController { } } -//MARK: - Keyboard extension UIViewController { func dismissKeyboardWhenTappedAround() { @@ -53,7 +52,6 @@ extension UIViewController { } } -//MARK: - Add image to Library extension UIViewController { func save(image: UIImage) { @@ -107,7 +105,6 @@ extension UIViewController { } } -//MARK: - Navigation Bar extension UIViewController { func setPrefersLargeNavigationTitle(_ title: String, smallScreenToSmallBar: Bool = true) { @@ -136,28 +133,28 @@ extension UIViewController { if #available(iOS 11.0, *) { self.navigationItem.largeTitleDisplayMode = .never } - } + case .stork: + if #available(iOS 11.0, *) { + self.navigationItem.largeTitleDisplayMode = .never + } + } } } extension UIViewController { - var topSafeArea: CGFloat { - return self.view.topSafeArea - } - - var bottomSafeArea: CGFloat { - return self.view.bottomSafeArea + var safeArea: UIEdgeInsets { + if #available(iOS 11.0, *) { + return self.view.safeAreaInsets + } else { + return UIEdgeInsets.zero + } } var navigationBarHeight: CGFloat { return self.navigationController?.navigationBar.frame.height ?? 0 } - var statusBarHeight: CGFloat { - return UIViewController.statusBarHeight - } - static var statusBarHeight: CGFloat { return UIApplication.shared.statusBarFrame.height } diff --git a/Example/stork-controller/Frameworks/sparrow/extension/SPUIViewExtenshion.swift b/Example/stork-controller/Frameworks/sparrow/extension/SPUIViewExtenshion.swift index 0b97a43..3a0387c 100644 --- a/Example/stork-controller/Frameworks/sparrow/extension/SPUIViewExtenshion.swift +++ b/Example/stork-controller/Frameworks/sparrow/extension/SPUIViewExtenshion.swift @@ -21,7 +21,17 @@ import UIKit -// MARK: - layout +public extension UIView { + + var viewController: UIViewController? { + get { + if let nextResponder = self.next as? UIViewController { return nextResponder } + else if let nextResponder = self.next as? UIView { return nextResponder.viewController } + else { return nil } + } + } +} + public extension UIView { var topSafeArea: CGFloat { @@ -49,21 +59,16 @@ public extension UIView { } func setEqualsFrameFromBounds(_ view: UIView, withWidthFactor widthFactor: CGFloat = 1, maxWidth: CGFloat? = nil, withHeightFactor heightFactor: CGFloat = 1, maxHeight: CGFloat? = nil, withCentering: Bool = false) { - self.setEqualsFrameFromBounds(view.bounds, withWidthFactor: widthFactor, maxWidth: maxWidth, withHeightFactor: heightFactor, maxHeight: maxHeight, withCentering: withCentering) } func setEqualsFrameFromBounds(_ bounds: CGRect, withWidthFactor widthFactor: CGFloat = 1, maxWidth: CGFloat? = nil, withHeightFactor heightFactor: CGFloat = 1, maxHeight: CGFloat? = nil, withCentering: Bool = false) { var width = bounds.width * widthFactor - if maxWidth != nil { - width.setIfMore(when: maxWidth!) - } + if maxWidth != nil { width.setIfMore(when: maxWidth!) } var height = bounds.height * heightFactor - if maxHeight != nil { - height.setIfMore(when: maxHeight!) - } + if maxHeight != nil { height.setIfMore(when: maxHeight!) } self.frame = CGRect.init(x: 0, y: 0, width: width, height: height) @@ -74,27 +79,19 @@ public extension UIView { } func setEqualsBoundsFromSuperview(customWidth: CGFloat? = nil, customHeight: CGFloat? = nil) { - - if self.superview == nil { - return - } - + if self.superview == nil { return } self.frame = CGRect.init(origin: CGPoint.zero, size: self.superview!.frame.size) - if customWidth != nil { self.frame = CGRect.init(origin: CGPoint.zero, size: CGSize.init(width: customWidth!, height: self.frame.height)) } - if customHeight != nil { self.frame = CGRect.init(origin: CGPoint.zero, size: CGSize.init(width: self.frame.width, height: customHeight!)) } } - func resize(newWidth width: CGFloat) { + func resize(width: CGFloat) { let relativeFactor = self.frame.width / self.frame.height - if relativeFactor.isNaN { - return - } + if relativeFactor.isNaN { return } self.frame = CGRect.init( x: self.frame.origin.x, y: self.frame.origin.y, @@ -103,11 +100,9 @@ public extension UIView { ) } - func resize(newHeight height: CGFloat) { + func resize(height: CGFloat) { let relativeFactor = self.frame.width / self.frame.height - if relativeFactor.isNaN { - return - } + if relativeFactor.isNaN { return } self.frame = CGRect.init( x: self.frame.origin.x, y: self.frame.origin.y, @@ -116,6 +111,10 @@ public extension UIView { ) } + func setYCenteringFromSuperview() { + self.center.y = (self.superview?.frame.height ?? 0) / 2 + } + func setXCenteringFromSuperview() { self.center.x = (self.superview?.frame.width ?? 0) / 2 } @@ -148,29 +147,19 @@ public extension UIView { } } -// MARK: - convertToImage -public extension UIView { - - func convertToImage() -> UIImage { - return UIImage.drawFromView(view: self) - } -} - -// MARK: - gradeView public extension UIView { func addGrade(alpha: CGFloat, color: UIColor = UIColor.black) -> UIView { let gradeView = UIView.init() gradeView.alpha = 0 self.addSubview(gradeView) - SPConstraintsAssistent.setEqualSizeConstraint(gradeView, superVuew: self) + SPConstraints.setEqualSize(gradeView, superVuew: self) gradeView.alpha = alpha gradeView.backgroundColor = color return gradeView } } -// MARK: - shadow extension UIView { func setShadow( @@ -249,7 +238,6 @@ extension UIView { } } -// MARK: - animation extension UIView { func addCornerRadiusAnimation(to: CGFloat, duration: CFTimeInterval) { @@ -282,7 +270,6 @@ extension UIView { } } -// MARK: - corner radius extension UIView { func roundCorners(_ corners: UIRectCorner, radius: CGFloat) { diff --git a/Example/stork-controller/Frameworks/sparrow/permission/dialog/SPPermissionDialogController.swift b/Example/stork-controller/Frameworks/sparrow/permission/dialog/SPPermissionDialogController.swift index 41e5295..e70666a 100644 --- a/Example/stork-controller/Frameworks/sparrow/permission/dialog/SPPermissionDialogController.swift +++ b/Example/stork-controller/Frameworks/sparrow/permission/dialog/SPPermissionDialogController.swift @@ -213,7 +213,7 @@ public class SPPermissionDialogController: SPBaseViewController { self.bottomLabel.sizeToFit() self.bottomLabel.setWidth(bottomLabelWidth) self.bottomLabel.center.x = size.width / 2 - self.bottomLabel.frame.bottomYPosition = size.height - self.bottomSafeArea - 30 + self.bottomLabel.frame.bottomYPosition = size.height - self.safeArea.bottom - 30 self.bottomLabel.setShadowOffsetForLetters(blurRadius: 3, widthOffset: 0, heightOffset: 0, opacity: 0.18) let bottomLabelAlpha: CGFloat = SPDevice.Orientation.isPortrait ? 1 : 0 diff --git a/Example/stork-controller/Frameworks/sparrow/style-kit/SPNativeStyleKit.swift b/Example/stork-controller/Frameworks/sparrow/style-kit/SPNativeStyleKit.swift index bb35efd..ec975b0 100644 --- a/Example/stork-controller/Frameworks/sparrow/style-kit/SPNativeStyleKit.swift +++ b/Example/stork-controller/Frameworks/sparrow/style-kit/SPNativeStyleKit.swift @@ -40,5 +40,9 @@ public struct SPNativeStyleKit { static let midGray = UIColor.init(hex: "C7C7CC") static let gray = UIColor.init(hex: "8E8E93") static let black = UIColor.init(hex: "000000") + + private init() {} } + + private init() {} } diff --git a/Example/stork-controller/Frameworks/sparrow/types/SPTypes.swift b/Example/stork-controller/Frameworks/sparrow/types/SPTypes.swift index f7f3460..007b7ae 100644 --- a/Example/stork-controller/Frameworks/sparrow/types/SPTypes.swift +++ b/Example/stork-controller/Frameworks/sparrow/types/SPTypes.swift @@ -110,6 +110,7 @@ public enum SPSeparatorInsetStyle { public enum SPNavigationTitleStyle { case large case small + case stork } public enum SPSystemApp { diff --git a/Example/stork-controller/Frameworks/sparrow/ui/buttons/SPAppStoreActionButton.swift b/Example/stork-controller/Frameworks/sparrow/ui/buttons/SPAppStoreActionButton.swift index dfaf36f..37cca19 100644 --- a/Example/stork-controller/Frameworks/sparrow/ui/buttons/SPAppStoreActionButton.swift +++ b/Example/stork-controller/Frameworks/sparrow/ui/buttons/SPAppStoreActionButton.swift @@ -26,7 +26,7 @@ class SPAppStoreActionButton: SPDownloadingButton { var style: Style = .base { didSet { - self.setTitleColorForNoramlAndHightlightedStates(color: self.baseColor) + self.setTitleColor(self.baseColor) self.setTitle(self.titleLabel?.text, for: UIControl.State.normal) switch self.style { @@ -38,14 +38,14 @@ class SPAppStoreActionButton: SPDownloadingButton { case .main: self.backgroundColor = self.baseColor self.layer.borderWidth = 0 - self.setTitleColorForNoramlAndHightlightedStates(color: UIColor.white) + self.setTitleColor(UIColor.white) self.titleLabel?.font = UIFont.system(type: .Bold, size: 14) self.contentEdgeInsets = UIEdgeInsets.init(top: 6, left: 15, bottom: 6, right: 15) break case .buyInStore: self.backgroundColor = self.baseColor self.layer.borderWidth = 0 - self.setTitleColorForNoramlAndHightlightedStates(color: UIColor.white) + self.setTitleColor(UIColor.white) self.titleLabel?.font = UIFont.system(type: .Bold, size: 14) self.contentEdgeInsets = UIEdgeInsets.init(top: 8, left: 15, bottom: 8, right: 15) break @@ -73,17 +73,7 @@ class SPAppStoreActionButton: SPDownloadingButton { } } - init() { - super.init(frame: CGRect.zero) - self.commonInit() - } - - required init?(coder aDecoder: NSCoder) { - super.init(coder: aDecoder) - self.commonInit() - } - - private func commonInit() { + override func commonInit() { self.style = .base self.layer.masksToBounds = true } diff --git a/Example/stork-controller/Frameworks/sparrow/ui/buttons/SPDownloadingButton.swift b/Example/stork-controller/Frameworks/sparrow/ui/buttons/SPDownloadingButton.swift index d4be07b..2c1b847 100644 --- a/Example/stork-controller/Frameworks/sparrow/ui/buttons/SPDownloadingButton.swift +++ b/Example/stork-controller/Frameworks/sparrow/ui/buttons/SPDownloadingButton.swift @@ -21,7 +21,7 @@ import UIKit -class SPDownloadingButton: UIButton { +class SPDownloadingButton: SPButton { let activityIndicatorView = UIActivityIndicatorView.init() var isFrameRounded: Bool = false diff --git a/Example/stork-controller/Frameworks/sparrow/ui/buttons/SPPlayCircleButton.swift b/Example/stork-controller/Frameworks/sparrow/ui/buttons/SPPlayCircleButton.swift index d86befb..806f7f7 100644 --- a/Example/stork-controller/Frameworks/sparrow/ui/buttons/SPPlayCircleButton.swift +++ b/Example/stork-controller/Frameworks/sparrow/ui/buttons/SPPlayCircleButton.swift @@ -71,7 +71,5 @@ class SPPlayCircleButton: UIButton { case pause case stop } - - } diff --git a/Example/stork-controller/Frameworks/sparrow/ui/buttons/SPRoundButton.swift b/Example/stork-controller/Frameworks/sparrow/ui/buttons/SPRoundButton.swift deleted file mode 100644 index 2b6f257..0000000 --- a/Example/stork-controller/Frameworks/sparrow/ui/buttons/SPRoundButton.swift +++ /dev/null @@ -1,75 +0,0 @@ -// The MIT License (MIT) -// Copyright © 2017 Ivan Vorobei (hello@ivanvorobei.by) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. - -import UIKit - -public class SPRoundButton: SPRoundFrameButton { - - override init(frame: CGRect) { - super.init(frame: frame) - self.commonInit() - } - - required public init?(coder aDecoder: NSCoder) { - super.init(coder: aDecoder) - self.commonInit() - } - - - private func commonInit() { - self.backgroundColor = UIColor.white - self.layer.borderWidth = 0 - } -} - -public class SPRoundLineButton: SPRoundFrameButton { - - override init(frame: CGRect) { - super.init(frame: frame) - self.commonInit() - } - - required public init?(coder aDecoder: NSCoder) { - super.init(coder: aDecoder) - self.commonInit() - } - - - private func commonInit() { - self.backgroundColor = UIColor.clear - self.layer.borderWidth = 2 - self.layer.borderColor = UIColor(hue: 0, - saturation: 0, - brightness: 100, - alpha: 0.5).cgColor - self.layer.borderColor = UIColor.init(white: 1, alpha: 0.5).cgColor - } -} - -public class SPRoundFrameButton: UIButton { - - override public func layoutSubviews() { - super.layoutSubviews() - let minSide = min(self.frame.width, self.frame.height) - self.layer.cornerRadius = minSide / 2 - self.clipsToBounds = true - } -} diff --git a/Example/stork-controller/Frameworks/sparrow/ui/controllers/SPBaseTableViewController.swift b/Example/stork-controller/Frameworks/sparrow/ui/controllers/SPBaseTableViewController.swift index 8835252..60d0727 100644 --- a/Example/stork-controller/Frameworks/sparrow/ui/controllers/SPBaseTableViewController.swift +++ b/Example/stork-controller/Frameworks/sparrow/ui/controllers/SPBaseTableViewController.swift @@ -59,7 +59,7 @@ class SPBaseTableViewController: SPStatusBarManagerTableViewController { func updateLayout(with size: CGSize) { let layoutIfShowKeyboard = { - let height = size.height - (self.keyboardSize?.height ?? 0) - self.topSafeArea + let height = size.height - (self.keyboardSize?.height ?? 0) - self.safeArea.top self.emptyProposeView?.frame = CGRect.init( x: 0, y: 0, width: size.width * self.emptyProposeViewWidthFactor, @@ -69,7 +69,7 @@ class SPBaseTableViewController: SPStatusBarManagerTableViewController { } let layoutIfNotShowKeyboard = { - let height = size.height - self.topSafeArea - self.bottomSafeArea + let height = size.height - self.safeArea.top - self.safeArea.bottom self.emptyProposeView?.frame = CGRect.init( x: 0, y: 0, width: size.width * self.emptyProposeViewWidthFactor, @@ -93,7 +93,7 @@ class SPBaseTableViewController: SPStatusBarManagerTableViewController { } else { self.activityIndicatorView.center = CGPoint.init( x: size.width / 2, - y: (size.height - self.topSafeArea - self.bottomSafeArea) / 2 + y: (size.height - self.safeArea.top - self.safeArea.bottom) / 2 ) } } @@ -299,4 +299,13 @@ class SPBaseTableViewController: SPStatusBarManagerTableViewController { @objc func dismiss(sender: Any) { self.dismiss() } + + func addHideButton(title: String) { + self.navigationItem.rightBarButtonItem = UIBarButtonItem.init( + title: title, + style: UIBarButtonItem.Style.done, + target: self, + action: #selector(self.dismiss(sender:)) + ) + } } diff --git a/Example/stork-controller/Frameworks/sparrow/ui/controllers/SPBaseViewController.swift b/Example/stork-controller/Frameworks/sparrow/ui/controllers/SPBaseViewController.swift index 5d4e7a4..b8fa25d 100644 --- a/Example/stork-controller/Frameworks/sparrow/ui/controllers/SPBaseViewController.swift +++ b/Example/stork-controller/Frameworks/sparrow/ui/controllers/SPBaseViewController.swift @@ -59,14 +59,14 @@ public class SPBaseViewController: SPStatusBarManagerViewController { func updateLayout(with size: CGSize) { - var contentHeight = size.height - self.topSafeArea + var contentHeight = size.height - self.safeArea.top if self.isShowKeyboard { contentHeight = contentHeight - (self.keyboardSize?.height ?? 0) } else { - contentHeight = contentHeight - self.bottomSafeArea + contentHeight = contentHeight - self.safeArea.bottom } - let centerYPosition = self.topSafeArea + (contentHeight / 2) + let centerYPosition = self.safeArea.top + (contentHeight / 2) if self.activityIndicatorLayoutWithSafeArea { self.activityIndicatorView.center = CGPoint.init( @@ -88,7 +88,7 @@ public class SPBaseViewController: SPStatusBarManagerViewController { self.emptyProposeView?.frame = CGRect.init( x: 0, y: 0, width: emptyProposeViewWidth, - height: (size.height - self.topSafeArea - self.bottomSafeArea) * self.emptyProposeViewHeightFactor + height: (size.height - self.safeArea.top - self.safeArea.bottom) * self.emptyProposeViewHeightFactor ) self.emptyProposeView?.center = CGPoint.init( x: size.width / 2, @@ -103,6 +103,19 @@ public class SPBaseViewController: SPStatusBarManagerViewController { } } + func addHideButton(title: String) { + self.navigationItem.rightBarButtonItem = UIBarButtonItem.init( + title: title, + style: UIBarButtonItem.Style.done, + target: self, + action: #selector(self.dismiss(sender:)) + ) + } + + @objc func dismiss(sender: Any) { + self.dismiss() + } + //MARK: - keyboard var isShowKeyboard: Bool = false var keyboardSize: CGSize? = nil diff --git a/Example/stork-controller/Frameworks/sparrow/ui/controllers/SPConfirmActionViewController.swift b/Example/stork-controller/Frameworks/sparrow/ui/controllers/SPConfirmActionViewController.swift index 5a65008..8052ec4 100644 --- a/Example/stork-controller/Frameworks/sparrow/ui/controllers/SPConfirmActionViewController.swift +++ b/Example/stork-controller/Frameworks/sparrow/ui/controllers/SPConfirmActionViewController.swift @@ -166,7 +166,7 @@ class SPConfirmActionViewController: UIViewController { self.addSubview(self.label) self.button.setTitle("Сancel", for: .normal) - self.button.setTitleColorForNoramlAndHightlightedStates(color: SPNativeStyleKit.Colors.blue) + self.button.setTitleColor(SPNativeStyleKit.Colors.blue) self.button.titleLabel?.font = UIFont.system(type: .DemiBold, size: 16) self.addSubview(self.button) } diff --git a/Example/stork-controller/Frameworks/sparrow/ui/controllers/SPHiderViewController.swift b/Example/stork-controller/Frameworks/sparrow/ui/controllers/SPHiderViewController.swift deleted file mode 100644 index 08bad73..0000000 --- a/Example/stork-controller/Frameworks/sparrow/ui/controllers/SPHiderViewController.swift +++ /dev/null @@ -1,76 +0,0 @@ -// The MIT License (MIT) -// Copyright © 2017 Ivan Vorobei (hello@ivanvorobei.by) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. - -import UIKit - -class SPHiderViewController: SPBaseViewController { - - let backgroundView = SPGradeBlurView.init() - - private var durationAnimation: TimeInterval = 0.3 - - override func viewDidLoad() { - super.viewDidLoad() - - self.statusBar = .light - - self.view.backgroundColor = UIColor.clear - - self.backgroundView.setGradeColor(UIColor.black) - self.activityIndicatorView.alpha = 0 - self.backgroundView.setGradeAlpha(0, blurRaius: 0) - self.view.addSubview(self.backgroundView) - - self.activityIndicatorView.startAnimating() - self.view.addSubview(self.activityIndicatorView) - - self.updateLayout(with: self.view.frame.size) - } - - override func updateLayout(with size: CGSize) { - self.backgroundView.frame = CGRect.init(origin: CGPoint.zero, size: size) - self.activityIndicatorView.center = CGPoint.init(x: size.width / 2, y: size.height / 2) - } - - func present(on viewController: UIViewController) { - self.modalTransitionStyle = .crossDissolve - self.modalPresentationStyle = .overCurrentContext - viewController.present(self, animated: false) { - SPAnimation.animate(self.durationAnimation, animations: { - self.backgroundView.setGradeAlpha(0.5, blurRaius: 8) - }) - SPAnimation.animate(self.durationAnimation * 1.5, animations: { - self.activityIndicatorView.alpha = 1 - }, delay: self.durationAnimation / 1.5) - } - } - - override func dismiss() { - SPAnimation.animate(self.durationAnimation / 1.2, animations: { - self.activityIndicatorView.alpha = 0 - }) - SPAnimation.animate(self.durationAnimation, animations: { - self.backgroundView.setGradeAlpha(0, blurRaius: 0) - }, delay: 0) { - self.dismiss(animated: false, completion: nil) - } - } -} diff --git a/Example/stork-controller/Frameworks/sparrow/ui/controllers/SPNativeTableViewController.swift b/Example/stork-controller/Frameworks/sparrow/ui/controllers/SPNativeTableViewController.swift index a93cfb5..7af04a9 100644 --- a/Example/stork-controller/Frameworks/sparrow/ui/controllers/SPNativeTableViewController.swift +++ b/Example/stork-controller/Frameworks/sparrow/ui/controllers/SPNativeTableViewController.swift @@ -183,19 +183,6 @@ extension SPNativeTableViewController { } -//MARK: - hide button -extension SPNativeTableViewController { - - func addHideButton(title: String) { - self.navigationItem.rightBarButtonItem = UIBarButtonItem.init( - title: title, - style: UIBarButtonItem.Style.done, - target: self, - action: #selector(self.dismiss(sender:)) - ) - } -} - //MARK: - manage spaces extension SPNativeTableViewController { diff --git a/Example/stork-controller/Frameworks/sparrow/ui/controllers/SPProgressLoadingViewController.swift b/Example/stork-controller/Frameworks/sparrow/ui/controllers/SPProgressLoadingViewController.swift deleted file mode 100644 index c14d301..0000000 --- a/Example/stork-controller/Frameworks/sparrow/ui/controllers/SPProgressLoadingViewController.swift +++ /dev/null @@ -1,94 +0,0 @@ -// The MIT License (MIT) -// Copyright © 2017 Ivan Vorobei (hello@ivanvorobei.by) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. - -import UIKit - -class SPProgressLoadingViewController: SPBaseViewController { - - let titleLabel = UILabel.init() - let subtitleLabel = UILabel.init() - let progressView = UIProgressView.init(progressViewStyle: UIProgressView.Style.default) - let commentLabel = UILabel.init() - - override func viewDidLoad() { - super.viewDidLoad() - - self.view.backgroundColor = SPNativeStyleKit.Colors.white - - self.titleLabel.text = "Title" - self.titleLabel.font = UIFont.system(type: UIFont.BoldType.Medium, size: 23) - self.titleLabel.textColor = SPNativeStyleKit.Colors.black - self.titleLabel.numberOfLines = 1 - self.view.addSubview(self.titleLabel) - - self.subtitleLabel.text = "Subtitle..." - self.subtitleLabel.setCenteringAlignment() - self.subtitleLabel.font = UIFont.system(type: UIFont.BoldType.Regular, size: 13) - self.subtitleLabel.textColor = SPNativeStyleKit.Colors.gray - self.subtitleLabel.numberOfLines = 1 - self.view.addSubview(self.subtitleLabel) - - self.progressView.progress = 0 - self.view.addSubview(self.progressView) - - self.activityIndicatorView.color = SPNativeStyleKit.Colors.gray - self.activityIndicatorView.startAnimating() - self.view.addSubview(self.activityIndicatorView) - - self.commentLabel.text = "Comment" - self.commentLabel.setCenteringAlignment() - self.commentLabel.font = UIFont.system(type: UIFont.BoldType.Regular, size: 11) - self.commentLabel.textColor = SPNativeStyleKit.Colors.gray - self.commentLabel.numberOfLines = 1 - self.view.addSubview(self.commentLabel) - - self.updateLayout(with: self.view.frame.size) - } - - func set(progress: Float) { - self.progressView.setProgress(progress, animated: true) - } - - override func updateLayout(with size: CGSize) { - self.titleLabel.sizeToFit() - self.titleLabel.center.x = size.width / 2 - - self.subtitleLabel.sizeToFit() - self.subtitleLabel.center.x = size.width / 2 - - self.progressView.setWidth(size.width * 0.55) - self.progressView.center.x = size.width / 2 - - self.activityIndicatorView.sizeToFit() - self.activityIndicatorView.center.x = size.width / 2 - - let allHeight = self.titleLabel.frame.height + 5 + self.subtitleLabel.frame.height + 30 + self.progressView.frame.height + 30 + self.activityIndicatorView.frame.height - - self.titleLabel.frame.origin.y = (size.height - allHeight - self.topSafeArea) / 2 - self.subtitleLabel.frame.origin.y = self.titleLabel.frame.bottomYPosition + 5 - self.progressView.frame.origin.y = self.subtitleLabel.frame.bottomYPosition + 30 - self.activityIndicatorView.frame.origin.y = self.progressView.frame.bottomYPosition + 30 - - self.commentLabel.sizeToFit() - self.commentLabel.center.x = size.width / 2 - self.commentLabel.frame.origin.y = size.height - (self.view.bottomSafeArea + self.commentLabel.frame.height + 5) - } -} diff --git a/Example/stork-controller/Frameworks/sparrow/ui/controllers/SPProposeViewController.swift b/Example/stork-controller/Frameworks/sparrow/ui/controllers/SPProposeViewController.swift index 02355a7..dc9ee83 100644 --- a/Example/stork-controller/Frameworks/sparrow/ui/controllers/SPProposeViewController.swift +++ b/Example/stork-controller/Frameworks/sparrow/ui/controllers/SPProposeViewController.swift @@ -83,7 +83,7 @@ class SPProposeViewController: SPBaseViewController { self.areaView.layoutSubviews() self.areaView.sizeToFit() self.areaView.frame.origin.x = self.space - self.areaView.frame.origin.y = self.view.frame.size.height - self.areaView.frame.height - (UIWindow.bottomSafeArea / 2) - self.space + self.areaView.frame.origin.y = self.view.frame.size.height - self.areaView.frame.height - (self.bottomSafeArea / 2) - self.space } @@ -95,7 +95,7 @@ class SPProposeViewController: SPBaseViewController { SPAnimationSpring.animate(self.animationDuration, animations: { self.view.backgroundColor = UIColor.black.withAlphaComponent(0.6) - self.areaView.frame.origin.y = self.view.frame.size.height - self.areaView.frame.height - (UIWindow.bottomSafeArea / 2) - self.space + self.areaView.frame.origin.y = self.view.frame.size.height - self.areaView.frame.height - (self.bottomSafeArea / 2) - self.space }, spring: 1, velocity: 1, options: .transitionCurlUp) @@ -134,7 +134,7 @@ class SPProposeViewController: SPBaseViewController { let returnAreaViewToPoint = { SPAnimationSpring.animate(self.animationDuration, animations: { - self.areaView.frame.origin.y = self.view.frame.size.height - self.areaView.frame.height - (UIWindow.bottomSafeArea / 2) - self.space + self.areaView.frame.origin.y = self.view.frame.size.height - self.areaView.frame.height - (self.bottomSafeArea / 2) - self.space }, spring: 1, velocity: 1, options: .transitionCurlDown, @@ -173,7 +173,7 @@ class SPProposeViewController: SPBaseViewController { let titleLabel = UILabel() let subtitleLabel = UILabel() let imageView = SPDownloadingImageView() - let button = SPNativeOS11Button() + let button = SPNativeLargeButton() let closeButton = SPSystemIconButton(type: SPSystemIconType.close) var imageSideSize: CGFloat = 160 @@ -206,7 +206,7 @@ class SPProposeViewController: SPBaseViewController { self.addSubview(self.imageView) self.button.titleLabel?.font = UIFont.system(type: UIFont.BoldType.Medium, size: 15) - self.button.setTitleColorForNoramlAndHightlightedStates(color: SPNativeStyleKit.Colors.black) + self.button.setTitleColor(SPNativeStyleKit.Colors.black) self.button.backgroundColor = UIColor.init(hex: "D4D3DB") self.addSubview(self.button) @@ -266,4 +266,17 @@ class SPProposeViewController: SPBaseViewController { var image: UIImage? var complection: (_ isConfirmed: Bool)->() } + + var bottomSafeArea: CGFloat { + var bottomSafeArea: CGFloat = 0 + if let window = UIApplication.shared.keyWindow { + if #available(iOS 11.0, *) { + bottomSafeArea = window.safeAreaInsets.bottom + } + } else { + bottomSafeArea = 0 + } + + return bottomSafeArea + } } diff --git a/Example/stork-controller/Frameworks/sparrow/ui/controllers/SPRootViewController.swift b/Example/stork-controller/Frameworks/sparrow/ui/controllers/SPRootViewController.swift deleted file mode 100644 index 737b921..0000000 --- a/Example/stork-controller/Frameworks/sparrow/ui/controllers/SPRootViewController.swift +++ /dev/null @@ -1,31 +0,0 @@ -import UIKit - -struct SPRootViewController { - - static var controller: UIViewController? { - return UIApplication.shared.keyWindow?.rootViewController - } - - static func set(_ rootController: UIViewController, animatable: Bool = true) { - - rootController.view.frame = UIScreen.main.bounds - - let replaceRootViewController = { - UIApplication.shared.keyWindow?.rootViewController = rootController - } - - if animatable { - UIView.transition( - with: UIApplication.shared.keyWindow ?? UIWindow(), - duration: 0.5, - options: UIView.AnimationOptions.transitionCrossDissolve, - animations: { - replaceRootViewController() - }, completion: nil) - } else { - replaceRootViewController() - } - } - - private init() {} -} diff --git a/Example/stork-controller/Frameworks/sparrow/ui/controllers/SPWelcomeViewController.swift b/Example/stork-controller/Frameworks/sparrow/ui/controllers/SPWelcomeViewController.swift index d60cf4c..e928dff 100644 --- a/Example/stork-controller/Frameworks/sparrow/ui/controllers/SPWelcomeViewController.swift +++ b/Example/stork-controller/Frameworks/sparrow/ui/controllers/SPWelcomeViewController.swift @@ -28,7 +28,7 @@ class SPWelcomeViewController: SPBaseViewController { let subtitleLabel = UILabel() let descriptionLabel = UILabel() let commentLabel = UILabel() - let button = SPNativeOS11Button() + let button = SPNativeLargeButton() private var data: SPWelcomeData private var views: [UIView] = [] @@ -134,7 +134,7 @@ class SPWelcomeViewController: SPBaseViewController { let sideSpace: CGFloat = size.width * 0.112 - self.imageView.frame = CGRect.init(x: sideSpace, y: self.topSafeArea + (size.height * 0.1), width: 84, height: 84) + self.imageView.frame = CGRect.init(x: sideSpace, y: self.safeArea.top + (size.height * 0.1), width: 84, height: 84) let space: CGFloat = size.height * 0.025 @@ -148,7 +148,7 @@ class SPWelcomeViewController: SPBaseViewController { self.descriptionLabel.sizeToFit() self.button.sizeToFit() - self.button.frame.origin.y = size.height - self.bottomSafeArea - space - self.button.frame.height + self.button.frame.origin.y = size.height - self.safeArea.bottom - space - self.button.frame.height self.button.setWidth(size.width - sideSpace * 2) self.button.center.x = size.width / 2 @@ -214,5 +214,5 @@ struct SPWelcomeData { var backgroundColor: UIColor = UIColor.white var textColor: UIColor = UIColor.black var statusBarStyle: SPStatusBar = .dark - var complection: (_ button: SPNativeOS11Button) -> () = { _ in } + var complection: (_ button: SPNativeLargeButton) -> () = { _ in } } diff --git a/Example/stork-controller/Frameworks/sparrow/ui/controllers/stork/SPStorkPresentationController.swift b/Example/stork-controller/Frameworks/sparrow/ui/controllers/stork/SPStorkPresentationController.swift deleted file mode 100644 index 08dfe3e..0000000 --- a/Example/stork-controller/Frameworks/sparrow/ui/controllers/stork/SPStorkPresentationController.swift +++ /dev/null @@ -1,215 +0,0 @@ -// The MIT License (MIT) -// Copyright © 2017 Ivan Vorobei (hello@ivanvorobei.by) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. - -import UIKit - -final class SPStorkPresentationController: UIPresentationController, UIGestureRecognizerDelegate { - - var indicatorView = SPStorkIndicatorView() - var isSwipeToDismissEnabled: Bool = true - var transitioningDelegate: SPStorkTransitioningDelegate? - private var pan: UIPanGestureRecognizer? - - private var scaleFactor: CGFloat { - return 349 / 375 - } - - private var topSpace: CGFloat { - if presentingViewController.statusBarHeight < 25 { - return 30 - } else { - return presentingViewController.statusBarHeight - } - } - - private var transform: CGAffineTransform { - let translate: CGFloat = ((self.containerView?.frame.height ?? 0) * (1 - self.scaleFactor)) / 2 - return CGAffineTransform.identity.scaledBy(x: scaleFactor, y: scaleFactor).translatedBy(x: 0, y: -translate + topSpace) - } - - private var alpha: CGFloat { - return 0.51 - } - - override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { - super.viewWillTransition(to: size, with: coordinator) - coordinator.animate(alongsideTransition: { (contex) in - self.updateLayout() - }, completion: nil) - } - - private func updateLayout() { - guard let presentedView = self.presentedView else { return } - self.indicatorView.style = .line - self.indicatorView.sizeToFit() - self.indicatorView.frame.origin.y = 12 - self.indicatorView.center.x = presentedView.frame.width / 2 - } - - override var frameOfPresentedViewInContainerView: CGRect { - if let containerView = self.containerView { - let yOffset: CGFloat = topSpace + 13 - return CGRect(x: 0, y: yOffset, width: containerView.bounds.width, height: containerView.bounds.height - yOffset) - } else { - return .zero - } - } - - override func presentationTransitionWillBegin() { - self.updateLayout() - self.indicatorView.style = .arrow - - guard let containerView = self.containerView, let presentedView = self.presentedView, let presentingView = self.presentingViewController.view else { return } - - presentedView.addSubview(self.indicatorView) - - presentedView.addCornerRadiusAnimation(to: 10, duration: 0.6) - presentedView.layer.masksToBounds = true - presentingView.layer.cornerRadius = 10 - presentingView.layer.masksToBounds = true - containerView.addSubview(presentedView) - - guard let transitionCoordinator = self.presentingViewController.transitionCoordinator else { return } - transitionCoordinator.animateAlongsideTransition(in: self.presentingViewController.view, animation: { _ in - if !self.isPresentingControllerUseStork { - self.presentingViewController.view.transform = self.transform - self.presentingViewController.view.alpha = self.alpha - } - }) - } - - override func presentationTransitionDidEnd(_ completed: Bool) { - if self.isSwipeToDismissEnabled { - self.pan = UIPanGestureRecognizer(target: self, action: #selector(handlePan)) - self.pan!.delegate = self - self.pan!.maximumNumberOfTouches = 1 - self.pan!.cancelsTouchesInView = false - self.presentedViewController.view.addGestureRecognizer(pan!) - } - } - - override func dismissalTransitionWillBegin() { - guard let transitionCoordinator = presentingViewController.transitionCoordinator else { return } - - transitionCoordinator.animate(alongsideTransition: { _ in - self.presentingViewController.view.alpha = 1 - }) - - transitionCoordinator.animateAlongsideTransition(in: presentingViewController.view, animation: { _ in - self.presentingViewController.view.transform = CGAffineTransform.identity - if self.presentingViewController.view.frame.origin != CGPoint.zero { - self.presentingViewController.view.frame = CGRect.displayFrame - } - }) - - if !self.isPresentingControllerUseStork { - self.presentingViewController.view.addCornerRadiusAnimation(to: 0, duration: 0.6) - } - } - - override func dismissalTransitionDidEnd(_ completed: Bool) { - if !self.isPresentingControllerUseStork { - if let presentingView = self.presentingViewController.view { - presentingView.layer.cornerRadius = 0 - presentingView.layer.masksToBounds = false - } - } - } -} - -extension SPStorkPresentationController { - - @objc fileprivate func handlePan(gestureRecognizer: UIPanGestureRecognizer) { - guard gestureRecognizer.isEqual(pan), self.isSwipeToDismissEnabled else { - return - } - - switch gestureRecognizer.state { - case .began: - self.indicatorView.style = .line - self.presentingViewController.view.removeAllAnimations() - gestureRecognizer.setTranslation(CGPoint(x: 0, y: 0), in: containerView) - case .changed: - if self.isSwipeToDismissEnabled { - let translation = gestureRecognizer.translation(in: presentedView) - updatePresentedViewForTranslation(inVerticalDirection: translation.y) - } else { - gestureRecognizer.setTranslation(.zero, in: presentedView) - } - case .ended: - let translation = gestureRecognizer.translation(in: presentedView).y - if translation >= 240 { - presentedViewController.dismiss(animated: true, completion: nil) - } else { - self.indicatorView.style = .arrow - UIView.animate( - withDuration: 0.6, - delay: 0, - usingSpringWithDamping: 1, - initialSpringVelocity: 1, - options: [.curveEaseOut, .allowUserInteraction], - animations: { - self.presentedView?.transform = .identity - if !self.isPresentingControllerUseStork { - self.presentingViewController.view.transform = self.transform - self.presentingViewController.view.alpha = self.alpha - } - }) - } - default: - break - } - } - - private func updatePresentedViewForTranslation(inVerticalDirection translation: CGFloat) { - - let elasticThreshold: CGFloat = 120 - let translationFactor: CGFloat = 1 / 2 - - if translation >= 0 { - let translationForModal: CGFloat = { - if translation >= elasticThreshold { - let frictionLength = translation - elasticThreshold - let frictionTranslation = 30 * atan(frictionLength / 120) + frictionLength / 10 - return frictionTranslation + (elasticThreshold * translationFactor) - } else { - return translation * translationFactor - } - }() - - self.presentedView?.transform = CGAffineTransform(translationX: 0, y: translationForModal) - - if !self.isPresentingControllerUseStork { - let factor = 1 + (translationForModal / 6000) - self.presentingViewController.view.transform = self.transform.scaledBy(x: factor, y: factor) - self.presentingViewController.view.alpha = self.alpha + ((factor - 1) * 15) - } - } - } - - - private var isPresentingControllerUseStork: Bool { - let controller = self.presentingViewController - return controller.transitioningDelegate is SPStorkTransitioningDelegate - && controller.modalPresentationStyle == .custom - && controller.presentingViewController != nil - } -} diff --git a/Example/stork-controller/Frameworks/sparrow/ui/views/SPAligmentView.swift b/Example/stork-controller/Frameworks/sparrow/ui/views/SPAligmentView.swift deleted file mode 100644 index a308d25..0000000 --- a/Example/stork-controller/Frameworks/sparrow/ui/views/SPAligmentView.swift +++ /dev/null @@ -1,239 +0,0 @@ -// The MIT License (MIT) -// Copyright © 2017 Ivan Vorobei (hello@ivanvorobei.by) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. - -import UIKit - -class SPAligmentView: UIView { - - var minSpace: CGFloat = 0 - var maxItemSideSize: CGFloat? - var spaceFactor: CGFloat = 0.07 - var aliment: Aliment - - required init?(coder aDecoder: NSCoder) { - self.aliment = .vertical - super.init(coder: aDecoder) - } - - init(aliment: Aliment) { - self.aliment = aliment - super.init(frame: CGRect.zero) - } - - override func layoutSubviews() { - super.layoutSubviews() - - let countViews: CGFloat = CGFloat(self.subviews.count) - - var itemWidth: CGFloat = 0 - var itemHeight: CGFloat = 0 - var space: CGFloat = 0 - - switch self.aliment { - case .horizontal: - itemHeight = self.frame.height - space = self.frame.width * self.spaceFactor - if space < self.minSpace { - space = self.minSpace - } - let spaceForButton = self.frame.width - (space * (countViews - 1)) - itemWidth = spaceForButton / countViews - if self.maxItemSideSize != nil { - if (itemWidth > self.maxItemSideSize!) { - itemWidth = self.maxItemSideSize! - if countViews > 1 { - space = (self.frame.width - (itemWidth * countViews)) / (countViews - 1) - } else { - space = 0 - } - } - } - case .vertical: - itemWidth = self.frame.width - space = self.frame.height * self.spaceFactor - if space < self.minSpace { - space = self.minSpace - } - let spaceForButton = self.frame.height - (space * (countViews - 1)) - itemHeight = spaceForButton / countViews - if self.maxItemSideSize != nil { - if (itemHeight > self.maxItemSideSize!) { - itemHeight = self.maxItemSideSize! - if countViews > 1 { - space = (self.frame.height - (itemHeight * countViews)) / (countViews - 1) - } else { - space = 0 - } - } - } - } - - var xPoint: CGFloat = 0 - var yPoint: CGFloat = 0 - for (index, view) in self.subviews.enumerated() { - switch self.aliment { - case .horizontal: - xPoint = CGFloat(index) * (itemWidth + space) - case .vertical: - yPoint = CGFloat(index) * (itemHeight + space) - } - view.frame = CGRect.init( - x: xPoint, y: yPoint, - width: itemWidth, - height: itemHeight - ) - } - } - - enum Aliment { - case vertical - case horizontal - } -} - -class SPCenteringAligmentView: SPAligmentView { - - override func layoutSubviews() { - super.layoutSubviews() - if self.subviews.count == 0 { - return - } - var itemHeight: CGFloat = self.subviews[0].frame.height - var itemWidth: CGFloat = self.subviews[0].frame.width - let countViews: CGFloat = CGFloat(self.subviews.count) - - if countViews < 3 { - switch self.aliment { - case .horizontal: - switch self.subviews.count { - case 1: - self.subviews[0].center.x = self.frame.width / 2 - case 2: - let allFreeSpace = self.frame.width - (itemWidth * countViews) - var space = allFreeSpace / 2 - if space < self.minSpace { - space = self.minSpace - itemWidth = (self.frame.width - (space * 2)) / 2 - } - self.subviews[0].frame = CGRect.init(x: space / 2, y: self.subviews[0].frame.origin.y, width: itemWidth, height: self.subviews[0].frame.height) - self.subviews[1].frame = CGRect.init(x: space / 2 + itemWidth + space, y: self.subviews[1].frame.origin.y, width: itemWidth, height: self.subviews[1].frame.height) - default: - break - } - case .vertical: - switch self.subviews.count { - case 1: - self.subviews[0].center.y = self.frame.height / 2 - case 2: - let allFreeSpace = self.frame.height - (itemHeight * countViews) - var space = allFreeSpace / 2 - if space < self.minSpace { - space = self.minSpace - itemHeight = (self.frame.height - (space * 2)) / 2 - } - self.subviews[0].frame = CGRect.init(x: self.subviews[0].frame.origin.x, y: space / 2, width: self.subviews[0].frame.width, height: itemHeight) - self.subviews[1].frame = CGRect.init(x: self.subviews[1].frame.origin.x, y: (space / 2) + itemHeight + space, width: self.subviews[1].frame.width, height: itemHeight) - default: - break - } - } - } - } -} - -class SPDinamicAligmentView: UIView { - - var aliment: Aliment - - var itemSideSize: CGFloat = 50 - var space: CGFloat = 10 - - var needSize: CGSize { - get { - self.layoutSubviews() - switch aliment { - case .horizontal: - return CGSize.init(width: ((self.subviews.last?.frame.origin.x) ?? 0) + ((self.subviews.last?.frame.width) ?? 0), height: (self.subviews.last?.frame.height) ?? 0) - case .vertical: - return CGSize.init(width: (self.subviews.last?.frame.width) ?? 0, height: (self.subviews.last?.frame.bottomYPosition) ?? 0) - } - - } - } - - required init?(coder aDecoder: NSCoder) { - self.aliment = .vertical - super.init(coder: aDecoder) - } - - init(aliment: Aliment) { - self.aliment = aliment - super.init(frame: CGRect.zero) - } - - override func layoutSubviews() { - super.layoutSubviews() - - var xPoint: CGFloat = 0 - var yPoint: CGFloat = 0 - var itemWidth: CGFloat = 0 - var itemHeight: CGFloat = 0 - - for (index, view) in self.subviews.enumerated() { - switch self.aliment { - case .horizontal: - xPoint = CGFloat(index) * (self.itemSideSize + space) - itemWidth = self.itemSideSize - itemHeight = self.frame.height - case .vertical: - yPoint = CGFloat(index) * (self.itemSideSize + space) - itemWidth = self.frame.width - itemHeight = self.itemSideSize - } - view.frame = CGRect.init( - x: xPoint, y: yPoint, - width: itemWidth, - height: itemHeight - ) - } - - var needSideSize: CGFloat = 0 - let lastView = self.subviews.last - if lastView != nil { - switch self.aliment { - case .horizontal: - needSideSize = lastView!.frame.origin.x + lastView!.frame.width - self.setWidth(needSideSize) - break - case .vertical: - needSideSize = lastView!.frame.origin.y + lastView!.frame.height - self.setHeight(needSideSize) - break - } - } - } - - enum Aliment { - case vertical - case horizontal - } - -} diff --git a/Example/stork-controller/Frameworks/sparrow/ui/views/SPDownloadingUIImageView.swift b/Example/stork-controller/Frameworks/sparrow/ui/views/SPDownloadingUIImageView.swift index 7c4c162..fc6d356 100644 --- a/Example/stork-controller/Frameworks/sparrow/ui/views/SPDownloadingUIImageView.swift +++ b/Example/stork-controller/Frameworks/sparrow/ui/views/SPDownloadingUIImageView.swift @@ -21,27 +21,13 @@ import UIKit -class SPDownloadingImageView: UIImageView { +class SPDownloadingImageView: SPImageView { let activityIndiactorView = UIActivityIndicatorView.init() let gradeView = UIView.init() - init() { - super.init(frame: CGRect.zero) - self.commonInit() - } - - override init(image: UIImage?) { - super.init(image: image) - self.commonInit() - } - - required init?(coder aDecoder: NSCoder) { - super.init(coder: aDecoder) - self.commonInit() - } - - func commonInit() { + override func commonInit() { + super.commonInit() self.backgroundColor = UIColor.clear self.layer.masksToBounds = true self.addSubview(self.gradeView) @@ -76,13 +62,12 @@ class SPDownloadingImageView: UIImageView { } } - func setLoadingMode() { + func startLoading() { self.image = nil self.activityIndiactorView.startAnimating() self.gradeView.alpha = 1 } - override func layoutSubviews() { super.layoutSubviews() self.gradeView.setEqualsBoundsFromSuperview() diff --git a/Example/stork-controller/Frameworks/sparrow/ui/views/SPGradientView.swift b/Example/stork-controller/Frameworks/sparrow/ui/views/SPGradientView.swift index 98da680..6476871 100644 --- a/Example/stork-controller/Frameworks/sparrow/ui/views/SPGradientView.swift +++ b/Example/stork-controller/Frameworks/sparrow/ui/views/SPGradientView.swift @@ -21,7 +21,7 @@ import UIKit -public class SPGradientView: UIView { +public class SPGradientView: SPView { var startColor: UIColor = UIColor.white { didSet { self.updateGradient() }} var endColor: UIColor = UIColor.black { didSet { self.updateGradient() }} @@ -29,17 +29,7 @@ public class SPGradientView: UIView { var startColorPoint: CGPoint = CGPoint.zero { didSet { self.updateGradient() }} var endColorPoint: CGPoint = CGPoint.zero { didSet { self.updateGradient() }} - var gradientLayer: CAGradientLayer! - - public init() { - super.init(frame: CGRect.zero) - commonInit() - } - - required public init?(coder aDecoder: NSCoder) { - super.init(coder: aDecoder) - self.commonInit() - } + var gradientLayer: CAGradientLayer = CAGradientLayer() public func setStartColorPosition(_ position: Position) { self.startColorPoint = getPointForPosition(position) @@ -49,16 +39,16 @@ public class SPGradientView: UIView { self.endColorPoint = getPointForPosition(position) } - private func commonInit() { - self.gradientLayer = CAGradientLayer() - self.layer.insertSublayer(self.gradientLayer!, at: 0) + override func commonInit() { + super.commonInit() + self.layer.insertSublayer(self.gradientLayer, at: 0) } private func updateGradient() { - self.gradientLayer!.colors = [startColor.cgColor, endColor.cgColor] - self.gradientLayer!.locations = [0.0, 1.0] - self.gradientLayer!.startPoint = self.startColorPoint - self.gradientLayer!.endPoint = self.endColorPoint + self.gradientLayer.colors = [startColor.cgColor, endColor.cgColor] + self.gradientLayer.locations = [0.0, 1.0] + self.gradientLayer.startPoint = self.startColorPoint + self.gradientLayer.endPoint = self.endColorPoint } override public func layoutSublayers(of layer: CALayer) { diff --git a/Example/stork-controller/Frameworks/sparrow/ui/views/SPScrollView.swift b/Example/stork-controller/Frameworks/sparrow/ui/views/SPScrollView.swift index bea58fb..1321a14 100644 --- a/Example/stork-controller/Frameworks/sparrow/ui/views/SPScrollView.swift +++ b/Example/stork-controller/Frameworks/sparrow/ui/views/SPScrollView.swift @@ -23,6 +23,23 @@ import UIKit class SPScrollView: UIScrollView { + init() { + super.init(frame: .zero) + self.commonInit() + } + + required init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + self.commonInit() + } + + internal func commonInit() { + if #available(iOS 11.0, *) { + self.contentInsetAdjustmentBehavior = .never + } + self.delaysContentTouches = false + } + override func touchesShouldCancel(in view: UIView) -> Bool { if view is UIControl && !(view is UITextInput) diff --git a/Example/stork-controller/ViewController.swift b/Example/stork-controller/ViewController.swift index 0906ba5..e3dc49b 100644 --- a/Example/stork-controller/ViewController.swift +++ b/Example/stork-controller/ViewController.swift @@ -47,4 +47,3 @@ class ModalViewController: UIViewController { return .lightContent } } - diff --git a/SPStorkController.podspec b/SPStorkController.podspec index 737fefa..48aaf97 100644 --- a/SPStorkController.podspec +++ b/SPStorkController.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "SPStorkController" - s.version = "1.0.8" + s.version = "1.1" s.summary = "Modal controller as mail or Apple music application" s.homepage = "https://github.com/IvanVorobei/SPStorkController" s.source = { :git => "https://github.com/IvanVorobei/SPStorkController.git", :tag => s.version } @@ -13,7 +13,7 @@ Pod::Spec.new do |s| s.platform = :ios s.ios.deployment_target = "10.0" - s.dependency 'SparrowKit', '~> 1.0.2' + s.source_files = "Source/StorkController/**/*.swift" end diff --git a/Source/StorkController/SPStorkController.swift b/Source/StorkController/SPStorkController.swift new file mode 100644 index 0000000..b42a653 --- /dev/null +++ b/Source/StorkController/SPStorkController.swift @@ -0,0 +1,62 @@ +// The MIT License (MIT) +// Copyright © 2017 Ivan Vorobei (hello@ivanvorobei.by) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +import UIKit + +public struct SPStorkController { + + static func scrollViewDidScroll(_ scrollView: UIScrollView) { + if let controller = self.controller(for: scrollView) { + if let presentationController = controller.presentationController as? SPStorkPresentationController { + let translation = -(scrollView.contentOffset.y + scrollView.contentInset.top) + if translation >= 0 { + scrollView.subviews.forEach { + $0.transform = CGAffineTransform(translationX: 0, y: -translation) + } + if presentationController.pan?.state != UIGestureRecognizer.State.changed { + presentationController.scrollViewDidScroll(translation) + } + } else { + presentationController.scrollViewDidScroll(0) + } + } + } + } + + static private func controller(for view: UIView) -> UIViewController? { + var nextResponder = view.next + while nextResponder != nil && !(nextResponder! is UIViewController) { + nextResponder = nextResponder!.next + } + return nextResponder as? UIViewController + } + + private init() {} +} + +extension UIViewController { + + var isPresentedAsStork: Bool { + return transitioningDelegate is SPStorkTransitioningDelegate + && modalPresentationStyle == .custom + && presentingViewController != nil + } +} diff --git a/Example/stork-controller/Frameworks/sparrow/internet-connection/SPInternetConnection.swift b/Source/StorkController/SPStorkDismissingAnimationController.swift similarity index 53% rename from Example/stork-controller/Frameworks/sparrow/internet-connection/SPInternetConnection.swift rename to Source/StorkController/SPStorkDismissingAnimationController.swift index 02cb64a..f897c2a 100644 --- a/Example/stork-controller/Frameworks/sparrow/internet-connection/SPInternetConnection.swift +++ b/Source/StorkController/SPStorkDismissingAnimationController.swift @@ -19,27 +19,34 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. -import SystemConfiguration +import UIKit -public struct SPInternetConnection { - - static var isOpen: Bool { - var zeroAddress = sockaddr_in() - zeroAddress.sin_len = UInt8(MemoryLayout.size(ofValue: zeroAddress)) - zeroAddress.sin_family = sa_family_t(AF_INET) - let defaultRouteReachability = withUnsafePointer(to: &zeroAddress) { - $0.withMemoryRebound(to: sockaddr.self, capacity: 1) {zeroSockAddress in - SCNetworkReachabilityCreateWithAddress(nil, zeroSockAddress) - } +final class SPStorkDismissingAnimationController: NSObject, UIViewControllerAnimatedTransitioning { + + func animateTransition(using transitionContext: UIViewControllerContextTransitioning) { + + guard let presentedViewController = transitionContext.viewController(forKey: .from) else { + return } - var flags = SCNetworkReachabilityFlags() - if !SCNetworkReachabilityGetFlags(defaultRouteReachability!, &flags) { - return false + + let containerView = transitionContext.containerView + let offscreenFrame = CGRect(x: 0, y: containerView.bounds.height, width: containerView.bounds.width, height: containerView.bounds.height) + + UIView.animate( + withDuration: transitionDuration(using: transitionContext), + delay: 0, + usingSpringWithDamping: 1, + initialSpringVelocity: 1, + options: .curveEaseIn, + animations: { + presentedViewController.view.frame = offscreenFrame + }) { finished in + transitionContext.completeTransition(finished) } - let isReachable = (flags.rawValue & UInt32(kSCNetworkFlagsReachable)) != 0 - let needsConnection = (flags.rawValue & UInt32(kSCNetworkFlagsConnectionRequired)) != 0 - return (isReachable && !needsConnection) } - private init() {} + func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval { + return 0.6 + } } + diff --git a/Source/StorkController/SPStorkIndicatorView.swift b/Source/StorkController/SPStorkIndicatorView.swift new file mode 100644 index 0000000..ee503fe --- /dev/null +++ b/Source/StorkController/SPStorkIndicatorView.swift @@ -0,0 +1,87 @@ +// The MIT License (MIT) +// Copyright © 2017 Ivan Vorobei (hello@ivanvorobei.by) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +import UIKit + +class SPStorkIndicatorView: UIView { + + var style: Style = .line { + didSet { + switch self.style { + case .line: + self.animate { + self.leftView.transform = .identity + self.rightView.transform = .identity + } + case .arrow: + self.animate { + let angle = CGFloat(20 * Float.pi / 180) + self.leftView.transform = CGAffineTransform.init(rotationAngle: angle) + self.rightView.transform = CGAffineTransform.init(rotationAngle: -angle) + } + } + + } + } + + private var leftView: UIView = UIView() + private var rightView: UIView = UIView() + + init() { + super.init(frame: .zero) + self.backgroundColor = UIColor.clear + self.addSubview(self.leftView) + self.addSubview(self.rightView) + self.leftView.backgroundColor = UIColor.init(red: 202/255, green: 201/255, blue: 207/255, alpha: 1) + self.rightView.backgroundColor = UIColor.init(red: 202/255, green: 201/255, blue: 207/255, alpha: 1) + } + + required init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func sizeToFit() { + super.sizeToFit() + self.frame = CGRect.init(x: self.frame.origin.x, y: self.frame.origin.y, width: 36, height: 13) + + let height: CGFloat = 5 + let correction = height / 2 + + self.leftView.frame = CGRect.init(x: 0, y: 0, width: self.frame.width / 2 + correction, height: height) + self.leftView.center.y = self.frame.height / 2 + self.leftView.layer.cornerRadius = min(self.leftView.frame.width, self.leftView.frame.height) / 2 + + self.rightView.frame = CGRect.init(x: self.frame.width / 2 - correction, y: 0, width: self.frame.width / 2 + correction, height: height) + self.rightView.center.y = self.frame.height / 2 + self.rightView.layer.cornerRadius = min(self.leftView.frame.width, self.leftView.frame.height) / 2 + } + + private func animate(animations: @escaping (() -> Void)) { + UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: [.beginFromCurrentState, .curveEaseOut], animations: { + animations() + }) + } + + enum Style { + case arrow + case line + } +} diff --git a/Source/StorkController/SPStorkPresentationController.swift b/Source/StorkController/SPStorkPresentationController.swift new file mode 100644 index 0000000..d8fc9cf --- /dev/null +++ b/Source/StorkController/SPStorkPresentationController.swift @@ -0,0 +1,397 @@ +// The MIT License (MIT) +// Copyright © 2017 Ivan Vorobei (hello@ivanvorobei.by) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +import UIKit + +class SPStorkPresentationController: UIPresentationController, UIGestureRecognizerDelegate { + + var isSwipeToDismissEnabled: Bool = true + var showIndicator: Bool = true + var transitioningDelegate: SPStorkTransitioningDelegate? + var pan: UIPanGestureRecognizer? + + private var indicatorView = SPStorkIndicatorView() + private var gradeView: UIView = UIView() + private let snapshotViewContainer = UIView() + private var snapshotView: UIView? + private let backgroundView = UIView() + + private var snapshotViewTopConstraint: NSLayoutConstraint? + private var snapshotViewWidthConstraint: NSLayoutConstraint? + private var snapshotViewAspectRatioConstraint: NSLayoutConstraint? + private var workGester: Bool = false + private var startDismissing: Bool = false + + private var topSpace: CGFloat { + let statusBarHeight: CGFloat = UIApplication.shared.statusBarFrame.height + return (statusBarHeight < 25) ? 30 : statusBarHeight + } + + private var alpha: CGFloat { + return 0.51 + } + + private var cornerRadius: CGFloat { + return 10 + } + + private var scaleForPresentingView: CGFloat { + guard let containerView = containerView else { return 0 } + let factor = 1 - (topSpace * 2 / containerView.frame.height) + return factor + } + + override var frameOfPresentedViewInContainerView: CGRect { + guard let containerView = containerView else { return .zero } + let yOffset: CGFloat = topSpace + 13 + return CGRect(x: 0, y: yOffset, width: containerView.bounds.width, height: containerView.bounds.height - yOffset) + } + + override func presentationTransitionWillBegin() { + super.presentationTransitionWillBegin() + + guard let containerView = self.containerView, let presentedView = self.presentedView, let window = containerView.window else { return } + + if self.showIndicator { + presentedView.addSubview(self.indicatorView) + } + self.updateLayoutIndicator() + self.indicatorView.style = .arrow + self.gradeView.alpha = 0 + + let initialFrame: CGRect = presentingViewController.isPresentedAsStork ? presentingViewController.view.frame : containerView.bounds + + containerView.insertSubview(self.snapshotViewContainer, belowSubview: presentedViewController.view) + self.snapshotViewContainer.frame = initialFrame + self.updateSnapshot() + self.backgroundView.backgroundColor = UIColor.black + self.backgroundView.translatesAutoresizingMaskIntoConstraints = false + containerView.insertSubview(self.backgroundView, belowSubview: self.snapshotViewContainer) + NSLayoutConstraint.activate([ + self.backgroundView.topAnchor.constraint(equalTo: window.topAnchor), + self.backgroundView.leftAnchor.constraint(equalTo: window.leftAnchor), + self.backgroundView.rightAnchor.constraint(equalTo: window.rightAnchor), + self.backgroundView.bottomAnchor.constraint(equalTo: window.bottomAnchor) + ]) + + let transformForSnapshotView = CGAffineTransform.identity + .translatedBy(x: 0, y: -snapshotViewContainer.frame.origin.y) + .translatedBy(x: 0, y: self.topSpace) + .translatedBy(x: 0, y: -snapshotViewContainer.frame.height / 2) + .scaledBy(x: scaleForPresentingView, y: scaleForPresentingView) + .translatedBy(x: 0, y: snapshotViewContainer.frame.height / 2) + + self.addCornerRadiusAnimation(for: self.snapshotView, cornerRadius: self.cornerRadius, duration: 0.6) + self.snapshotView?.layer.masksToBounds = true + if #available(iOS 11.0, *) { + presentedView.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner] + } + presentedView.layer.cornerRadius = self.cornerRadius + presentedView.layer.masksToBounds = true + + var rootSnapshotView: UIView? + var rootSnapshotRoundedView: UIView? + + if presentingViewController.isPresentedAsStork { + guard let rootController = presentingViewController.presentingViewController, let snapshotView = rootController.view.snapshotView(afterScreenUpdates: false) else { return } + + containerView.insertSubview(snapshotView, aboveSubview: self.backgroundView) + snapshotView.frame = initialFrame + snapshotView.transform = transformForSnapshotView + snapshotView.alpha = self.alpha + snapshotView.layer.cornerRadius = self.cornerRadius + snapshotView.layer.masksToBounds = true + rootSnapshotView = snapshotView + + let snapshotRoundedView = UIView() + snapshotRoundedView.layer.cornerRadius = self.cornerRadius + snapshotRoundedView.layer.masksToBounds = true + containerView.insertSubview(snapshotRoundedView, aboveSubview: snapshotView) + snapshotRoundedView.frame = initialFrame + snapshotRoundedView.transform = transformForSnapshotView + rootSnapshotRoundedView = snapshotRoundedView + } + + presentedViewController.transitionCoordinator?.animate( + alongsideTransition: { [weak self] context in + guard let `self` = self else { return } + self.snapshotView?.transform = transformForSnapshotView + self.gradeView.alpha = self.alpha + }, completion: { _ in + self.snapshotView?.transform = .identity + rootSnapshotView?.removeFromSuperview() + rootSnapshotRoundedView?.removeFromSuperview() + }) + } + + override func presentationTransitionDidEnd(_ completed: Bool) { + super.presentationTransitionDidEnd(completed) + guard let containerView = containerView else { return } + self.presentedViewController.view.frame = self.frameOfPresentedViewInContainerView + self.snapshotViewContainer.transform = .identity + self.snapshotViewContainer.translatesAutoresizingMaskIntoConstraints = false + self.snapshotViewContainer.centerXAnchor.constraint(equalTo: containerView.centerXAnchor).isActive = true + self.updateSnapshotAspectRatio() + + if self.isSwipeToDismissEnabled { + self.pan = UIPanGestureRecognizer(target: self, action: #selector(handlePan)) + self.pan!.delegate = self + self.pan!.maximumNumberOfTouches = 1 + self.pan!.cancelsTouchesInView = false + self.presentedViewController.view.addGestureRecognizer(self.pan!) + } + } + + override func dismissalTransitionWillBegin() { + super.dismissalTransitionWillBegin() + guard let containerView = containerView else { return } + self.startDismissing = true + + let initialFrame: CGRect = presentingViewController.isPresentedAsStork ? presentingViewController.view.frame : containerView.bounds + + let initialTransform = CGAffineTransform.identity + .translatedBy(x: 0, y: -initialFrame.origin.y) + .translatedBy(x: 0, y: self.topSpace) + .translatedBy(x: 0, y: -initialFrame.height / 2) + .scaledBy(x: scaleForPresentingView, y: scaleForPresentingView) + .translatedBy(x: 0, y: initialFrame.height / 2) + + self.snapshotViewTopConstraint?.isActive = false + self.snapshotViewWidthConstraint?.isActive = false + self.snapshotViewAspectRatioConstraint?.isActive = false + self.snapshotViewContainer.translatesAutoresizingMaskIntoConstraints = true + self.snapshotViewContainer.frame = initialFrame + self.snapshotViewContainer.transform = initialTransform + + let finalCornerRadius = presentingViewController.isPresentedAsStork ? self.cornerRadius : 0 + let finalTransform: CGAffineTransform = .identity + + self.addCornerRadiusAnimation(for: self.snapshotView, cornerRadius: finalCornerRadius, duration: 0.6) + + var rootSnapshotView: UIView? + var rootSnapshotRoundedView: UIView? + + if presentingViewController.isPresentedAsStork { + guard let rootController = presentingViewController.presentingViewController, let snapshotView = rootController.view.snapshotView(afterScreenUpdates: false) else { return } + + containerView.insertSubview(snapshotView, aboveSubview: backgroundView) + snapshotView.frame = initialFrame + snapshotView.transform = initialTransform + rootSnapshotView = snapshotView + snapshotView.layer.cornerRadius = self.cornerRadius + snapshotView.layer.masksToBounds = true + + let snapshotRoundedView = UIView() + snapshotRoundedView.layer.cornerRadius = self.cornerRadius + snapshotRoundedView.layer.masksToBounds = true + snapshotRoundedView.backgroundColor = UIColor.black.withAlphaComponent(1 - self.alpha) + containerView.insertSubview(snapshotRoundedView, aboveSubview: snapshotView) + snapshotRoundedView.frame = initialFrame + snapshotRoundedView.transform = initialTransform + rootSnapshotRoundedView = snapshotRoundedView + } + + presentedViewController.transitionCoordinator?.animate( + alongsideTransition: { [weak self] context in + guard let `self` = self else { return } + self.snapshotView?.transform = .identity + self.snapshotViewContainer.transform = finalTransform + self.gradeView.alpha = 0 + }, completion: { _ in + rootSnapshotView?.removeFromSuperview() + rootSnapshotRoundedView?.removeFromSuperview() + }) + } + + override func dismissalTransitionDidEnd(_ completed: Bool) { + super.dismissalTransitionDidEnd(completed) + guard let containerView = containerView else { return } + + self.backgroundView.removeFromSuperview() + self.snapshotView?.removeFromSuperview() + self.snapshotViewContainer.removeFromSuperview() + + let offscreenFrame = CGRect(x: 0, y: containerView.bounds.height, width: containerView.bounds.width, height: containerView.bounds.height) + presentedViewController.view.frame = offscreenFrame + presentedViewController.view.transform = .identity + } +} + +extension SPStorkPresentationController { + + @objc func handlePan(gestureRecognizer: UIPanGestureRecognizer) { + guard gestureRecognizer.isEqual(pan), self.isSwipeToDismissEnabled else { return } + + switch gestureRecognizer.state { + case .began: + self.workGester = true + self.indicatorView.style = .line + self.presentingViewController.view.layer.removeAllAnimations() + gestureRecognizer.setTranslation(CGPoint(x: 0, y: 0), in: containerView) + case .changed: + self.workGester = true + if self.isSwipeToDismissEnabled { + let translation = gestureRecognizer.translation(in: presentedView) + self.updatePresentedViewForTranslation(inVerticalDirection: translation.y) + } else { + gestureRecognizer.setTranslation(.zero, in: presentedView) + } + case .ended: + self.workGester = false + let translation = gestureRecognizer.translation(in: presentedView).y + if translation >= 240 { + presentedViewController.dismiss(animated: true, completion: nil) + } else { + self.indicatorView.style = .arrow + UIView.animate( + withDuration: 0.6, + delay: 0, + usingSpringWithDamping: 1, + initialSpringVelocity: 1, + options: [.curveEaseOut, .allowUserInteraction], + animations: { + self.snapshotView?.transform = .identity + self.presentedView?.transform = .identity + }) + } + default: + break + } + } + + func scrollViewDidScroll(_ translation: CGFloat) { + if !self.workGester { + self.updatePresentedViewForTranslation(inVerticalDirection: translation) + } + } + + private func updatePresentedViewForTranslation(inVerticalDirection translation: CGFloat) { + if self.startDismissing { return } + + let elasticThreshold: CGFloat = 120 + let translationFactor: CGFloat = 1 / 2 + + if translation >= 0 { + let translationForModal: CGFloat = { + if translation >= elasticThreshold { + let frictionLength = translation - elasticThreshold + let frictionTranslation = 30 * atan(frictionLength / 120) + frictionLength / 10 + return frictionTranslation + (elasticThreshold * translationFactor) + } else { + return translation * translationFactor + } + }() + + self.presentedView?.transform = CGAffineTransform(translationX: 0, y: translationForModal) + + if !self.presentingViewController.isPresentedAsStork { + let factor = 1 + (translationForModal / 6000) + self.snapshotView?.transform = CGAffineTransform.init(scaleX: factor, y: factor) + self.gradeView.alpha = self.alpha - ((factor - 1) * 15) + } + } + } +} + +extension SPStorkPresentationController { + + override func containerViewWillLayoutSubviews() { + super.containerViewWillLayoutSubviews() + guard let containerView = containerView else { return } + self.updateSnapshotAspectRatio() + if presentedViewController.view.isDescendant(of: containerView) { + UIView.animate(withDuration: 0.1) { [weak self] in + guard let `self` = self else { return } + self.presentedViewController.view.frame = self.frameOfPresentedViewInContainerView + } + } + } + + override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { + super.viewWillTransition(to: size, with: coordinator) + coordinator.animate(alongsideTransition: { contex in + self.updateLayoutIndicator() + }, completion: { [weak self] _ in + self?.updateSnapshotAspectRatio() + self?.updateSnapshot() + }) + } + + private func updateLayoutIndicator() { + guard let presentedView = self.presentedView else { return } + self.indicatorView.style = .line + self.indicatorView.sizeToFit() + self.indicatorView.frame.origin.y = 12 + self.indicatorView.center.x = presentedView.frame.width / 2 + } + + private func updateSnapshot() { + guard let currentSnapshotView = presentingViewController.view.snapshotView(afterScreenUpdates: true) else { return } + self.snapshotView?.removeFromSuperview() + self.snapshotViewContainer.addSubview(currentSnapshotView) + self.constraints(view: currentSnapshotView, to: self.snapshotViewContainer) + self.snapshotView = currentSnapshotView + self.gradeView.removeFromSuperview() + self.gradeView.backgroundColor = UIColor.black + self.snapshotView!.addSubview(self.gradeView) + self.constraints(view: self.gradeView, to: self.snapshotView!) + } + + private func updateSnapshotAspectRatio() { + guard let containerView = containerView, snapshotViewContainer.translatesAutoresizingMaskIntoConstraints == false else { return } + + self.snapshotViewTopConstraint?.isActive = false + self.snapshotViewWidthConstraint?.isActive = false + self.snapshotViewAspectRatioConstraint?.isActive = false + + let snapshotReferenceSize = presentingViewController.view.frame.size + let aspectRatio = snapshotReferenceSize.width / snapshotReferenceSize.height + + self.snapshotViewTopConstraint = snapshotViewContainer.topAnchor.constraint(equalTo: containerView.topAnchor, constant: self.topSpace) + self.snapshotViewWidthConstraint = snapshotViewContainer.widthAnchor.constraint(equalTo: containerView.widthAnchor, multiplier: scaleForPresentingView) + self.snapshotViewAspectRatioConstraint = snapshotViewContainer.widthAnchor.constraint(equalTo: snapshotViewContainer.heightAnchor, multiplier: aspectRatio) + + self.snapshotViewTopConstraint?.isActive = true + self.snapshotViewWidthConstraint?.isActive = true + self.snapshotViewAspectRatioConstraint?.isActive = true + } + + private func constraints(view: UIView, to superView: UIView) { + view.translatesAutoresizingMaskIntoConstraints = false + NSLayoutConstraint.activate([ + view.topAnchor.constraint(equalTo: superView.topAnchor), + view.leftAnchor.constraint(equalTo: superView.leftAnchor), + view.rightAnchor.constraint(equalTo: superView.rightAnchor), + view.bottomAnchor.constraint(equalTo: superView.bottomAnchor) + ]) + } + + private func addCornerRadiusAnimation(for view: UIView?, cornerRadius: CGFloat, duration: CFTimeInterval) { + guard let view = view else { return } + let animation = CABasicAnimation(keyPath:"cornerRadius") + animation.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeOut) + animation.fromValue = view.layer.cornerRadius + animation.toValue = cornerRadius + animation.duration = duration + view.layer.add(animation, forKey: "cornerRadius") + view.layer.cornerRadius = cornerRadius + } +} diff --git a/Source/StorkController/SPStorkPresentingAnimationController.swift b/Source/StorkController/SPStorkPresentingAnimationController.swift new file mode 100644 index 0000000..16c8e67 --- /dev/null +++ b/Source/StorkController/SPStorkPresentingAnimationController.swift @@ -0,0 +1,55 @@ +// The MIT License (MIT) +// Copyright © 2017 Ivan Vorobei (hello@ivanvorobei.by) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +import UIKit + +final class SPStorkPresentingAnimationController: NSObject, UIViewControllerAnimatedTransitioning { + + func animateTransition(using transitionContext: UIViewControllerContextTransitioning) { + + guard let presentedViewController = transitionContext.viewController(forKey: .to) else { + return + } + + let containerView = transitionContext.containerView + containerView.addSubview(presentedViewController.view) + presentedViewController.view.frame = CGRect(x: 0, y: containerView.bounds.height, width: containerView.bounds.width, height: containerView.bounds.height) + + let finalFrameForPresentedView = transitionContext.finalFrame(for: presentedViewController) + + UIView.animate( + withDuration: transitionDuration(using: transitionContext), + delay: 0, + usingSpringWithDamping: 1, + initialSpringVelocity: 1, + options: .curveEaseOut, + animations: { + presentedViewController.view.frame = finalFrameForPresentedView + }, completion: { finished in + transitionContext.completeTransition(finished) + }) + } + + func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval { + return 0.6 + } +} + diff --git a/Example/stork-controller/Frameworks/sparrow/ui/controllers/SPScrollViewController.swift b/Source/StorkController/SPStorkTransitioningDelegate.swift similarity index 55% rename from Example/stork-controller/Frameworks/sparrow/ui/controllers/SPScrollViewController.swift rename to Source/StorkController/SPStorkTransitioningDelegate.swift index 931616e..61004cc 100644 --- a/Example/stork-controller/Frameworks/sparrow/ui/controllers/SPScrollViewController.swift +++ b/Source/StorkController/SPStorkTransitioningDelegate.swift @@ -21,25 +21,22 @@ import UIKit -class SPScrollViewController: SPBaseViewController { +public final class SPStorkTransitioningDelegate: NSObject, UIViewControllerTransitioningDelegate { - let scrollView = SPScrollView() + var isSwipeToDismissEnabled: Bool = true + var showIndicator: Bool = true - override func viewDidLoad() { - - self.view.backgroundColor = SPNativeStyleKit.Colors.customGray - - self.scrollView.showsHorizontalScrollIndicator = false - self.scrollView.showsVerticalScrollIndicator = true - self.scrollView.indicatorStyle = .black - self.view.addSubview(self.scrollView) - - super.viewDidLoad() + public func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? { + let controller = SPStorkPresentationController(presentedViewController: presented, presenting: presenting) + controller.transitioningDelegate = self + return controller } - override func updateLayout(with size: CGSize) { - self.scrollView.frame = CGRect.init(origin: .zero, size: size) - self.scrollView.contentSize = CGSize.init(width: size.width, height: size.height * 2) - super.updateLayout(with: size) + public func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? { + return SPStorkPresentingAnimationController() + } + + public func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? { + return SPStorkDismissingAnimationController() } }