diff --git a/VegaScroll.xcodeproj/project.pbxproj b/VegaScroll.xcodeproj/project.pbxproj index e7dca17..d7736f7 100644 --- a/VegaScroll.xcodeproj/project.pbxproj +++ b/VegaScroll.xcodeproj/project.pbxproj @@ -109,11 +109,12 @@ DD52B8531F6AC89B00E2AD33 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0900; + LastUpgradeCheck = 1130; ORGANIZATIONNAME = "Guilherme Rambo"; TargetAttributes = { DD52B85B1F6AC89B00E2AD33 = { CreatedOnToolsVersion = 9.0; + LastSwiftMigration = 1130; ProvisioningStyle = Automatic; }; }; @@ -124,6 +125,7 @@ hasScannedForEncodings = 0; knownRegions = ( en, + Base, ); mainGroup = DD52B8521F6AC89B00E2AD33; productRefGroup = DD52B85D1F6AC89B00E2AD33 /* Products */; @@ -171,6 +173,7 @@ CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; @@ -178,6 +181,7 @@ CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; @@ -231,6 +235,7 @@ CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; @@ -238,6 +243,7 @@ CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; @@ -285,7 +291,7 @@ PRODUCT_BUNDLE_IDENTIFIER = br.com.guilhermerambo.VegaScrollFlowLayout; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SKIP_INSTALL = YES; - SWIFT_VERSION = 4.0; + SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; @@ -305,7 +311,7 @@ PRODUCT_BUNDLE_IDENTIFIER = br.com.guilhermerambo.VegaScrollFlowLayout; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SKIP_INSTALL = YES; - SWIFT_VERSION = 4.0; + SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Release; diff --git a/VegaScroll.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/VegaScroll.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/VegaScroll.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/VegaScroll.xcodeproj/xcshareddata/xcschemes/VegaScrollFlowLayout.xcscheme b/VegaScroll.xcodeproj/xcshareddata/xcschemes/VegaScrollFlowLayout.xcscheme index db58330..7418d9d 100644 --- a/VegaScroll.xcodeproj/xcshareddata/xcschemes/VegaScrollFlowLayout.xcscheme +++ b/VegaScroll.xcodeproj/xcshareddata/xcschemes/VegaScrollFlowLayout.xcscheme @@ -1,6 +1,6 @@ - - - - [UICollectionViewLayoutAttributes]? { guard let collectionView = collectionView else { return nil } let dynamicItems = dynamicAnimator.items(in: rect) as? [UICollectionViewLayoutAttributes] + dynamicItems?.forEach { item in - let convertedY = item.center.y - collectionView.contentOffset.y - sectionInset.top - item.zIndex = item.indexPath.row - transformItemIfNeeded(y: convertedY, item: item) + let convertedY = item.center.y - collectionView.contentOffset.y - sectionInset.top + item.zIndex = item.indexPath.row + transformItemIfNeeded(y: convertedY, item: item) } return dynamicItems } - private func transformItemIfNeeded(y: CGFloat, item: UICollectionViewLayoutAttributes) { - guard itemSize.height > 0, y < itemSize.height * 0.5 else { - return - } - - let scaleFactor: CGFloat = scaleDistributor(x: y) + private func transformItemIfNeeded(y: CGFloat, item: UICollectionViewLayoutAttributes) { + guard itemSize.height > 0, y < itemSize.height * 0.5 else { return } - let yDelta = getYDelta(y: y) + let scaleFactor: CGFloat = scaleDistributor(x: y) + let yDelta = getYDelta(y: y) - item.transform3D = CATransform3DTranslate(transformIdentity, 0, yDelta, 0) - item.transform3D = CATransform3DScale(item.transform3D, scaleFactor, scaleFactor, scaleFactor) - item.alpha = alphaDistributor(x: y) - - } + item.transform3D = CATransform3DTranslate(transformIdentity, 0, yDelta, 0) + item.transform3D = CATransform3DScale(item.transform3D, scaleFactor, scaleFactor, scaleFactor) + item.alpha = alphaDistributor(x: y) + } override open func layoutAttributesForItem(at indexPath: IndexPath) -> UICollectionViewLayoutAttributes? { return dynamicAnimator.layoutAttributesForCell(at: indexPath)! @@ -119,7 +115,7 @@ open class VegaScrollFlowLayout: UICollectionViewFlowLayout { let touchLocation = collectionView!.panGestureRecognizer.location(in: collectionView) - dynamicAnimator.behaviors.flatMap { $0 as? UIAttachmentBehavior }.forEach { behavior in + dynamicAnimator.behaviors.compactMap { $0 as? UIAttachmentBehavior }.forEach { behavior in let attrs = behavior.items.first as! UICollectionViewLayoutAttributes attrs.center = getUpdatedBehaviorItemCenter(behavior: behavior, touchLocation: touchLocation) self.dynamicAnimator.updateItem(usingCurrentState: attrs) @@ -168,8 +164,8 @@ open class VegaScrollFlowLayout: UICollectionViewFlowLayout { private func getUpdatedBehaviorItemCenter(behavior: UIAttachmentBehavior, touchLocation: CGPoint) -> CGPoint { - let yDistanceFromTouch = fabs(touchLocation.y - behavior.anchorPoint.y) - let xDistanceFromTouch = fabs(touchLocation.x - behavior.anchorPoint.x) + let yDistanceFromTouch = abs(touchLocation.y - behavior.anchorPoint.y) + let xDistanceFromTouch = abs(touchLocation.x - behavior.anchorPoint.x) let scrollResistance = (yDistanceFromTouch + xDistanceFromTouch) / (springHardness * 100) let attrs = behavior.items.first as! UICollectionViewLayoutAttributes @@ -191,24 +187,22 @@ open class VegaScrollFlowLayout: UICollectionViewFlowLayout { - parameter xOrigin: x coordinate of the function origin. */ private func distributor(x: CGFloat, threshold: CGFloat, xOrigin: CGFloat) -> CGFloat { - guard threshold > xOrigin else { - return 1 - } + guard threshold > xOrigin else { return 1 } var arg = (x - xOrigin)/(threshold - xOrigin) arg = arg <= 0 ? 0 : arg let y = sqrt(arg) return y > 1 ? 1 : y } - private func scaleDistributor(x: CGFloat) -> CGFloat { - return distributor(x: x, threshold: itemSize.height * 0.5, xOrigin: -itemSize.height * 5) + private func scaleDistributor(x: CGFloat) -> CGFloat { + return distributor(x: x, threshold: itemSize.height * 0.5, xOrigin: -itemSize.height * 5) } private func alphaDistributor(x: CGFloat) -> CGFloat { - return distributor(x: x, threshold: itemSize.height * 0.5, xOrigin: -itemSize.height) + return distributor(x: x, threshold: itemSize.height * 0.5, xOrigin: -itemSize.height) } - private func getYDelta(y: CGFloat) -> CGFloat { - return itemSize.height * 0.5 - y - } + private func getYDelta(y: CGFloat) -> CGFloat { + return itemSize.height * 0.5 - y + } }