Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
de2815310c | ||
|
|
79ebfdad72 | ||
|
|
7fccf4465d | ||
|
|
10f2b4a593 | ||
|
|
2082c637fc | ||
|
|
1ad323db3e | ||
|
|
d0582c547e | ||
|
|
bab9a6cb13 | ||
|
|
eb0fb13162 | ||
|
|
28979e4c74 | ||
|
|
9b169a7eeb | ||
|
|
e61613727f | ||
|
|
b3c552e5e5 | ||
|
|
acca9eeba7 | ||
|
|
8c16530fbe | ||
|
|
e4babdc1cc | ||
|
|
d2ebb37052 | ||
|
|
8cfd463d24 | ||
|
|
99d33faa5b |
+1
-1
@@ -1,6 +1,6 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'FoldingCell'
|
||||
s.version = '3.0.6'
|
||||
s.version = '3.1.3'
|
||||
s.summary = 'UITableViewCell with folding animation.'
|
||||
s.homepage = 'https://github.com/Ramotion/folding-cell'
|
||||
s.license = 'MIT'
|
||||
|
||||
@@ -26,9 +26,12 @@ import UIKit
|
||||
|
||||
class MainTableViewController: UITableViewController {
|
||||
|
||||
let kCloseCellHeight: CGFloat = 179
|
||||
let kOpenCellHeight: CGFloat = 488
|
||||
let kRowsCount = 10
|
||||
enum Const {
|
||||
static let closeCellHeight: CGFloat = 179
|
||||
static let openCellHeight: CGFloat = 488
|
||||
static let rowsCount = 10
|
||||
}
|
||||
|
||||
var cellHeights: [CGFloat] = []
|
||||
|
||||
override func viewDidLoad() {
|
||||
@@ -37,10 +40,24 @@ class MainTableViewController: UITableViewController {
|
||||
}
|
||||
|
||||
private func setup() {
|
||||
cellHeights = Array(repeating: kCloseCellHeight, count: kRowsCount)
|
||||
tableView.estimatedRowHeight = kCloseCellHeight
|
||||
cellHeights = Array(repeating: Const.closeCellHeight, count: Const.rowsCount)
|
||||
tableView.estimatedRowHeight = Const.closeCellHeight
|
||||
tableView.rowHeight = UITableViewAutomaticDimension
|
||||
tableView.backgroundColor = UIColor(patternImage: #imageLiteral(resourceName: "background"))
|
||||
if #available(iOS 10.0, *) {
|
||||
tableView.refreshControl = UIRefreshControl()
|
||||
tableView.refreshControl?.addTarget(self, action: #selector(refreshHandler), for: .valueChanged)
|
||||
}
|
||||
}
|
||||
|
||||
@objc func refreshHandler() {
|
||||
let deadlineTime = DispatchTime.now() + .seconds(1)
|
||||
DispatchQueue.main.asyncAfter(deadline: deadlineTime, execute: { [weak self] in
|
||||
if #available(iOS 10.0, *) {
|
||||
self?.tableView.refreshControl?.endRefreshing()
|
||||
}
|
||||
self?.tableView.reloadData()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -59,7 +76,7 @@ extension MainTableViewController {
|
||||
|
||||
cell.backgroundColor = .clear
|
||||
|
||||
if cellHeights[indexPath.row] == kCloseCellHeight {
|
||||
if cellHeights[indexPath.row] == Const.closeCellHeight {
|
||||
cell.unfold(false, animated: false, completion: nil)
|
||||
} else {
|
||||
cell.unfold(true, animated: false, completion: nil)
|
||||
@@ -89,13 +106,13 @@ extension MainTableViewController {
|
||||
}
|
||||
|
||||
var duration = 0.0
|
||||
let cellIsCollapsed = cellHeights[indexPath.row] == kCloseCellHeight
|
||||
let cellIsCollapsed = cellHeights[indexPath.row] == Const.closeCellHeight
|
||||
if cellIsCollapsed {
|
||||
cellHeights[indexPath.row] = kOpenCellHeight
|
||||
cellHeights[indexPath.row] = Const.openCellHeight
|
||||
cell.unfold(true, animated: true, completion: nil)
|
||||
duration = 0.5
|
||||
} else {
|
||||
cellHeights[indexPath.row] = kCloseCellHeight
|
||||
cellHeights[indexPath.row] = Const.closeCellHeight
|
||||
cell.unfold(false, animated: true, completion: nil)
|
||||
duration = 0.8
|
||||
}
|
||||
|
||||
@@ -7,7 +7,6 @@
|
||||
objects = {
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
8498513F1C5639F9006FA400 /* FoldingCellTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8498513E1C5639F9006FA400 /* FoldingCellTests.swift */; };
|
||||
8499D8881D0054A8004B5B37 /* FoldingCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 8499D8871D0054A8004B5B37 /* FoldingCell.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
9D57F31F1EDC7A6F0004599F /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D57F31E1EDC7A6F0004599F /* AppDelegate.swift */; };
|
||||
9D57F3241EDC7A6F0004599F /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 9D57F3221EDC7A6F0004599F /* Main.storyboard */; };
|
||||
@@ -72,8 +71,6 @@
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
8498513C1C5639F9006FA400 /* FoldingCellTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = FoldingCellTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
8498513E1C5639F9006FA400 /* FoldingCellTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FoldingCellTests.swift; sourceTree = "<group>"; };
|
||||
849851401C5639F9006FA400 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
8499D8851D0054A8004B5B37 /* FoldingCell.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = FoldingCell.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
8499D8871D0054A8004B5B37 /* FoldingCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FoldingCell.h; sourceTree = "<group>"; };
|
||||
8499D8891D0054A8004B5B37 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
@@ -136,7 +133,6 @@
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
8499D8861D0054A8004B5B37 /* FoldingCell */,
|
||||
8498513D1C5639F9006FA400 /* FoldingCellTests */,
|
||||
9D57F31D1EDC7A6F0004599F /* FoldingCell-Demo */,
|
||||
9DAA51551EDDBAD700DFC539 /* FoldingCell-DemoObjc */,
|
||||
847A58051C294F750028FB84 /* Products */,
|
||||
@@ -154,15 +150,6 @@
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
8498513D1C5639F9006FA400 /* FoldingCellTests */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
8498513E1C5639F9006FA400 /* FoldingCellTests.swift */,
|
||||
849851401C5639F9006FA400 /* Info.plist */,
|
||||
);
|
||||
path = FoldingCellTests;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
8499D8861D0054A8004B5B37 /* FoldingCell */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
@@ -395,7 +382,6 @@
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
8498513F1C5639F9006FA400 /* FoldingCellTests.swift in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@@ -524,7 +510,7 @@
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 10.0;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 11.4;
|
||||
MTL_ENABLE_DEBUG_INFO = YES;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
SDKROOT = iphoneos;
|
||||
@@ -572,7 +558,7 @@
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 10.0;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 11.4;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
SDKROOT = iphoneos;
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
|
||||
|
||||
@@ -26,7 +26,7 @@ import UIKit
|
||||
/// UITableViewCell with folding animation
|
||||
open class FoldingCell: UITableViewCell {
|
||||
|
||||
/// UIView whitch display when cell open
|
||||
/// UIView is displayed when cell open
|
||||
@IBOutlet open var containerView: UIView!
|
||||
@IBOutlet open var containerViewTop: NSLayoutConstraint!
|
||||
|
||||
@@ -103,6 +103,7 @@ open class FoldingCell: UITableViewCell {
|
||||
var rotatedViews = [RotatedView]()
|
||||
|
||||
animationView?.subviews
|
||||
.lazy
|
||||
.compactMap({ $0 as? RotatedView })
|
||||
.sorted(by: { $0.tag < $1.tag })
|
||||
.forEach { itemView in
|
||||
@@ -183,14 +184,14 @@ open class FoldingCell: UITableViewCell {
|
||||
let foregroundViewSize = foregroundView.bounds.size
|
||||
|
||||
// added first item
|
||||
var image = containerView.pb_takeSnapshot(CGRect(x: 0, y: 0, width: containerViewSize.width, height: foregroundViewSize.height))
|
||||
var image = containerView.takeSnapshot(CGRect(x: 0, y: 0, width: containerViewSize.width, height: foregroundViewSize.height))
|
||||
var imageView = UIImageView(image: image)
|
||||
imageView.tag = 0
|
||||
imageView.layer.cornerRadius = foregroundView.layer.cornerRadius
|
||||
animationView?.addSubview(imageView)
|
||||
|
||||
// added secod item
|
||||
image = containerView.pb_takeSnapshot(CGRect(x: 0, y: foregroundViewSize.height, width: containerViewSize.width, height: foregroundViewSize.height))
|
||||
image = containerView.takeSnapshot(CGRect(x: 0, y: foregroundViewSize.height, width: containerViewSize.width, height: foregroundViewSize.height))
|
||||
|
||||
imageView = UIImageView(image: image)
|
||||
let rotatedView = RotatedView(frame: imageView.frame)
|
||||
@@ -216,7 +217,7 @@ open class FoldingCell: UITableViewCell {
|
||||
var yPosition = 2 * foregroundViewSize.height
|
||||
var tag = 2
|
||||
for _ in 2 ..< itemCount {
|
||||
image = containerView.pb_takeSnapshot(CGRect(x: 0, y: yPosition, width: containerViewSize.width, height: itemHeight))
|
||||
image = containerView.takeSnapshot(CGRect(x: 0, y: yPosition, width: containerViewSize.width, height: itemHeight))
|
||||
|
||||
imageView = UIImageView(image: image)
|
||||
let rotatedView = RotatedView(frame: imageView.frame)
|
||||
@@ -400,6 +401,12 @@ open class FoldingCell: UITableViewCell {
|
||||
// MARK: RotatedView
|
||||
|
||||
open class RotatedView: UIView {
|
||||
|
||||
fileprivate enum Const {
|
||||
static let rotationX = "rotation.x"
|
||||
static let transformRotationX = "transform.rotation.x"
|
||||
}
|
||||
|
||||
var hiddenAfterAnimation = false
|
||||
var backView: RotatedView?
|
||||
|
||||
@@ -446,7 +453,7 @@ extension RotatedView: CAAnimationDelegate {
|
||||
|
||||
func foldingAnimation(_ timing: String, from: CGFloat, to: CGFloat, duration: TimeInterval, delay: TimeInterval, hidden: Bool) {
|
||||
|
||||
let rotateAnimation = CABasicAnimation(keyPath: "transform.rotation.x")
|
||||
let rotateAnimation = CABasicAnimation(keyPath: Const.transformRotationX)
|
||||
rotateAnimation.timingFunction = CAMediaTimingFunction(name: timing)
|
||||
rotateAnimation.fromValue = from
|
||||
rotateAnimation.toValue = to
|
||||
@@ -458,7 +465,7 @@ extension RotatedView: CAAnimationDelegate {
|
||||
|
||||
self.hiddenAfterAnimation = hidden
|
||||
|
||||
self.layer.add(rotateAnimation, forKey: "rotation.x")
|
||||
self.layer.add(rotateAnimation, forKey: Const.rotationX)
|
||||
}
|
||||
|
||||
public func animationDidStart(_: CAAnimation) {
|
||||
@@ -476,9 +483,10 @@ extension RotatedView: CAAnimationDelegate {
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: UIView + extension
|
||||
private extension UIView {
|
||||
|
||||
func pb_takeSnapshot(_ frame: CGRect) -> UIImage? {
|
||||
func takeSnapshot(_ frame: CGRect) -> UIImage? {
|
||||
UIGraphicsBeginImageContextWithOptions(frame.size, false, 0)
|
||||
|
||||
guard let context = UIGraphicsGetCurrentContext() else { return nil }
|
||||
|
||||
@@ -14,17 +14,17 @@
|
||||
[](https://paypal.me/Ramotion)
|
||||
|
||||
# Check this library on other platforms:
|
||||
<a href="https://github.com/Ramotion/folding-cell-android">
|
||||
<a href="https://github.com/Ramotion/folding-cell-android">
|
||||
<img src="https://github.com/ramotion/navigation-stack/raw/master/Android_Java@2x.png" width="178" height="81"></a>
|
||||
|
||||
**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://dev.ramotion.com/?utm_source=gthb&utm_medium=special&utm_campaign=folding-cell-contact-us">
|
||||
<a href="mailto:alex.a@ramotion.com?subject=Project%20inquiry%20from%20Github">
|
||||
<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=folding-cell) available [here](https://store.ramotion.com?utm_source=gthb&utm_medium=special&utm_campaign=folding-cell).
|
||||
The [iPhone mockup](https://store.ramotion.com/product/iphone-x-clay-mockups?utm_source=gthb&utm_medium=special&utm_campaign=folding-cell) available [here](https://store.ramotion.com?utm_source=gthb&utm_medium=special&utm_campaign=folding-cell).
|
||||
|
||||
## Requirements
|
||||
|
||||
@@ -111,14 +111,14 @@ fileprivate struct C {
|
||||
}
|
||||
|
||||
var duration = 0.0
|
||||
if cellHeights[indexPath.row] == kCloseCellHeight { // open cell
|
||||
cellHeights[indexPath.row] = kOpenCellHeight
|
||||
cell.selectedAnimation(true, animated: true, completion: nil)
|
||||
if cellIsCollapsed {
|
||||
cellHeights[indexPath.row] = Const.openCellHeight
|
||||
cell.unfold(true, animated: true, completion: nil)
|
||||
duration = 0.5
|
||||
} else {// close cell
|
||||
cellHeights[indexPath.row] = kCloseCellHeight
|
||||
cell.selectedAnimation(false, animated: true, completion: nil)
|
||||
duration = 1.1
|
||||
} else {
|
||||
cellHeights[indexPath.row] = Const.closeCellHeight
|
||||
cell.unfold(false, animated: true, completion: nil)
|
||||
duration = 0.8
|
||||
}
|
||||
|
||||
UIView.animateWithDuration(duration, delay: 0, options: .CurveEaseOut, animations: { _ in
|
||||
@@ -161,7 +161,7 @@ Create foregroundView and containerView from code (steps 2 - 3) look example:
|
||||
Folding cell 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
|
||||
Try this UI component and more like this in our iOS app. Contact us if interested.
|
||||
@@ -169,11 +169,11 @@ Try this UI component and more like this in our iOS app. Contact us if intereste
|
||||
<a href="https://itunes.apple.com/app/apple-store/id1182360240?pt=550053&ct=folding-cell&mt=8" >
|
||||
<img src="https://github.com/ramotion/gliding-collection/raw/master/app_store@2x.png" width="117" height="34"></a>
|
||||
|
||||
<a href="https://dev.ramotion.com/?utm_source=gthb&utm_medium=special&utm_campaign=folding-cell-contact-us">
|
||||
<a href="mailto:alex.a@ramotion.com?subject=Project%20inquiry%20from%20Github">
|
||||
<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>
|
||||
## Follow us for the latest update<br>
|
||||
<a href="https://goo.gl/rPFpid" >
|
||||
<img src="https://i.imgur.com/ziSqeSo.png/" width="156" height="28"></a>
|
||||
|
||||
Reference in New Issue
Block a user