Compare commits

...
34 Commits
Author SHA1 Message Date
igor.k 85f8d426b5 add SPM config 2019-11-13 03:07:48 +03:00
Ramotion 5ff14c942c Update README.md 2019-10-12 21:15:15 +03:00
Alex K 63c89a9f05 bump version 2019-04-03 15:02:24 +03:00
Alex K fd2324ae6e converted to swift 5 2019-04-03 14:55:21 +03:00
Ramotion f5e532d949 Update README.md 2018-12-29 15:12:07 +03:00
Ramotion cf8350773e Update README.md 2018-12-10 12:04:59 +03:00
Alex K 4578946501 no message 2018-09-27 09:34:30 +03:00
Alex K 2e5971c53b update podspec 2018-09-21 09:52:46 +03:00
Alex K 4b03b8ec0f converting to swift 4.2 Fixes #85 2018-09-21 09:41:36 +03:00
Alex K f077711d1f Fixes #72
fix ambiguous NSLayoutAttribute compile error
2018-08-01 09:11:56 +03:00
Ramotion 8c2a5bb31b Update README.md 2018-06-29 14:27:41 +03:00
Ramotion bfd276ac68 Update README.md 2018-06-26 11:11:35 +03:00
Alex K 799fba5bcf update podspec 2018-05-30 09:39:14 +03:00
Alex K 9f55d701a1 project settings 2018-05-30 09:35:18 +03:00
Alex c9a00bba92 Merge pull request #82 from akihiyo76/fix/isuue_#81
fix issue 81
2018-05-30 09:30:04 +03:00
akihiyo76 2315429724 fix not call didSelectItem method 2018-05-30 15:22:24 +09:00
Ramotion d71ab75f6f Update README.md 2018-05-29 12:03:58 +03:00
Ramotion 09ae1b08dd Update README.md 2018-04-28 16:09:18 +03:00
Ramotion 988f36f4bd Add files via upload 2018-04-28 06:08:21 -07:00
Ramotion 56298faab4 Update README.md 2018-04-18 14:48:15 +03:00
Alex K 8a712f23bc update podspec 2018-04-02 16:27:41 +03:00
Alex c0fcff5202 Merge pull request #78 from calvinsug/master
fix deprecated Swift
2018-04-02 15:13:40 +03:00
Calvin Sugianto f2f31ba167 fix deprecated Swift 2018-04-02 16:06:26 +07:00
Ramotion 56bf333791 Update README.md 2018-03-02 11:52:15 +03:00
Alex Mikhnev e8e36b9804 Update README.md 2018-02-21 14:44:56 +03:00
Alex K 5986f1c286 update podspec 2018-01-29 11:57:43 +03:00
Alex K fc70562947 Fixes #66 2018-01-29 11:47:58 +03:00
Alex K 03704d1227 fix demo project
Fixes #3
2018-01-25 10:35:16 +03:00
Alex K e72546bc43 update readme 2018-01-24 16:29:52 +03:00
Alex K 436bba428a update podspec 2018-01-24 14:08:39 +03:00
Alex K 521c534a30 Fixes #62 2018-01-24 14:07:21 +03:00
Alex K de19661aa5 update podspec 2018-01-24 12:04:29 +03:00
Alex K a4d60e40f7 Merge branch 'fix69'
# Conflicts:
#	Source/ExpandingTableViewController/ExpandingTableViewController.swift
#	Source/TransitionDriver/TransitionDriver.swift
2018-01-24 12:00:23 +03:00
Alex K 938a7a13c0 Fixes #69 2018-01-24 11:57:57 +03:00
21 changed files with 170 additions and 154 deletions
+1 -1
View File
@@ -1 +1 @@
4.0
4.2
@@ -400,7 +400,6 @@
isa = PBXNativeTarget;
buildConfigurationList = 848596451CF585F3000BCC74 /* Build configuration list for PBXNativeTarget "DemoExpandingCollection" */;
buildPhases = (
8485968F1CF58B8A000BCC74 /* Images Generator */,
848596241CF585F3000BCC74 /* Sources */,
848596251CF585F3000BCC74 /* Frameworks */,
848596261CF585F3000BCC74 /* Resources */,
@@ -441,24 +440,24 @@
isa = PBXProject;
attributes = {
LastSwiftUpdateCheck = 0730;
LastUpgradeCheck = 0920;
LastUpgradeCheck = 1020;
ORGANIZATIONNAME = "Alex K.";
TargetAttributes = {
848596271CF585F3000BCC74 = {
CreatedOnToolsVersion = 7.3.1;
DevelopmentTeam = 34MUF9YXTA;
LastSwiftMigration = 0920;
LastSwiftMigration = 1020;
};
8499D8131D001B82004B5B37 = {
CreatedOnToolsVersion = 7.3.1;
DevelopmentTeam = LEAZS7L33U;
LastSwiftMigration = 0920;
LastSwiftMigration = 1020;
};
};
};
buildConfigurationList = 848596231CF585F3000BCC74 /* Build configuration list for PBXProject "DemoExpandingCollection" */;
compatibilityVersion = "Xcode 3.2";
developmentRegion = English;
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
@@ -496,23 +495,6 @@
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
8485968F1CF58B8A000BCC74 /* Images Generator */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
name = "Images Generator";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "if which swiftgen >/dev/null; then\nswiftgen images \"$PROJECT_DIR/DemoExpandingCollection/Assets.xcassets\" -t swift3 --output \"$PROJECT_DIR/DemoExpandingCollection/Constants/Images.swift\"\nelse\necho \"warning: SwiftGen not installed, download it from https://github.com/AliSoftware/SwiftGen\"\nfi";
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
848596241CF585F3000BCC74 /* Sources */ = {
isa = PBXSourcesBuildPhase;
@@ -593,6 +575,7 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
@@ -602,12 +585,14 @@
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_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
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;
@@ -646,6 +631,7 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
@@ -655,12 +641,14 @@
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_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
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;
@@ -703,8 +691,7 @@
PRODUCT_BUNDLE_IDENTIFIER = com.ramotion.dev1;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE = "";
SWIFT_SWIFT3_OBJC_INFERENCE = Off;
SWIFT_VERSION = 4.0;
SWIFT_VERSION = 5.0;
};
name = Debug;
};
@@ -722,8 +709,7 @@
PRODUCT_BUNDLE_IDENTIFIER = com.ramotion.dev1;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE = "";
SWIFT_SWIFT3_OBJC_INFERENCE = Off;
SWIFT_VERSION = 4.0;
SWIFT_VERSION = 5.0;
};
name = Release;
};
@@ -744,8 +730,7 @@
PRODUCT_BUNDLE_IDENTIFIER = com.ramotion.dev;
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
SWIFT_SWIFT3_OBJC_INFERENCE = Off;
SWIFT_VERSION = 4.0;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
VERSIONING_SYSTEM = "apple-generic";
VERSION_INFO_PREFIX = "";
@@ -769,8 +754,7 @@
PRODUCT_BUNDLE_IDENTIFIER = com.ramotion.dev;
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
SWIFT_SWIFT3_OBJC_INFERENCE = Off;
SWIFT_VERSION = 4.0;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
VERSIONING_SYSTEM = "apple-generic";
VERSION_INFO_PREFIX = "";
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0920"
LastUpgradeVersion = "1020"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
@@ -26,7 +26,6 @@
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
language = ""
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
@@ -37,7 +36,6 @@
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
language = ""
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
@@ -13,7 +13,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_: UIApplication, didFinishLaunchingWithOptions _: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
func application(_: UIApplication, didFinishLaunchingWithOptions _: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
configureNavigationTabBar()
return true
}
@@ -32,8 +32,8 @@ extension AppDelegate {
shadow.shadowColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.1)
UINavigationBar.appearance().titleTextAttributes = [
NSAttributedStringKey.foregroundColor: UIColor.white,
NSAttributedStringKey.shadow: shadow,
NSAttributedString.Key.foregroundColor: UIColor.white,
NSAttributedString.Key.shadow: shadow,
]
}
}
@@ -27,8 +27,8 @@ class DemoTableViewController: ExpandingTableViewController {
extension DemoTableViewController {
fileprivate func configureNavBar() {
navigationItem.leftBarButtonItem?.image = navigationItem.leftBarButtonItem?.image!.withRenderingMode(UIImageRenderingMode.alwaysOriginal)
navigationItem.rightBarButtonItem?.image = navigationItem.rightBarButtonItem?.image!.withRenderingMode(UIImageRenderingMode.alwaysOriginal)
navigationItem.leftBarButtonItem?.image = navigationItem.leftBarButtonItem?.image!.withRenderingMode(UIImage.RenderingMode.alwaysOriginal)
navigationItem.rightBarButtonItem?.image = navigationItem.rightBarButtonItem?.image!.withRenderingMode(UIImage.RenderingMode.alwaysOriginal)
}
}
@@ -54,18 +54,15 @@ extension DemoTableViewController {
extension DemoTableViewController {
override func scrollViewDidScroll(_ scrollView: UIScrollView) {
// if scrollView.contentOffset.y < -25 {
// // buttonAnimation
// let viewControllers: [DemoViewController?] = navigationController?.viewControllers.map { $0 as? DemoViewController } ?? []
//
// for viewController in viewControllers {
// if let rightButton = viewController?.navigationItem.rightBarButtonItem as? AnimatingBarButton {
// rightButton.animationSelected(false)
// }
// }
// popTransitionAnimation()
// }
if scrollView.contentOffset.y < -25 , let navigationController = navigationController {
// buttonAnimation
for case let viewController as DemoViewController in navigationController.viewControllers {
if case let rightButton as AnimatingBarButton = viewController.navigationItem.rightBarButtonItem {
rightButton.animationSelected(false)
}
}
popTransitionAnimation()
}
scrollOffsetY = scrollView.contentOffset.y
}
}
@@ -22,7 +22,7 @@ class DemoViewController: ExpandingViewController {
extension DemoViewController {
override func viewDidLoad() {
itemSize = CGSize(width: 256, height: 335)
itemSize = CGSize(width: 256, height: 460)
super.viewDidLoad()
registerCell()
@@ -53,7 +53,7 @@ extension DemoViewController {
}
fileprivate func configureNavBar() {
navigationItem.leftBarButtonItem?.image = navigationItem.leftBarButtonItem?.image!.withRenderingMode(UIImageRenderingMode.alwaysOriginal)
navigationItem.leftBarButtonItem?.image = navigationItem.leftBarButtonItem?.image!.withRenderingMode(UIImage.RenderingMode.alwaysOriginal)
}
}
@@ -114,7 +114,7 @@ extension DemoViewController {
cell.cellIsOpen(cellsIsOpen[index], animated: false)
}
func collectionView(_ collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: IndexPath) {
override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
guard let cell = collectionView.cellForItem(at: indexPath) as? DemoCollectionViewCell
, currentIndex == indexPath.row else { return }
@@ -66,7 +66,7 @@ extension AnimatingBarButton {
fileprivate func configureImageView(_ imageView: UIImageView, imageName: String) {
guard let customView = customView else { return }
guard let image = UIImage(named: imageName)?.withRenderingMode(UIImageRenderingMode.alwaysTemplate) else { return }
guard let image = UIImage(named: imageName)?.withRenderingMode(UIImage.RenderingMode.alwaysTemplate) else { return }
imageView.image = image
imageView.contentMode = .scaleAspectFit
@@ -35,7 +35,7 @@ extension Rotatable {
$0.duration = duration
$0.fromValue = from
$0.toValue = to
$0.fillMode = kCAFillModeForwards
$0.fillMode = CAMediaTimingFillMode.forwards
$0.isRemovedOnCompletion = false
}
}
+43
View File
@@ -0,0 +1,43 @@
// swift-tools-version:5.1
//
// Package.swift
//
// Copyright (c) Ramotion (https://www.ramotion.com/)
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
//
import PackageDescription
let package = Package(
name: "ExpandingCollection",
platforms: [
.iOS(.v9)
],
products: [
.library(name: "ExpandingCollection",
targets: ["ExpandingCollection"]),
],
targets: [
.target(name: "ExpandingCollection",
path: "Source")
],
swiftLanguageVersions: [.v5]
)
+51 -40
View File
@@ -1,8 +1,26 @@
![header](./header.png)
![animation](./preview.gif)
<a href="https://www.ramotion.com/agency/app-development?utm_source=gthb&utm_medium=repo&utm_campaign=expanding-collection"><img src="https://github.com/Ramotion/folding-cell/blob/master/header.png"></a>
<a href="https://github.com/Ramotion/expanding-collection">
<img align="left" src="https://github.com/Ramotion/expanding-collection/blob/master/expanding-collection.gif" width="480" height="360" /></a>
<p><h1 align="left">EXPANDING COLLECTION</h1></p>
<h4>An animated material design UI card peek/pop controller</h4>
# expanding-collection
___
<p><h6>We specialize in the designing and coding of custom UI for Mobile Apps and Websites.</h6>
<a href="https://www.ramotion.com/agency/app-development?utm_source=gthb&utm_medium=repo&utm_campaign=expanding-collection">
<img src="https://github.com/ramotion/gliding-collection/raw/master/contact_our_team@2x.png" width="187" height="34"></a>
</p>
<p><h6>Stay tuned for the latest updates:</h6>
<a href="https://goo.gl/rPFpid" >
<img src="https://i.imgur.com/ziSqeSo.png/" width="156" height="28"></a></p>
</br>
[![Twitter](https://img.shields.io/badge/Twitter-@Ramotion-blue.svg?style=flat)](http://twitter.com/Ramotion)
[![CocoaPods](https://img.shields.io/cocoapods/p/expanding-collection.svg)](https://cocoapods.org/pods/expanding-collection)
@@ -10,28 +28,12 @@
[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Ramotion/expanding-collection)
[![Travis](https://travis-ci.org/Ramotion/expanding-collection.svg?branch=master)](https://travis-ci.org/Ramotion/expanding-collection)
[![codebeat badge](https://codebeat.co/badges/6a009992-5bf2-4730-aa35-f3b20ce7693d)](https://codebeat.co/projects/github-com-ramotion-expanding-collection)
# Check this library on other platforms:
<a href="https://github.com/Ramotion/expanding-collection-android">
<img src="https://github.com/ramotion/navigation-stack/raw/master/Android_Java@2x.png" width="178" height="81"></a>
## About
This project is maintained by Ramotion, Inc.<br>
We specialize in the designing and coding of custom UI for Mobile Apps and Websites.<br>
**Looking for developers for your project?**<br>
This project is maintained by Ramotion, Inc. We specialize in the designing and coding of custom UI for Mobile Apps and Websites.
<a href="https://ramotion.com/?utm_source=gthb&utm_medium=special&utm_campaign=expanding-collection-contact-us/#Get_in_Touch">
<img src="https://github.com/ramotion/gliding-collection/raw/master/contact_our_team@2x.png" width="187" height="34"></a> <br>
The [iPhone mockup](https://store.ramotion.com?utm_source=gthb&utm_medium=special&utm_campaign=expanding-collection) available [here](https://store.ramotion.com?utm_source=gthb&utm_medium=special&utm_campaign=expanding-collection).
[![Donate](https://img.shields.io/badge/Donate-PayPal-blue.svg)](https://paypal.me/Ramotion)
## Requirements
- iOS 9.0+
- Xcode 8
- Xcode 9.0+
## Installation
@@ -39,12 +41,9 @@ Just add the Source folder to your project.
or use [CocoaPods](https://cocoapods.org) with Podfile:
``` ruby
pod 'expanding-collection', '~> 1.1.2' swift 4
pod 'expanding-collection', '~> 1.0.3' swift 3
pod 'expanding-collection', '~> 0.3.2' swift 2
pod 'expanding-collection'
```
or [Carthage](https://github.com/Carthage/Carthage) users can simply add to their `Cartfile`:
```
github "Ramotion/expanding-collection"
@@ -84,7 +83,7 @@ import expanding_collection
``` swift
override func viewDidLoad() {
itemSize = CGSize(width: 214, height: 264)
itemSize = CGSize(width: 214, height: 460) //IMPORTANT!!! Height of open state cell
super.viewDidLoad()
// register cell
@@ -154,10 +153,18 @@ func scrollViewDidEndDecelerating(scrollView: UIScrollView) {
2) Set header height default 236
``` swift
override func viewDidLoad() {
super.viewDidLoad()
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
headerHeight = ***
}
}
```
OR
``` swift
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
headerHeight = ***
}
```
3) Call the push method in YourViewController to YourTableViewController
@@ -171,23 +178,27 @@ override func viewDidLoad() {
4) For back transition use `popTransitionAnimation()`
## License
## 🗂 Check this library on other language:
<a href="https://github.com/Ramotion/expanding-collection-android">
<img src="https://github.com/ramotion/navigation-stack/raw/master/Android_Java@2x.png" width="178" height="81"></a>
Expanding collection is released under the MIT license.
## 📄 License
Expanding Collection is released under the MIT license.
See [LICENSE](./LICENSE) for details.
<br>
This library is a part of a <a href="https://github.com/Ramotion/swift-ui-animation-components-and-libraries"><b>selection of our best UI open-source projects.</b></a>
# Get the Showroom App for iOS to give it a try
If you use the open-source library in your project, please make sure to credit and backlink to www.ramotion.com
## 📱 Get the Showroom App for iOS to give it a try
Try this UI component and more like this in our iOS app. Contact us if interested.
<a href="https://itunes.apple.com/app/apple-store/id1182360240?pt=550053&ct=expanding-collection&mt=8" >
<a href="https://itunes.apple.com/app/apple-store/id1182360240?pt=550053&ct=expanding-collection&mt=8" >
<img src="https://github.com/ramotion/gliding-collection/raw/master/app_store@2x.png" width="117" height="34"></a>
<a href="https://ramotion.com/?utm_source=gthb&utm_medium=special&utm_campaign=expanding-collection-contact-us/#Get_in_Touch">
<a href="https://www.ramotion.com/agency/app-development?utm_source=gthb&utm_medium=repo&utm_campaign=expanding-collection">
<img src="https://github.com/ramotion/gliding-collection/raw/master/contact_our_team@2x.png" width="187" height="34"></a>
<br>
<br>
Follow us for the latest updates<br>
[![Twitter URL](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/intent/tweet?text=https://github.com/ramotion/expanding-collection)
[![Twitter Follow](https://img.shields.io/twitter/follow/ramotion.svg?style=social)](https://twitter.com/ramotion)
@@ -12,8 +12,7 @@ import UIKit
open class ExpandingTableViewController: UITableViewController {
// MARK: Vars
/// The height of the table view header
/// The height of the table view header, set before transition
open var headerHeight: CGFloat = 236
var transitionDriver: TransitionDriver?
@@ -109,8 +109,8 @@ extension BasePageCollectionCell {
if isOpen == isOpened { return }
if ySpacing == .greatestFiniteMagnitude {
frontConstraintY.constant = isOpen == true ? -frontContainerView.bounds.size.height / 5 : 0
backConstraintY.constant = isOpen == true ? frontContainerView.bounds.size.height / 5 - yOffset / 2 : 0
frontConstraintY.constant = isOpen == true ? -frontContainerView.bounds.size.height / 6 : 0
backConstraintY.constant = isOpen == true ? frontContainerView.bounds.size.height / 6 - yOffset / 2 : 0
} else {
frontConstraintY.constant = isOpen == true ? -ySpacing / 2 : 0
backConstraintY.constant = isOpen == true ? ySpacing / 2 : 0
@@ -133,10 +133,9 @@ extension BasePageCollectionCell {
}
isOpened = isOpen
configurationCell()
if animated == true {
UIView.animate(withDuration: 0.3, delay: 0, options: UIViewAnimationOptions(), animations: {
UIView.animate(withDuration: 0.3, delay: 0, options: UIView.AnimationOptions(), animations: {
self.contentView.layoutIfNeeded()
}, completion: nil)
} else {
@@ -177,7 +176,8 @@ extension BasePageCollectionCell {
contentView.insertSubview(shadow, belowSubview: view)
// create constraints
for info: (attribute: NSLayoutAttribute, scale: CGFloat) in [(NSLayoutAttribute.width, 0.8), (NSLayoutAttribute.height, 0.9)] {
let sizeConstaints: [(NSLayoutConstraint.Attribute, CGFloat)] = [(NSLayoutConstraint.Attribute.width, 0.8), (NSLayoutConstraint.Attribute.height, 0.9)]
for info: (attribute: NSLayoutConstraint.Attribute, scale: CGFloat) in sizeConstaints {
if let frontViewConstraint = view.getConstraint(info.attribute) {
shadow >>>- {
$0.attribute = info.attribute
@@ -186,8 +186,9 @@ extension BasePageCollectionCell {
}
}
}
for info: (attribute: NSLayoutAttribute, offset: CGFloat) in [(NSLayoutAttribute.centerX, 0), (NSLayoutAttribute.centerY, 30)] {
let centerConstraints: [(NSLayoutConstraint.Attribute, CGFloat)] = [(NSLayoutConstraint.Attribute.centerX, 0), (NSLayoutConstraint.Attribute.centerY, 30)]
for info: (attribute: NSLayoutConstraint.Attribute, offset: CGFloat) in centerConstraints {
(contentView, shadow, view) >>>- {
$0.attribute = info.attribute
$0.constant = info.offset
@@ -204,22 +205,6 @@ extension BasePageCollectionCell {
return shadow
}
func configurationCell() {
// Prevents indefinite growing of the cell issue
let i: CGFloat = isOpened ? 1 : -1
let superHeight = superview?.frame.size.height ?? 0
frame.size.height += i * superHeight
frame.origin.y -= i * superHeight / 2
if additionalWidth == .greatestFiniteMagnitude {
frame.origin.x -= i * yOffset / 2
frame.size.width += i * yOffset
} else {
frame.origin.x -= i * additionalWidth / 2
frame.size.width += i * additionalWidth
}
}
func configureCellViewConstraintsWithSize(_ size: CGSize) {
guard isOpened == false && frontContainerView.getConstraint(.width)?.constant != size.width else { return }
@@ -76,7 +76,7 @@ extension PageCollectionLayout {
continue
}
if fabs(attributes.center.x - proposedContentOffsetCenterX) < fabs(candidateAttributes!.center.x - proposedContentOffsetCenterX) {
if abs(attributes.center.x - proposedContentOffsetCenterX) < abs(candidateAttributes!.center.x - proposedContentOffsetCenterX) {
candidateAttributes = attributes
}
}
@@ -143,7 +143,7 @@ extension PageCollectionLayout {
}
let inset = collectionView.bounds.size.width / 2 - itemSize.width / 2
collectionView.contentInset = UIEdgeInsetsMake(0, inset, 0, inset)
collectionView.contentInset = UIEdgeInsets.init(top: 0, left: inset, bottom: 0, right: inset)
collectionView.contentOffset = CGPoint(x: -inset, y: 0)
}
}
@@ -23,7 +23,7 @@ extension PageCollectionView {
let collectionView = Init(PageCollectionView(frame: CGRect.zero, collectionViewLayout: layout)) {
$0.translatesAutoresizingMaskIntoConstraints = false
$0.decelerationRate = UIScrollViewDecelerationRateFast
$0.decelerationRate = UIScrollView.DecelerationRate.fast
$0.showsHorizontalScrollIndicator = false
$0.dataSource = dataSource
$0.delegate = delegate
@@ -37,7 +37,7 @@ extension PageCollectionView {
$0.constant = height
return
}
[NSLayoutAttribute.left, .right, .centerY].forEach { attribute in
[NSLayoutConstraint.Attribute.left, .right, .centerY].forEach { attribute in
(view, collectionView) >>>- {
$0.attribute = attribute
return
@@ -11,8 +11,8 @@ import UIKit
/// UIViewController with UICollectionView with custom transition method
open class ExpandingViewController: UIViewController {
/// The default size to use for cells.
open var itemSize = CGSize(width: 256, height: 335)
/// The default size to use for cells. Height of open cell state
open var itemSize = CGSize(width: 256, height: 460)
/// The collection view object managed by this view controller.
open var collectionView: UICollectionView?
@@ -86,7 +86,7 @@ extension ExpandingViewController {
let layout = PageCollectionLayout(itemSize: itemSize)
collectionView = PageCollectionView.createOnView(view,
layout: layout,
height: itemSize.height + itemSize.height / 5 * 2,
height: itemSize.height,
dataSource: self,
delegate: self)
if #available(iOS 10.0, *) {
@@ -118,6 +118,9 @@ extension ExpandingViewController: UICollectionViewDataSource, UICollectionViewD
cell.configureCellViewConstraintsWithSize(itemSize)
}
open func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
}
open func collectionView(_: UICollectionView, numberOfItemsInSection _: Int) -> Int {
fatalError("need emplementation in subclass")
@@ -127,15 +130,3 @@ extension ExpandingViewController: UICollectionViewDataSource, UICollectionViewD
fatalError("need emplementation in subclass")
}
}
// MARK: UIScrollViewDelegate
extension ExpandingViewController {
public func scrollViewDidEndDecelerating(_: UIScrollView) {
let indexPath = IndexPath(row: currentIndex, section: 0)
if case let currentCell as BasePageCollectionCell = collectionView?.cellForItem(at: indexPath) {
currentCell.configurationCell()
}
}
}
@@ -18,7 +18,7 @@ extension CornerAnimatable where Self: UIView {
let animation = Init(CABasicAnimation(keyPath: "cornerRadius")) {
$0.duration = duration
$0.toValue = radius
$0.fillMode = kCAFillModeForwards
$0.fillMode = CAMediaTimingFillMode.forwards
$0.isRemovedOnCompletion = false
}
@@ -9,11 +9,11 @@
import UIKit
struct ConstraintInfo {
var attribute: NSLayoutAttribute = .left
var secondAttribute: NSLayoutAttribute = .notAnAttribute
var attribute: NSLayoutConstraint.Attribute = .left
var secondAttribute: NSLayoutConstraint.Attribute = .notAnAttribute
var constant: CGFloat = 0
var identifier: String?
var relation: NSLayoutRelation = .equal
var relation: NSLayoutConstraint.Relation = .equal
}
precedencegroup ConstOp {
@@ -81,7 +81,7 @@ func >>>- <T: UIView>(left: (T, T, T), block: (inout ConstraintInfo) -> Void) ->
extension UIView {
func addScaleToFillConstratinsOnView(_ view: UIView) {
[NSLayoutAttribute.left, .right, .top, .bottom].forEach { attribute in
[NSLayoutConstraint.Attribute.left, .right, .top, .bottom].forEach { attribute in
(self, view) >>>- {
$0.attribute = attribute
return
@@ -89,7 +89,7 @@ extension UIView {
}
}
func getConstraint(_ attributes: NSLayoutAttribute) -> NSLayoutConstraint? {
func getConstraint(_ attributes: NSLayoutConstraint.Attribute) -> NSLayoutConstraint? {
return constraints.filter {
if $0.firstAttribute == attributes && $0.secondItem == nil {
return true
@@ -71,13 +71,13 @@ extension TransitionDriver {
copyView.center = view.center
// constraints animation
UIView.animate(withDuration: duration, delay: 0, options: UIViewAnimationOptions(), animations: {
UIView.animate(withDuration: duration, delay: 0, options: UIView.AnimationOptions(), animations: {
self.view.layoutIfNeeded()
self.backImageView?.alpha = 1
self.copyCell?.shadowView?.alpha = 0
copyView.frontContainerView.subviewsForEach { if $0.tag == Constants.HideKey { $0.alpha = 0 } }
}, completion: { _ in
let data = NSKeyedArchiver.archivedData(withRootObject: copyView.frontContainerView)
let data = NSKeyedArchiver.archivedData(withRootObject: copyView.frontContainerView!)
guard case let headerView as UIView = NSKeyedUnarchiver.unarchiveObject(with: data) else {
fatalError("must copy")
}
@@ -101,7 +101,7 @@ extension TransitionDriver {
copyCell.backContainerView.animationCornerRadius(copyCell.backContainerView.layer.cornerRadius, duration: duration)
copyCell.frontContainerView.animationCornerRadius(copyCell.frontContainerView.layer.cornerRadius, duration: duration)
UIView.animate(withDuration: duration, delay: 0, options: UIViewAnimationOptions(), animations: {
UIView.animate(withDuration: duration, delay: 0, options: UIView.AnimationOptions(), animations: {
self.rightCell?.center.x -= self.step
self.leftCell?.center.x += self.step
@@ -132,7 +132,7 @@ extension TransitionDriver {
view.addSubview(cell)
// add constraints
[(NSLayoutAttribute.width, cell.bounds.size.width), (NSLayoutAttribute.height, cell.bounds.size.height)].forEach { info in
[(NSLayoutConstraint.Attribute.width, cell.bounds.size.width), (NSLayoutConstraint.Attribute.height, cell.bounds.size.height)].forEach { info in
cell >>>- {
$0.attribute = info.0
$0.constant = info.1
@@ -140,7 +140,7 @@ extension TransitionDriver {
}
}
[NSLayoutAttribute.centerX, .centerY].forEach { attribute in
[NSLayoutConstraint.Attribute.centerX, .centerY].forEach { attribute in
(view, cell) >>>- {
$0.attribute = attribute
return
@@ -159,7 +159,7 @@ extension TransitionDriver {
view.addSubview(imageView)
// add constraints
[NSLayoutAttribute.left, .right, .top, .bottom].forEach { attribute in
[NSLayoutConstraint.Attribute.left, .right, .top, .bottom].forEach { attribute in
(view, imageView) >>>- {
$0.attribute = attribute
return
@@ -227,7 +227,7 @@ extension TransitionDriver {
}
backViewFrame.origin.y = cell.backConstraintY.constant
cell.backConstraintY.constant = view.bounds.size.height / 2 - (view.bounds.size.height - 236) / 2 + insets
cell.backConstraintY.constant = view.bounds.size.height / 2 - (view.bounds.size.height - height) / 2 + insets
}
fileprivate func closeBackViewConfigurationConstraints(_ cell: BasePageCollectionCell?) {
Binary file not shown.

After

Width:  |  Height:  |  Size: 14 MiB

+1 -1
View File
@@ -1,6 +1,6 @@
Pod::Spec.new do |s|
s.name = 'expanding-collection'
s.version = '1.1.3'
s.version = '3.1.0'
s.summary = 'Transition animtion from CollectionView to TableView'
s.license = 'MIT'
s.homepage = 'https://github.com/Ramotion/expanding-collection'