Compare commits

...
69 Commits
Author SHA1 Message Date
igor.k 5cf01ed2b4 increment podspec version 2019-11-06 15:56:55 +03:00
Ramotion 8862c5a93b Update README.md 2019-10-12 19:11:03 +03:00
Ramotion 3706f42f61 Update README.md 2019-10-12 19:10:14 +03:00
igor.k 994a279cd1 update readme file 2019-10-12 03:37:23 +03:00
igor.k fe877556eb swift package manager support 2019-10-12 03:32:04 +03:00
igor.k 26944727f8 fix problem with ObjC demo project (issue #182) 2019-10-12 02:29:47 +03:00
igor.k ebb321c834 small fixes 2019-10-12 01:55:35 +03:00
Alex K cad71f1978 add comments to demo project 2019-05-21 09:31:10 +03:00
Alex K 1a2e00efb8 bump version 2019-05-13 09:43:16 +03:00
Alex K 2187548e04 Fixes #169 2019-04-22 10:22:38 +03:00
Alex 21400b213b Merge pull request #159 from PeterStaev/fix-overridable-objc-method
mark method with dynamic so it can be inherited in objc
2019-04-18 17:57:08 +03:00
Alex K e94aea843f bump deployment target 2019-04-11 11:55:22 +03:00
Alex K 6f1a6fa9b6 update travis 2019-04-04 10:21:45 +03:00
Alex K 8aeec37d98 update readme 2019-03-28 10:06:06 +03:00
Alex K 29e7a6488e converted to swift 5 2019-03-28 09:56:35 +03:00
Alex K 5e21e0ef11 code improvements 2019-03-21 09:21:01 +03:00
Alex K 1b4659d06c small improves 2019-03-14 12:42:54 +03:00
Alex K e1ce24444f small fix 2019-03-07 16:27:02 +03:00
Alex K dc889f787d bump version 2019-03-01 09:20:55 +03:00
Alex K 5afa9a0fa9 code improvements 2019-02-22 09:33:36 +03:00
Alex K 851de6ba7d clean up tests 2019-02-15 09:55:32 +03:00
Alex K 0ab9b0e6a2 Cleaning tests 2019-02-08 11:17:18 +03:00
Alex K ed1785d514 test case refactor 2019-02-01 12:31:05 +03:00
Alex K d310932e45 fileprivate to private 2019-01-25 09:59:22 +03:00
Alex K 8e1d1040df clean tests 2019-01-18 09:56:15 +03:00
Alex K f5847da4fb Merge branch 'master' of github.com:Ramotion/folding-cell 2019-01-11 10:26:34 +03:00
Alex K faf95986ac add test method testRotateX 2019-01-11 10:26:03 +03:00
Ramotion 71708c994e Update README.md 2019-01-04 12:31:02 +03:00
Ramotion 0b403320fa Add files via upload 2018-12-27 07:45:31 -08:00
Ramotion 5d041c1bac Update README.md 2018-12-27 18:05:24 +03:00
Ramotion 8e56e7cd18 Update README.md 2018-12-27 17:03:37 +03:00
Ramotion a056df2e23 Update Header 2018-12-27 06:01:04 -08:00
Ramotion 6bb7bc1051 Update README.md 2018-12-27 16:57:08 +03:00
Ramotion 68c1c15831 Update README.md 2018-12-21 12:50:32 +03:00
Ramotion 2ab14733a5 Update README.md 2018-12-20 14:15:02 +03:00
Alex K 2900fcb254 Merge branch 'master' of github.com:Ramotion/folding-cell 2018-12-17 10:30:40 +03:00
Alex K 5f11f00043 add test 2018-12-17 10:30:10 +03:00
Ramotion 7f0951ca09 Update README.md 2018-12-10 11:57:24 +03:00
Ramotion 08908652c1 Update README.md 2018-12-10 10:16:11 +03:00
Alex K 3981f6930b add test file for RotationView class 2018-12-04 10:07:14 +03:00
Alex K c6c6dd6254 change deployment target 2018-11-27 10:46:46 +03:00
Alex K f6121df6eb add test scheme 2018-11-20 09:58:45 +03:00
Alex K 86ced39c50 update travis 2018-11-20 09:50:35 +03:00
Alex K 7648567b0a travis 2018-11-20 09:43:08 +03:00
Alex K f325b3c7c0 update travis yml 2018-11-13 10:27:05 +03:00
Alex K 50e0ebbf97 improve test unfold method 2018-11-06 10:25:46 +03:00
Alex K 3d7e47951f update podspec 2018-10-30 10:13:52 +03:00
Alex K 5d31dfa9bf Merge branch 'master' of github.com:Ramotion/folding-cell 2018-10-23 09:25:56 +03:00
Alex K 2285009361 small improvements 2018-10-23 09:24:41 +03:00
Juri Vasylenko 42ef7ce2f2 Update README.md 2018-10-16 19:35:02 +03:00
Alex K f6d649a79c update podspec 2018-10-16 09:16:56 +03:00
Alex K 2bc6905e3a make openAnimation and closeAnimation functions private 2018-10-09 09:23:41 +03:00
Alex K f279359721 update swift-version file 2018-10-01 11:29:22 +03:00
Alex K 859a868aa4 add unfold test 2018-09-24 10:01:20 +03:00
Alex K c9c516dc19 update podspec 2018-09-17 10:34:01 +03:00
Alex K 3335c26e78 converted to swift 4.2 2018-09-17 10:32:37 +03:00
Alex K 27d2bc7a62 update podspec 2018-09-17 10:30:41 +03:00
Peter Staev a4ea00866e mark method with dynamic so it can be inherited in objc 2018-09-14 16:37:12 +03:00
Alex 882a279d56 Merge pull request #157 from PeterStaev/nativescript
Export important APIs to ObjC
2018-09-10 09:51:04 +03:00
Alex K 959c31e2c5 add firs test create folding cell 2018-09-06 14:45:13 +03:00
Peter Staev 8777fc4410 expose enum to ObjC 2018-09-03 16:31:56 +03:00
Peter Staev 27b748230b export animationDuration to ObjC 2018-09-03 16:23:36 +03:00
Peter Staev f887081e42 export isUnfolded to ObjC 2018-09-03 16:23:25 +03:00
Peter Staev 370b3dae99 expose commonInit to ObjC 2018-08-31 19:08:20 +03:00
Alex K d6e2b6cebb test init 2018-08-30 17:42:21 +03:00
Alex K a102990f70 add Tests target 2018-08-24 10:58:25 +03:00
Alex K 78f726da6b update podspec 2018-08-17 09:59:14 +03:00
Alex K de2815310c code improve 2018-07-31 09:20:27 +03:00
Alex K 79ebfdad72 update podspec 2018-07-24 09:41:19 +03:00
17 changed files with 394 additions and 169 deletions
+1 -1
View File
@@ -1 +1 @@
4.0
4.2
+2 -4
View File
@@ -1,11 +1,9 @@
osx_image: xcode9.2
osx_image: xcode10.2
language: objective-c
xcode_project: FoldingCell/FoldingCell.xcodeproj
xcode_scheme: FoldingCell
xcode_sdk: iphonesimulator11.2
# SWIFT_VERSION: 4.0
xcode_sdk: iphonesimulator12.2
# whitelist
branches:
+1 -1
View File
@@ -1,6 +1,6 @@
Pod::Spec.new do |s|
s.name = 'FoldingCell'
s.version = '3.1.2'
s.version = '5.0.2'
s.summary = 'UITableViewCell with folding animation.'
s.homepage = 'https://github.com/Ramotion/folding-cell'
s.license = 'MIT'
@@ -28,7 +28,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_: UIApplication, didFinishLaunchingWithOptions _: [UIApplicationLaunchOptionsKey: Any]? = nil) -> Bool {
func application(_: UIApplication, didFinishLaunchingWithOptions _: [UIApplication.LaunchOptionsKey: Any]? = nil) -> Bool {
return true
}
}
@@ -39,6 +39,11 @@
"idiom" : "iphone",
"size" : "60x60",
"scale" : "3x"
},
{
"idiom" : "ios-marketing",
"size" : "1024x1024",
"scale" : "1x"
}
],
"info" : {
@@ -1,11 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="13771" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="0cn-rv-Emg">
<device id="retina4_7" orientation="portrait">
<adaptation id="fullscreen"/>
</device>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="15400" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="0cn-rv-Emg">
<device id="retina4_7" orientation="portrait" appearance="light"/>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13772"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="15404"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<customFonts key="customFonts">
@@ -20,10 +18,10 @@
</array>
</customFonts>
<scenes>
<!--Main Table View Controller-->
<!--Table View Controller-->
<scene sceneID="Q2d-BE-geS">
<objects>
<tableViewController storyboardIdentifier="MainTableViewController" id="0cn-rv-Emg" customClass="MainTableViewController" customModule="FoldingCell_Demo" customModuleProvider="target" sceneMemberID="viewController">
<tableViewController storyboardIdentifier="MainTableViewController" id="0cn-rv-Emg" customClass="TableViewController" customModule="FoldingCell_Demo" customModuleProvider="target" sceneMemberID="viewController">
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" dataMode="prototypes" style="plain" separatorStyle="none" rowHeight="667" sectionHeaderHeight="28" sectionFooterHeight="28" id="MwZ-K3-six">
<rect key="frame" x="0.0" y="0.0" width="600" height="708"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
@@ -221,7 +219,7 @@
<rect key="frame" x="0.0" y="0.0" width="560" height="49"/>
<subviews>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="vW5-Q1-KFs">
<rect key="frame" x="14" y="10" width="38" height="29"/>
<rect key="frame" x="14" y="-4.5" width="76" height="58"/>
<state key="normal" image="burger"/>
</button>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="# 2618-3157" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="7eb-NE-XLS">
@@ -378,7 +376,7 @@
<nil key="highlightedColor"/>
</label>
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="stars" translatesAutoresizingMaskIntoConstraints="NO" id="DCW-h4-xYV">
<rect key="frame" x="79" y="50.5" width="97" height="17"/>
<rect key="frame" x="79" y="50.5" width="194" height="34"/>
</imageView>
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="photo" translatesAutoresizingMaskIntoConstraints="NO" id="Nm8-JU-yEj" userLabel="photo">
<rect key="frame" x="22" y="28" width="49" height="49"/>
@@ -388,7 +386,7 @@
</constraints>
</imageView>
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="arrow" translatesAutoresizingMaskIntoConstraints="NO" id="YsL-0v-aFS">
<rect key="frame" x="522" y="40" width="16" height="25"/>
<rect key="frame" x="506" y="27.5" width="32" height="50"/>
</imageView>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="fuy-ww-tkB" userLabel="line">
<rect key="frame" x="22" y="92" width="516" height="1"/>
@@ -705,7 +703,7 @@
<image name="arrow" width="16" height="25"/>
<image name="burger" width="38" height="29"/>
<image name="dots" width="14" height="84"/>
<image name="image" width="340" height="165"/>
<image name="image" width="340.5" height="165"/>
<image name="photo" width="98" height="98"/>
<image name="stars" width="97" height="17"/>
</resources>
@@ -1,5 +1,5 @@
//
// MainTableViewController.swift
// TableViewController.swift
//
// Copyright (c) 21/12/15. Ramotion Inc. (http://ramotion.com)
//
@@ -24,7 +24,7 @@
import FoldingCell
import UIKit
class MainTableViewController: UITableViewController {
class TableViewController: UITableViewController {
enum Const {
static let closeCellHeight: CGFloat = 179
@@ -34,15 +34,17 @@ class MainTableViewController: UITableViewController {
var cellHeights: [CGFloat] = []
// MARK: Life Cycle
override func viewDidLoad() {
super.viewDidLoad()
setup()
}
// MARK: Helpers
private func setup() {
cellHeights = Array(repeating: Const.closeCellHeight, count: Const.rowsCount)
tableView.estimatedRowHeight = Const.closeCellHeight
tableView.rowHeight = UITableViewAutomaticDimension
tableView.rowHeight = UITableView.automaticDimension
tableView.backgroundColor = UIColor(patternImage: #imageLiteral(resourceName: "background"))
if #available(iOS 10.0, *) {
tableView.refreshControl = UIRefreshControl()
@@ -50,6 +52,7 @@ class MainTableViewController: UITableViewController {
}
}
// MARK: Actions
@objc func refreshHandler() {
let deadlineTime = DispatchTime.now() + .seconds(1)
DispatchQueue.main.asyncAfter(deadline: deadlineTime, execute: { [weak self] in
@@ -63,7 +66,7 @@ class MainTableViewController: UITableViewController {
// MARK: - TableView
extension MainTableViewController {
extension TableViewController {
override func tableView(_: UITableView, numberOfRowsInSection _: Int) -> Int {
return 10
@@ -120,6 +123,11 @@ extension MainTableViewController {
UIView.animate(withDuration: duration, delay: 0, options: .curveEaseOut, animations: { () -> Void in
tableView.beginUpdates()
tableView.endUpdates()
// fix https://github.com/Ramotion/folding-cell/issues/169
if cell.frame.maxY > tableView.frame.maxY {
tableView.scrollToRow(at: indexPath, at: UITableView.ScrollPosition.bottom, animated: true)
}
}, completion: nil)
}
}
@@ -1,10 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="12120" systemVersion="16F73" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="0cn-rv-Emg">
<device id="retina4_7" orientation="portrait">
<adaptation id="fullscreen"/>
</device>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="15400" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="0cn-rv-Emg">
<device id="retina4_7" orientation="portrait" appearance="light"/>
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="12088"/>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="15404"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<customFonts key="customFonts">
@@ -361,7 +360,7 @@
<rect key="frame" x="79" y="50.5" width="97" height="17"/>
</imageView>
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="photo" translatesAutoresizingMaskIntoConstraints="NO" id="Nm8-JU-yEj" userLabel="photo">
<rect key="frame" x="22" y="28" width="49" height="49"/>
<rect key="frame" x="22" y="28" width="49.000000000000028" height="49.000000000000028"/>
<constraints>
<constraint firstAttribute="height" constant="49" id="JNu-y1-BLY"/>
<constraint firstAttribute="width" constant="49" id="qpi-cG-s4a"/>
@@ -679,7 +678,7 @@
<image name="arrow" width="16" height="25"/>
<image name="burger" width="38" height="29"/>
<image name="dots" width="14" height="84"/>
<image name="image" width="340" height="165"/>
<image name="image" width="340.5" height="165"/>
<image name="photo" width="98" height="98"/>
<image name="stars" width="97" height="17"/>
</resources>
+130 -82
View File
@@ -7,12 +7,14 @@
objects = {
/* Begin PBXBuildFile section */
5A0E1C3021414940006A0374 /* FoldingCellDemoTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5A0E1C2F21414940006A0374 /* FoldingCellDemoTests.swift */; };
5A1225D821B65E8E005BBB26 /* RotationViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5A1225D721B65E8E005BBB26 /* RotationViewTests.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 */; };
9D57F3261EDC7A6F0004599F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9D57F3251EDC7A6F0004599F /* Assets.xcassets */; };
9D57F3291EDC7A6F0004599F /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 9D57F3271EDC7A6F0004599F /* LaunchScreen.storyboard */; };
9D57F32F1EDC7A850004599F /* MainTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D57F32E1EDC7A850004599F /* MainTableViewController.swift */; };
9D57F32F1EDC7A850004599F /* TableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D57F32E1EDC7A850004599F /* TableViewController.swift */; };
9D57F3311EDC7AAD0004599F /* DemoCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D57F3301EDC7AAD0004599F /* DemoCell.swift */; };
9D57F3331EDC7ACF0004599F /* FoldingCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D57F3321EDC7ACF0004599F /* FoldingCell.swift */; };
9D57F3341EDC7AD80004599F /* FoldingCell.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8499D8851D0054A8004B5B37 /* FoldingCell.framework */; };
@@ -28,6 +30,13 @@
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
5A0E1C3221414940006A0374 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 847A57FC1C294F750028FB84 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 9D57F31B1EDC7A6F0004599F;
remoteInfo = "FoldingCell-Demo";
};
9D57F3361EDC7AD80004599F /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 847A57FC1C294F750028FB84 /* Project object */;
@@ -70,7 +79,10 @@
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
8498513C1C5639F9006FA400 /* FoldingCellTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = FoldingCellTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
5A0E1C2D21414940006A0374 /* FoldingCellDemoTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = FoldingCellDemoTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
5A0E1C2F21414940006A0374 /* FoldingCellDemoTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FoldingCellDemoTests.swift; sourceTree = "<group>"; };
5A0E1C3121414940006A0374 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
5A1225D721B65E8E005BBB26 /* RotationViewTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RotationViewTests.swift; 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>"; };
@@ -80,7 +92,7 @@
9D57F3251EDC7A6F0004599F /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
9D57F3281EDC7A6F0004599F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
9D57F32A1EDC7A6F0004599F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
9D57F32E1EDC7A850004599F /* MainTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MainTableViewController.swift; sourceTree = "<group>"; };
9D57F32E1EDC7A850004599F /* TableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TableViewController.swift; sourceTree = "<group>"; };
9D57F3301EDC7AAD0004599F /* DemoCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DemoCell.swift; sourceTree = "<group>"; };
9D57F3321EDC7ACF0004599F /* FoldingCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FoldingCell.swift; sourceTree = "<group>"; };
9DAA51541EDDBAD700DFC539 /* FoldingCell-DemoObjc.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "FoldingCell-DemoObjc.app"; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -96,7 +108,7 @@
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
849851391C5639F9006FA400 /* Frameworks */ = {
5A0E1C2A21414940006A0374 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
@@ -129,12 +141,23 @@
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
5A0E1C2E21414940006A0374 /* FoldingCellDemoTests */ = {
isa = PBXGroup;
children = (
5A0E1C2F21414940006A0374 /* FoldingCellDemoTests.swift */,
5A0E1C3121414940006A0374 /* Info.plist */,
5A1225D721B65E8E005BBB26 /* RotationViewTests.swift */,
);
path = FoldingCellDemoTests;
sourceTree = "<group>";
};
847A57FB1C294F750028FB84 = {
isa = PBXGroup;
children = (
8499D8861D0054A8004B5B37 /* FoldingCell */,
9D57F31D1EDC7A6F0004599F /* FoldingCell-Demo */,
9DAA51551EDDBAD700DFC539 /* FoldingCell-DemoObjc */,
5A0E1C2E21414940006A0374 /* FoldingCellDemoTests */,
847A58051C294F750028FB84 /* Products */,
);
sourceTree = "<group>";
@@ -142,10 +165,10 @@
847A58051C294F750028FB84 /* Products */ = {
isa = PBXGroup;
children = (
8498513C1C5639F9006FA400 /* FoldingCellTests.xctest */,
8499D8851D0054A8004B5B37 /* FoldingCell.framework */,
9D57F31C1EDC7A6F0004599F /* FoldingCell-Demo.app */,
9DAA51541EDDBAD700DFC539 /* FoldingCell-DemoObjc.app */,
5A0E1C2D21414940006A0374 /* FoldingCellDemoTests.xctest */,
);
name = Products;
sourceTree = "<group>";
@@ -165,7 +188,7 @@
children = (
9D57F31E1EDC7A6F0004599F /* AppDelegate.swift */,
9D57F3301EDC7AAD0004599F /* DemoCell.swift */,
9D57F32E1EDC7A850004599F /* MainTableViewController.swift */,
9D57F32E1EDC7A850004599F /* TableViewController.swift */,
9D57F3221EDC7A6F0004599F /* Main.storyboard */,
9D57F3251EDC7A6F0004599F /* Assets.xcassets */,
9D57F3271EDC7A6F0004599F /* LaunchScreen.storyboard */,
@@ -212,21 +235,22 @@
/* End PBXHeadersBuildPhase section */
/* Begin PBXNativeTarget section */
8498513B1C5639F9006FA400 /* FoldingCellTests */ = {
5A0E1C2C21414940006A0374 /* FoldingCellDemoTests */ = {
isa = PBXNativeTarget;
buildConfigurationList = 849851431C5639F9006FA400 /* Build configuration list for PBXNativeTarget "FoldingCellTests" */;
buildConfigurationList = 5A0E1C3421414940006A0374 /* Build configuration list for PBXNativeTarget "FoldingCellDemoTests" */;
buildPhases = (
849851381C5639F9006FA400 /* Sources */,
849851391C5639F9006FA400 /* Frameworks */,
8498513A1C5639F9006FA400 /* Resources */,
5A0E1C2921414940006A0374 /* Sources */,
5A0E1C2A21414940006A0374 /* Frameworks */,
5A0E1C2B21414940006A0374 /* Resources */,
);
buildRules = (
);
dependencies = (
5A0E1C3321414940006A0374 /* PBXTargetDependency */,
);
name = FoldingCellTests;
productName = FoldingCellTests;
productReference = 8498513C1C5639F9006FA400 /* FoldingCellTests.xctest */;
name = FoldingCellDemoTests;
productName = FoldingCellDemoTests;
productReference = 5A0E1C2D21414940006A0374 /* FoldingCellDemoTests.xctest */;
productType = "com.apple.product-type.bundle.unit-test";
};
8499D8841D0054A8004B5B37 /* FoldingCell */ = {
@@ -291,25 +315,25 @@
847A57FC1C294F750028FB84 /* Project object */ = {
isa = PBXProject;
attributes = {
LastSwiftUpdateCheck = 0830;
LastUpgradeCheck = 0930;
LastSwiftUpdateCheck = 0940;
LastUpgradeCheck = 1110;
ORGANIZATIONNAME = "Alex K.";
TargetAttributes = {
8498513B1C5639F9006FA400 = {
CreatedOnToolsVersion = 7.2;
DevelopmentTeam = 2VFCBFYPFW;
LastSwiftMigration = 0800;
TestTargetID = 847A58031C294F750028FB84;
5A0E1C2C21414940006A0374 = {
CreatedOnToolsVersion = 9.4;
LastSwiftMigration = 1020;
ProvisioningStyle = Automatic;
TestTargetID = 9D57F31B1EDC7A6F0004599F;
};
8499D8841D0054A8004B5B37 = {
CreatedOnToolsVersion = 7.3.1;
DevelopmentTeam = LEAZS7L33U;
LastSwiftMigration = 0830;
LastSwiftMigration = 1020;
};
9D57F31B1EDC7A6F0004599F = {
CreatedOnToolsVersion = 8.3.2;
DevelopmentTeam = 34MUF9YXTA;
LastSwiftMigration = 0920;
DevelopmentTeam = LEAZS7L33U;
LastSwiftMigration = 1020;
ProvisioningStyle = Automatic;
};
9DAA51531EDDBAD700DFC539 = {
@@ -321,7 +345,7 @@
};
buildConfigurationList = 847A57FF1C294F750028FB84 /* Build configuration list for PBXProject "FoldingCell" */;
compatibilityVersion = "Xcode 3.2";
developmentRegion = English;
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
@@ -335,13 +359,13 @@
8499D8841D0054A8004B5B37 /* FoldingCell */,
9D57F31B1EDC7A6F0004599F /* FoldingCell-Demo */,
9DAA51531EDDBAD700DFC539 /* FoldingCell-DemoObjc */,
8498513B1C5639F9006FA400 /* FoldingCellTests */,
5A0E1C2C21414940006A0374 /* FoldingCellDemoTests */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
8498513A1C5639F9006FA400 /* Resources */ = {
5A0E1C2B21414940006A0374 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
@@ -378,10 +402,12 @@
/* End PBXResourcesBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
849851381C5639F9006FA400 /* Sources */ = {
5A0E1C2921414940006A0374 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
5A1225D821B65E8E005BBB26 /* RotationViewTests.swift in Sources */,
5A0E1C3021414940006A0374 /* FoldingCellDemoTests.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -397,7 +423,7 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
9D57F32F1EDC7A850004599F /* MainTableViewController.swift in Sources */,
9D57F32F1EDC7A850004599F /* TableViewController.swift in Sources */,
9D57F31F1EDC7A6F0004599F /* AppDelegate.swift in Sources */,
9D57F3311EDC7AAD0004599F /* DemoCell.swift in Sources */,
);
@@ -416,6 +442,11 @@
/* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
5A0E1C3321414940006A0374 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 9D57F31B1EDC7A6F0004599F /* FoldingCell-Demo */;
targetProxy = 5A0E1C3221414940006A0374 /* PBXContainerItemProxy */;
};
9D57F3371EDC7AD80004599F /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 8499D8841D0054A8004B5B37 /* FoldingCell */;
@@ -464,10 +495,58 @@
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
5A0E1C3521414940006A0374 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_IDENTITY = "iPhone Developer";
CODE_SIGN_STYLE = Automatic;
GCC_C_LANGUAGE_STANDARD = gnu11;
INFOPLIST_FILE = FoldingCellDemoTests/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = com.ramotion.FoldingCellDemoTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/FoldingCell-Demo.app/FoldingCell-Demo";
};
name = Debug;
};
5A0E1C3621414940006A0374 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_IDENTITY = "iPhone Developer";
CODE_SIGN_STYLE = Automatic;
GCC_C_LANGUAGE_STANDARD = gnu11;
INFOPLIST_FILE = FoldingCellDemoTests/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = com.ramotion.FoldingCellDemoTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/FoldingCell-Demo.app/FoldingCell-Demo";
};
name = Release;
};
847A58141C294F750028FB84 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
@@ -510,7 +589,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 11.4;
IPHONEOS_DEPLOYMENT_TARGET = 12.2;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
@@ -522,6 +601,7 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
@@ -558,7 +638,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 11.4;
IPHONEOS_DEPLOYMENT_TARGET = 12.2;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
@@ -566,42 +646,12 @@
};
name = Release;
};
849851441C5639F9006FA400 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = 2VFCBFYPFW;
INFOPLIST_FILE = FoldingCellTests/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = com.ramotion.FoldingCellTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 3.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/FoldingCellDemo.app/FoldingCellDemo";
};
name = Debug;
};
849851451C5639F9006FA400 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = 2VFCBFYPFW;
INFOPLIST_FILE = FoldingCellTests/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = com.ramotion.FoldingCellTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 3.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/FoldingCellDemo.app/FoldingCellDemo";
};
name = Release;
};
8499D88F1D0054A8004B5B37 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_ANALYZER_NONNULL = YES;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_IDENTITY = "iPhone Developer";
CODE_SIGN_IDENTITY = "";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
CURRENT_PROJECT_VERSION = 1;
DEFINES_MODULE = YES;
@@ -617,7 +667,7 @@
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 4.0;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
VERSIONING_SYSTEM = "apple-generic";
VERSION_INFO_PREFIX = "";
@@ -629,7 +679,7 @@
buildSettings = {
CLANG_ANALYZER_NONNULL = YES;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_IDENTITY = "iPhone Developer";
CODE_SIGN_IDENTITY = "";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
CURRENT_PROJECT_VERSION = 1;
DEFINES_MODULE = YES;
@@ -644,7 +694,7 @@
PRODUCT_BUNDLE_IDENTIFIER = com.ramotion.FoldingCell;
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
SWIFT_VERSION = 4.0;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
VERSIONING_SYSTEM = "apple-generic";
VERSION_INFO_PREFIX = "";
@@ -661,16 +711,15 @@
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CODE_SIGN_IDENTITY = "iPhone Developer";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
DEVELOPMENT_TEAM = 34MUF9YXTA;
DEVELOPMENT_TEAM = LEAZS7L33U;
INFOPLIST_FILE = "FoldingCell-Demo/Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = "ramotion.com.FoldingCell-Demo";
PRODUCT_BUNDLE_IDENTIFIER = "ramotion.com.FoldingCell-Demo-ser";
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_SWIFT3_OBJC_INFERENCE = Default;
SWIFT_VERSION = 4.0;
SWIFT_VERSION = 5.0;
};
name = Debug;
};
@@ -684,15 +733,14 @@
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CODE_SIGN_IDENTITY = "iPhone Developer";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
DEVELOPMENT_TEAM = 34MUF9YXTA;
DEVELOPMENT_TEAM = LEAZS7L33U;
INFOPLIST_FILE = "FoldingCell-Demo/Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = "ramotion.com.FoldingCell-Demo";
PRODUCT_BUNDLE_IDENTIFIER = "ramotion.com.FoldingCell-Demo-ser";
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_SWIFT3_OBJC_INFERENCE = Default;
SWIFT_VERSION = 4.0;
SWIFT_VERSION = 5.0;
};
name = Release;
};
@@ -739,6 +787,15 @@
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
5A0E1C3421414940006A0374 /* Build configuration list for PBXNativeTarget "FoldingCellDemoTests" */ = {
isa = XCConfigurationList;
buildConfigurations = (
5A0E1C3521414940006A0374 /* Debug */,
5A0E1C3621414940006A0374 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
847A57FF1C294F750028FB84 /* Build configuration list for PBXProject "FoldingCell" */ = {
isa = XCConfigurationList;
buildConfigurations = (
@@ -748,15 +805,6 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
849851431C5639F9006FA400 /* Build configuration list for PBXNativeTarget "FoldingCellTests" */ = {
isa = XCConfigurationList;
buildConfigurations = (
849851441C5639F9006FA400 /* Debug */,
849851451C5639F9006FA400 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
8499D88E1D0054A8004B5B37 /* Build configuration list for PBXNativeTarget "FoldingCell" */ = {
isa = XCConfigurationList;
buildConfigurations = (
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0930"
LastUpgradeVersion = "1110"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
@@ -27,10 +27,27 @@
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "8499D8841D0054A8004B5B37"
BuildableName = "FoldingCell.framework"
BlueprintName = "FoldingCell"
ReferencedContainer = "container:FoldingCell.xcodeproj">
</BuildableReference>
</MacroExpansion>
<Testables>
<TestableReference
skipped = "NO">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "5A0E1C2C21414940006A0374"
BuildableName = "FoldingCellDemoTests.xctest"
BlueprintName = "FoldingCellDemoTests"
ReferencedContainer = "container:FoldingCell.xcodeproj">
</BuildableReference>
</TestableReference>
</Testables>
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
@@ -51,8 +68,6 @@
ReferencedContainer = "container:FoldingCell.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
+33 -24
View File
@@ -26,6 +26,8 @@ import UIKit
/// UITableViewCell with folding animation
open class FoldingCell: UITableViewCell {
@objc open var isUnfolded = false
/// UIView is displayed when cell open
@IBOutlet open var containerView: UIView!
@IBOutlet open var containerViewTop: NSLayoutConstraint!
@@ -49,7 +51,7 @@ open class FoldingCell: UITableViewCell {
- Open: Open direction
- Close: Close direction
*/
public enum AnimationType {
@objc public enum AnimationType : Int {
case open
case close
}
@@ -65,7 +67,7 @@ open class FoldingCell: UITableViewCell {
/**
Call this method in methods init(style: UITableViewCellStyle, reuseIdentifier: String?) after creating Views
*/
open func commonInit() {
@objc open func commonInit() {
configureDefaultState()
selectionStyle = .none
@@ -76,7 +78,7 @@ open class FoldingCell: UITableViewCell {
// MARK: configure
func configureDefaultState() {
private func configureDefaultState() {
guard let foregroundViewTop = self.foregroundViewTop,
let containerViewTop = self.containerViewTop else {
@@ -93,16 +95,17 @@ open class FoldingCell: UITableViewCell {
foregroundView.layer.transform = foregroundView.transform3d()
createAnimationView()
contentView.bringSubview(toFront: foregroundView)
contentView.bringSubviewToFront(foregroundView)
}
func createAnimationItemView() -> [RotatedView] {
private func createAnimationItemView() -> [RotatedView] {
var items = [RotatedView]()
items.append(foregroundView)
var rotatedViews = [RotatedView]()
animationView?.subviews
.lazy
.compactMap({ $0 as? RotatedView })
.sorted(by: { $0.tag < $1.tag })
.forEach { itemView in
@@ -120,18 +123,16 @@ open class FoldingCell: UITableViewCell {
if animationType == .open {
animationView?.subviews
.lazy
.compactMap { $0 as? RotatedView }
.forEach { $0.alpha = 0 }
} else {
animationView?.subviews
.lazy
.compactMap { $0 as? RotatedView }
.forEach {
if animationType == .open {
$0.alpha = 0
} else {
$0.alpha = 1
$0.backView?.alpha = 0
}
$0.alpha = animationType == .open ? 0 : 1
if animationType != .open { $0.backView?.alpha = 0 }
}
}
}
@@ -276,11 +277,9 @@ open class FoldingCell: UITableViewCell {
return animationView?.alpha == 1 ? true : false
}
open var isUnfolded = false
// MARK: Animations
open func animationDuration(_ itemIndex: NSInteger, type: AnimationType) -> TimeInterval {
@objc open dynamic func animationDuration(_ itemIndex: NSInteger, type: AnimationType) -> TimeInterval {
return type == .close ? durationsForCollapsedState[itemIndex] : durationsForExpandedState[itemIndex]
}
@@ -297,7 +296,7 @@ open class FoldingCell: UITableViewCell {
return durations
}
public func openAnimation(_ completion: (() -> Void)?) {
func openAnimation(_ completion: (() -> Void)?) {
isUnfolded = true
removeImageItemsFromAnimationView()
addImageItemsToAnimationView()
@@ -308,7 +307,7 @@ open class FoldingCell: UITableViewCell {
let durations = durationSequence(.open)
var delay: TimeInterval = 0
var timing = kCAMediaTimingFunctionEaseIn
var timing = convertFromCAMediaTimingFunctionName(CAMediaTimingFunctionName.easeIn)
var from: CGFloat = 0.0
var to: CGFloat = -CGFloat.pi / 2
var hidden = true
@@ -325,7 +324,7 @@ open class FoldingCell: UITableViewCell {
from = from == 0.0 ? CGFloat.pi / 2 : 0.0
to = to == 0.0 ? -CGFloat.pi / 2 : 0.0
timing = timing == kCAMediaTimingFunctionEaseIn ? kCAMediaTimingFunctionEaseOut : kCAMediaTimingFunctionEaseIn
timing = timing == convertFromCAMediaTimingFunctionName(CAMediaTimingFunctionName.easeIn) ? convertFromCAMediaTimingFunctionName(CAMediaTimingFunctionName.easeOut) : convertFromCAMediaTimingFunctionName(CAMediaTimingFunctionName.easeIn)
hidden = !hidden
delay += durations[index]
}
@@ -344,7 +343,7 @@ open class FoldingCell: UITableViewCell {
}
}
public func closeAnimation(_ completion: (() -> Void)?) {
func closeAnimation(_ completion: (() -> Void)?) {
isUnfolded = false
removeImageItemsFromAnimationView()
addImageItemsToAnimationView()
@@ -356,10 +355,10 @@ open class FoldingCell: UITableViewCell {
animationView?.alpha = 1
containerView.alpha = 0
var durations: [TimeInterval] = durationSequence(.close).reversed()
let durations: [TimeInterval] = durationSequence(.close).reversed()
var delay: TimeInterval = 0
var timing = kCAMediaTimingFunctionEaseIn
var timing = convertFromCAMediaTimingFunctionName(CAMediaTimingFunctionName.easeIn)
var from: CGFloat = 0.0
var to: CGFloat = CGFloat.pi / 2
var hidden = true
@@ -375,7 +374,7 @@ open class FoldingCell: UITableViewCell {
to = to == 0.0 ? CGFloat.pi / 2 : 0.0
from = from == 0.0 ? -CGFloat.pi / 2 : 0.0
timing = timing == kCAMediaTimingFunctionEaseIn ? kCAMediaTimingFunctionEaseOut : kCAMediaTimingFunctionEaseIn
timing = timing == convertFromCAMediaTimingFunctionName(CAMediaTimingFunctionName.easeIn) ? convertFromCAMediaTimingFunctionName(CAMediaTimingFunctionName.easeOut) : convertFromCAMediaTimingFunctionName(CAMediaTimingFunctionName.easeIn)
hidden = !hidden
delay += durations[index]
}
@@ -401,7 +400,7 @@ open class FoldingCell: UITableViewCell {
open class RotatedView: UIView {
fileprivate enum Const {
private enum Const {
static let rotationX = "rotation.x"
static let transformRotationX = "transform.rotation.x"
}
@@ -453,12 +452,12 @@ extension RotatedView: CAAnimationDelegate {
func foldingAnimation(_ timing: String, from: CGFloat, to: CGFloat, duration: TimeInterval, delay: TimeInterval, hidden: Bool) {
let rotateAnimation = CABasicAnimation(keyPath: Const.transformRotationX)
rotateAnimation.timingFunction = CAMediaTimingFunction(name: timing)
rotateAnimation.timingFunction = CAMediaTimingFunction(name: convertToCAMediaTimingFunctionName(timing))
rotateAnimation.fromValue = from
rotateAnimation.toValue = to
rotateAnimation.duration = duration
rotateAnimation.delegate = self
rotateAnimation.fillMode = kCAFillModeForwards
rotateAnimation.fillMode = CAMediaTimingFillMode.forwards
rotateAnimation.isRemovedOnCompletion = false
rotateAnimation.beginTime = CACurrentMediaTime() + delay
@@ -498,3 +497,13 @@ private extension UIView {
return image
}
}
// Helper function inserted by Swift 4.2 migrator.
fileprivate func convertFromCAMediaTimingFunctionName(_ input: CAMediaTimingFunctionName) -> String {
return input.rawValue
}
// Helper function inserted by Swift 4.2 migrator.
fileprivate func convertToCAMediaTimingFunctionName(_ input: String) -> CAMediaTimingFunctionName {
return CAMediaTimingFunctionName(rawValue: input)
}
@@ -0,0 +1,30 @@
import XCTest
import UIKit
@testable import FoldingCell
@testable import FoldingCell_Demo
class FoldingCellDemoTests: XCTestCase {
var foldingCell: FoldingCell!
override func setUp() {
super.setUp()
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewController(withIdentifier: "MainTableViewController") as! MainTableViewController
_ = vc.view
foldingCell = vc.tableView.dequeueReusableCell(withIdentifier: "FoldingCell", for: IndexPath(row: 0, section: 0)) as? FoldingCell
}
func testCreateFoldingCell() {
XCTAssertNotNil(foldingCell)
}
func testUnfold() {
XCTAssertEqual(foldingCell.isUnfolded, false)
foldingCell.unfold(true)
XCTAssertEqual(foldingCell.isUnfolded, true)
foldingCell.unfold(false)
XCTAssertEqual(foldingCell.isUnfolded, false)
}
}
@@ -0,0 +1,22 @@
<?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>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>BNDL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
</dict>
</plist>
@@ -0,0 +1,37 @@
import XCTest
import UIKit
@testable import FoldingCell
class RotationViewTests: XCTestCase {
var rotationView: RotatedView!
override func setUp() {
rotationView = RotatedView()
}
func testCreateRotationView() {
XCTAssertNotNil(rotationView)
}
func testAddBackView() {
XCTAssertNil(rotationView.backView)
let color = UIColor.red
rotationView.addBackView(100, color: color)
XCTAssertNotNil(rotationView.backView)
XCTAssertEqual(rotationView.backView?.backgroundColor, color)
}
func testRotateX() {
let key = "layer.transform.rotation.x"
let startX = (rotationView.value(forKeyPath: key) as? NSNumber)?.floatValue
XCTAssertEqual(startX, 0)
let angel: CGFloat = 0.5
rotationView.rotatedX(angel)
let x = (rotationView.value(forKeyPath: key) as? NSNumber)?.floatValue
XCTAssertEqual(x, Float(angel))
}
}
+43
View File
@@ -0,0 +1,43 @@
// swift-tools-version:5.1
//
// Package.swift
//
// Copyright (c) Ramotion Inc. (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: "FoldingCell",
platforms: [
.iOS(.v8)
],
products: [
.library(name: "FoldingCell",
targets: ["FoldingCell"]),
],
targets: [
.target(name: "FoldingCell",
path: "FoldingCell/FoldingCell")
],
swiftLanguageVersions: [.v5]
)
+42 -29
View File
@@ -1,35 +1,41 @@
![header](./header.png)
<img src="https://github.com/Ramotion/folding-cell/blob/master/Screenshots/foldingCell.gif" width="600" height="450" /></a>
<br><br/>
<a href="https://www.ramotion.com/agency/app-development?utm_source=gthb&utm_medium=repo&utm_campaign=folding-cell"><img src="https://github.com/Ramotion/folding-cell/blob/master/header.png"></a>
<a href="https://github.com/Ramotion/folding-cell">
<img align="left" src="https://github.com/Ramotion/folding-cell/blob/master/Screenshots/foldingCell.gif" width="480" height="360" /></a>
<p><h1 align="left">FOLDING CELL</h1></p>
<h4>Expanding content cell with animation inspired by folding paper card material design.</h4>
___
<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=folding-cell">
<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>
# FoldingCell
[![CocoaPods](https://img.shields.io/cocoapods/p/FoldingCell.svg)](https://cocoapods.org/pods/FoldingCell)
[![CocoaPods](https://img.shields.io/cocoapods/v/FoldingCell.svg)](http://cocoapods.org/pods/FoldingCell)
[![Twitter](https://img.shields.io/badge/Twitter-@Ramotion-blue.svg?style=flat)](http://twitter.com/Ramotion)
[![Travis](https://img.shields.io/travis/Ramotion/folding-cell.svg)](https://travis-ci.org/Ramotion/folding-cell)
[![codebeat badge](https://codebeat.co/badges/6f67da5d-c416-4bac-9fb7-c2dc938feedc)](https://codebeat.co/projects/github-com-ramotion-folding-cell)
[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage)
[![Swift 4.0](https://img.shields.io/badge/Swift-4.0-green.svg?style=flat)](https://developer.apple.com/swift/)
[![Swift 4.0](https://img.shields.io/badge/Swift-5.0-green.svg?style=flat)](https://developer.apple.com/swift/)
[![Analytics](https://ga-beacon.appspot.com/UA-84973210-1/ramotion/folding-cell)](https://github.com/igrigorik/ga-beacon)
[![Donate](https://img.shields.io/badge/Donate-PayPal-blue.svg)](https://paypal.me/Ramotion)
# Check this library on other platforms:
<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="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/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
- iOS 8.0+
- Xcode 9.0+
- Xcode 10.2
## Installation
@@ -42,8 +48,14 @@ pod 'FoldingCell'
or [Carthage](https://github.com/Carthage/Carthage) users can simply add Mantle to their `Cartfile`:
```
github "Ramotion/folding-cell"
```
or [Swift Package Manager](https://swift.org/package-manager/) by adding:
```
dependencies: [
.package(url: "https://github.com/Ramotion/folding-cell.git", from: "5.0.2")
]
```
to `Package.swift`
or just drag and drop FoldingCell.swift file to your project
@@ -156,24 +168,25 @@ fileprivate struct C {
Create foregroundView and containerView from code (steps 2 - 3) look example:
[Folding-cell-programmatically](https://github.com/ober01/Folding-cell-programmatically)
## Licence
## 🗂 Check this library on other language:
<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>
## 📄 License
Folding cell is released under the MIT license.
See [LICENSE](./LICENSE) for details.
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=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="mailto:alex.a@ramotion.com?subject=Project%20inquiry%20from%20Github">
<a href="https://www.ramotion.com/agency/app-development?utm_source=gthb&utm_medium=repo&utm_campaign=folding-cell">
<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 update<br>
<a href="https://goo.gl/rPFpid" >
<img src="https://i.imgur.com/ziSqeSo.png/" width="156" height="28"></a>
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 16 KiB