Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
69d23c77e3 | ||
|
|
b72c60ecef | ||
|
|
969de052b5 | ||
|
|
6bbb16b789 | ||
|
|
2f674a55aa | ||
|
|
4f0839691d | ||
|
|
400dbe0026 | ||
|
|
d4e153b429 | ||
|
|
099764c8a7 | ||
|
|
12802f304b | ||
|
|
acd221c9eb | ||
|
|
ea002f99fb | ||
|
|
6f78c54039 | ||
|
|
002d6158e6 | ||
|
|
fd443d5fb5 | ||
|
|
d8ded28b60 | ||
|
|
f32dca84ee | ||
|
|
f783526444 | ||
|
|
e4e75eb5c5 | ||
|
|
980dc63dd9 | ||
|
|
a0021618de | ||
|
|
7a931cb414 | ||
|
|
ab56f9ad83 | ||
|
|
47397e60c6 | ||
|
|
63e9ff9410 | ||
|
|
6b95f91f86 | ||
|
|
c439f9af9b | ||
|
|
5bd466425f | ||
|
|
4b152e7901 | ||
|
|
756c665759 | ||
|
|
29f151dcef |
+1
-1
@@ -1,6 +1,6 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'FoldingCell'
|
||||
s.version = '2.0.0'
|
||||
s.version = '2.0.4'
|
||||
s.summary = 'UITableViewCell with folding animation.'
|
||||
s.homepage = 'https://github.com/Ramotion/folding-cell'
|
||||
s.license = 'MIT'
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="11201" systemVersion="15G1004" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="0cn-rv-Emg">
|
||||
<dependencies>
|
||||
<deployment identifier="iOS"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="11161"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
|
||||
@@ -177,7 +177,7 @@ open class FoldingCell: UITableViewCell {
|
||||
self.contentView.addConstraints(newConstraints)
|
||||
|
||||
for constraint in containerView.constraints { // added height constraint
|
||||
if constraint.firstAttribute == .height {
|
||||
if constraint.firstAttribute == .height, let item: UIView = constraint.firstItem as? UIView, item == containerView {
|
||||
let newConstraint = NSLayoutConstraint(item: animationView, attribute: constraint.firstAttribute,
|
||||
relatedBy: constraint.relation, toItem: nil, attribute: constraint.secondAttribute,
|
||||
multiplier: constraint.multiplier, constant: constraint.constant)
|
||||
@@ -217,11 +217,13 @@ open class FoldingCell: UITableViewCell {
|
||||
let itemHeight = (contSize.height - 2 * forgSize.height) / CGFloat(itemCount - 2)
|
||||
|
||||
if itemCount == 2 {
|
||||
// decrease containerView height or increase itemCount
|
||||
assert(contSize.height - 2 * forgSize.height == 0, "contanerView.height too high")
|
||||
// decrease containerView height or increase itemCount
|
||||
assert(contSize.height - 2 * forgSize.height == 0, "contanerView.height too high")
|
||||
}
|
||||
else{
|
||||
// decrease containerView height or increase itemCount
|
||||
assert(contSize.height - 2 * forgSize.height >= itemHeight, "contanerView.height too high")
|
||||
}
|
||||
// decrease containerView height or increase itemCount
|
||||
assert(contSize.height - 2 * forgSize.height >= itemHeight, "contanerView.height too high")
|
||||
|
||||
var yPosition = 2 * forgSize.height
|
||||
var tag = 2
|
||||
@@ -310,7 +312,7 @@ open class FoldingCell: UITableViewCell {
|
||||
func durationSequence(_ type: AnimationType)-> [TimeInterval] {
|
||||
var durations = [TimeInterval]()
|
||||
for index in 0..<itemCount-1 {
|
||||
let duration = animationDuration(index, type: .open)
|
||||
let duration = animationDuration(index, type: type)
|
||||
durations.append(TimeInterval(duration / 2.0))
|
||||
durations.append(TimeInterval(duration / 2.0))
|
||||
}
|
||||
@@ -334,7 +336,7 @@ open class FoldingCell: UITableViewCell {
|
||||
var delay: TimeInterval = 0
|
||||
var timing = kCAMediaTimingFunctionEaseIn
|
||||
var from: CGFloat = 0.0;
|
||||
var to: CGFloat = CGFloat(-M_PI / 2)
|
||||
var to: CGFloat = -CGFloat.pi / 2
|
||||
var hidden = true
|
||||
configureAnimationItems(.open)
|
||||
|
||||
@@ -347,9 +349,9 @@ open class FoldingCell: UITableViewCell {
|
||||
|
||||
animatedView.foldingAnimation(timing, from: from, to: to, duration: durations[index], delay: delay, hidden: hidden)
|
||||
|
||||
from = from == 0.0 ? CGFloat(M_PI / 2) : 0.0;
|
||||
to = to == 0.0 ? CGFloat(-M_PI / 2) : 0.0;
|
||||
timing = timing == kCAMediaTimingFunctionEaseIn ? kCAMediaTimingFunctionEaseOut : kCAMediaTimingFunctionEaseIn;
|
||||
from = from == 0.0 ? CGFloat.pi / 2 : 0.0
|
||||
to = to == 0.0 ? -CGFloat.pi / 2 : 0.0
|
||||
timing = timing == kCAMediaTimingFunctionEaseIn ? kCAMediaTimingFunctionEaseOut : kCAMediaTimingFunctionEaseIn
|
||||
hidden = !hidden
|
||||
delay += durations[index]
|
||||
}
|
||||
@@ -385,7 +387,7 @@ open class FoldingCell: UITableViewCell {
|
||||
var delay: TimeInterval = 0
|
||||
var timing = kCAMediaTimingFunctionEaseIn
|
||||
var from: CGFloat = 0.0;
|
||||
var to: CGFloat = CGFloat(M_PI / 2)
|
||||
var to: CGFloat = CGFloat.pi / 2
|
||||
var hidden = true
|
||||
configureAnimationItems(.close)
|
||||
|
||||
@@ -397,9 +399,9 @@ open class FoldingCell: UITableViewCell {
|
||||
|
||||
animatedView.foldingAnimation(timing, from: from, to: to, duration: durations[index], delay: delay, hidden: hidden)
|
||||
|
||||
to = to == 0.0 ? CGFloat(M_PI / 2) : 0.0;
|
||||
from = from == 0.0 ? CGFloat(-M_PI / 2) : 0.0;
|
||||
timing = timing == kCAMediaTimingFunctionEaseIn ? kCAMediaTimingFunctionEaseOut : kCAMediaTimingFunctionEaseIn;
|
||||
to = to == 0.0 ? CGFloat.pi / 2 : 0.0
|
||||
from = from == 0.0 ? -CGFloat.pi / 2 : 0.0
|
||||
timing = timing == kCAMediaTimingFunctionEaseIn ? kCAMediaTimingFunctionEaseOut : kCAMediaTimingFunctionEaseIn
|
||||
hidden = !hidden
|
||||
delay += durations[index]
|
||||
}
|
||||
@@ -504,8 +506,8 @@ extension UIView {
|
||||
func pb_takeSnapshot(_ frame: CGRect) -> UIImage? {
|
||||
UIGraphicsBeginImageContextWithOptions(frame.size, false, 0.0)
|
||||
|
||||
let context = UIGraphicsGetCurrentContext();
|
||||
context!.translateBy(x: frame.origin.x * -1, y: frame.origin.y * -1)
|
||||
guard let context = UIGraphicsGetCurrentContext() else { return nil }
|
||||
context.translateBy(x: frame.origin.x * -1, y: frame.origin.y * -1)
|
||||
|
||||
guard let currentContext = UIGraphicsGetCurrentContext() else {
|
||||
return nil
|
||||
|
||||
@@ -34,7 +34,8 @@ class MainTableViewController: UITableViewController {
|
||||
|
||||
override func viewDidLoad() {
|
||||
super.viewDidLoad()
|
||||
|
||||
tableView.estimatedRowHeight = kCloseCellHeight
|
||||
tableView.rowHeight = UITableViewAutomaticDimension
|
||||
createCellHeightsArray()
|
||||
self.tableView.backgroundColor = UIColor(patternImage: UIImage(named: "background")!)
|
||||
}
|
||||
|
||||
@@ -10,14 +10,21 @@
|
||||
[](https://github.com/Carthage/Carthage)
|
||||
[](https://github.com/igrigorik/ga-beacon)
|
||||
|
||||
|
||||
## About
|
||||
This project is maintained by Ramotion, an agency specialized in building dedicated engineering teams and developing custom software.<br><br> [Contact our team](https://business.ramotion.com?utm_source=gthb&utm_medium=special&utm_campaign=foolding-cell-contact-us) and we’ll help you work with the best engineers from Eastern Europe.
|
||||
This project is maintained by Ramotion, Inc.<br>
|
||||
We specialize in the designing and coding of custom UI for Mobile Apps and Websites.<br><br>**Looking for developers for your project?**
|
||||
|
||||
<a href="https://business.ramotion.com?utm_source=gthb&utm_medium=special&utm_campaign=foolding-cell-contact-us/#Get_in_Touch" > <img src="https://github.com/Ramotion/navigation-stack/raw/master/contact_our_team@2x.png" width="150" height="30"></a>
|
||||
|
||||
[](https://dribbble.com/shots/2121350-Delivery-Card)
|
||||
|
||||
|
||||
The [iPhone mockup](https://store.ramotion.com/product/iphone-6-mockups?utm_source=gthb&utm_medium=special&utm_campaign=folding-cell) available [here](https://store.ramotion.com/product/iphone-6-mockups?utm_source=gthb&utm_medium=special&utm_campaign=folding-cell).
|
||||
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).
|
||||
|
||||
## Try this UI control in action
|
||||
|
||||
<a href="https://itunes.apple.com/app/apple-store/id1182360240?pt=550053&ct=gthb-folding-cell&mt=8" > <img src="https://github.com/Ramotion/navigation-stack/raw/master/Download_on_the_App_Store_Badge_US-UK_135x40.png" width="170" height="58"></a>
|
||||
|
||||
## Requirements
|
||||
|
||||
- iOS 8.0+
|
||||
@@ -28,17 +35,17 @@ The [iPhone mockup](https://store.ramotion.com/product/iphone-6-mockups?utm_sour
|
||||
Just add the FoldingCell.swift file to your project.
|
||||
|
||||
or use [CocoaPods](https://cocoapods.org) with Podfile:
|
||||
``` ruby
|
||||
pod 'FoldingCell'
|
||||
```
|
||||
|
||||
pod 'FoldingCell', '~> 2.0.3'
|
||||
```
|
||||
or [Carthage](https://github.com/Carthage/Carthage) users can simply add Mantle to their `Cartfile`:
|
||||
```
|
||||
github "Ramotion/folding-cell" "~> 1.0.0" swift 2.2
|
||||
github "Ramotion/folding-cell"
|
||||
|
||||
github "Ramotion/folding-cell" "~> 2.0.0" swift 3
|
||||
```
|
||||
|
||||
or just drag and drop FoldingCell.swift file to your project
|
||||
|
||||
## Solution
|
||||

|
||||
## Usage
|
||||
@@ -76,24 +83,17 @@ Ok, we've finished configuring the cell.
|
||||
|
||||
5.1) Add constants:
|
||||
``` swift
|
||||
let kCloseCellHeight: CGFloat = *** // equal or greater foregroundView height
|
||||
let kOpenCellHeight: CGFloat = *** // equal or greater containerView height
|
||||
fileprivate struct C {
|
||||
struct CellHeight {
|
||||
static let close: CGFloat = *** // equal or greater foregroundView height
|
||||
static let open: CGFloat = *** // equal or greater containerView height
|
||||
}
|
||||
}
|
||||
```
|
||||
5.2) Add property
|
||||
5.2) Add property for calculate cells height
|
||||
|
||||
``` swift
|
||||
var cellHeights = [CGFloat]()
|
||||
```
|
||||
|
||||
create in viewDidLoad:
|
||||
``` swift
|
||||
override func viewDidLoad() {
|
||||
super.viewDidLoad()
|
||||
|
||||
for _ in 0...kRowsCount {
|
||||
cellHeights.append(kCloseCellHeight)
|
||||
}
|
||||
}
|
||||
var cellHeights = (0..<CELLCOUNT).map { _ in C.CellHeight.close }
|
||||
```
|
||||
|
||||
5.3) Override method:
|
||||
@@ -106,7 +106,9 @@ Ok, we've finished configuring the cell.
|
||||
5.4) Added code to method:
|
||||
``` swift
|
||||
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
|
||||
let cell = tableView.cellForRowAtIndexPath(indexPath) as! FoldingCell
|
||||
guard case let cell as FoldingCell = tableView.cellForRowAtIndexPath(indexPath) else {
|
||||
return
|
||||
}
|
||||
|
||||
var duration = 0.0
|
||||
if cellHeights[indexPath.row] == kCloseCellHeight { // open cell
|
||||
@@ -119,7 +121,7 @@ Ok, we've finished configuring the cell.
|
||||
duration = 1.1
|
||||
}
|
||||
|
||||
UIView.animateWithDuration(duration, delay: 0, options: .CurveEaseOut, animations: { () -> Void in
|
||||
UIView.animateWithDuration(duration, delay: 0, options: .CurveEaseOut, animations: { _ in
|
||||
tableView.beginUpdates()
|
||||
tableView.endUpdates()
|
||||
}, completion: nil)
|
||||
@@ -129,10 +131,8 @@ Ok, we've finished configuring the cell.
|
||||
``` swift
|
||||
override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
|
||||
|
||||
if cell is FoldingCell {
|
||||
let foldingCell = cell as! FoldingCell
|
||||
|
||||
if cellHeights![indexPath.row] == kCloseCellHeight {
|
||||
if case let cell as FoldingCell = cell {
|
||||
if cellHeights![indexPath.row] == C.cellHeights.close {
|
||||
foldingCell.selectedAnimation(false, animated: false, completion:nil)
|
||||
} else {
|
||||
foldingCell.selectedAnimation(true, animated: false, completion: nil)
|
||||
|
||||
Reference in New Issue
Block a user