Compare commits

..
29 Commits
Author SHA1 Message Date
Alex df7777f1dd Merge pull request #58 from AntiVIRUZ/additional-customization
Adding customization
2017-05-23 09:29:05 +03:00
Vasiliy Yatsevich 15419f5d6a Added customization of width, height and position of back view, now you can disable shadow. Back compatibility has been saved. 2017-05-22 21:24:49 +03:00
Russell 7cfa15526b update demo to swift 3 2017-05-08 10:03:59 +03:00
Juri Vasylenko dbc17e3350 Update README.md 2017-04-05 19:55:43 +03:00
Alex Mikhnev b0b71a7492 Update README.md 2017-03-10 19:53:05 +03:00
Juri Vasylenko 698ba6ce3b Update README.md 2017-02-17 18:00:24 +03:00
Juri Vasylenko ab039916ca Update README.md 2017-01-20 16:09:37 +03:00
aleksei1000000 184ad73a1d Update README.md 2017-01-10 17:18:12 +03:00
Ober01 0cd732c252 swingen file changed 2016-10-25 14:37:13 +03:00
Alex a60a161ac8 Merge pull request #42 from nikolaevigor/master
fixed PageCollecitonCell's frame bug
2016-10-25 14:28:05 +03:00
nikolaevigor bc6093f4c2 fixed bug, causing PageCollecitonCell's frame to shrink instead of expand 2016-10-25 01:01:32 +03:00
Alex.k 61665d8b00 updated readme and podspec 2016-10-17 15:52:43 +03:00
Alex.k c9d69f148c Merge branch 'master' of https://github.com/Ramotion/expanding-collection 2016-10-17 15:48:19 +03:00
Alex.k e4f0d79eaa fixed bug with blinking on iOS 10 2016-10-17 15:48:14 +03:00
Juri Vasylenko a44e54d7e9 Update README.md 2016-10-17 16:37:10 +04:00
Juri Vasylenko b11b0ce612 Update .travis.yml 2016-10-17 16:35:32 +04:00
Alex 8976f8e45f Update README.md
Fixes #30
2016-10-17 14:23:36 +03:00
aleksei1000000 717cccf841 Update README.md 2016-10-17 10:00:40 +03:00
aleksei1000000 9d7e14d7f5 Update README.md 2016-10-14 14:39:18 +03:00
aleksei1000000 6ac142d507 Update README.md 2016-10-14 14:04:41 +03:00
aleksei1000000 6fb5efd349 Update README.md 2016-10-14 13:56:59 +03:00
aleksei1000000 e0ef4dd95c Update README.md 2016-10-14 13:00:40 +03:00
aleksei1000000 b00bd352c0 Update README.md 2016-10-14 12:56:40 +03:00
aleksei1000000 224131ffc3 Update README.md 2016-10-14 12:55:39 +03:00
aleksei1000000 017a311d93 Update README.md 2016-10-14 12:49:20 +03:00
Alex.k c424208817 updated readme and podspect 2016-10-14 10:42:52 +03:00
Alex.k 307d2d8951 deployment target -> 9.0 2016-10-14 10:29:08 +03:00
Alex.k c2cb27dc85 updated readme 2016-10-14 10:25:37 +03:00
Alex.k 5f30473885 update readme 2016-10-10 16:58:23 +03:00
12 changed files with 132 additions and 64 deletions
+1 -1
View File
@@ -1,4 +1,4 @@
osx_image: xcode7.3
osx_image: xcode8
language: objective-c
xcode_project: DemoExpandingCollection/DemoExpandingCollection.xcodeproj
@@ -569,7 +569,7 @@
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "if which swiftgen >/dev/null; then\nswiftgen images \"$PROJECT_DIR/DemoExpandingCollection/Assets.xcassets\" --output \"$PROJECT_DIR/DemoExpandingCollection/Constants/Images.swift\"\nelse\necho \"warning: SwiftGen not installed, download it from https://github.com/AliSoftware/SwiftGen\"\nfi";
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 */
@@ -759,7 +759,7 @@
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
DEVELOPMENT_TEAM = 34MUF9YXTA;
INFOPLIST_FILE = DemoExpandingCollection/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = com.ramotion.dev1;
PRODUCT_NAME = "$(TARGET_NAME)";
@@ -777,7 +777,7 @@
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
DEVELOPMENT_TEAM = 34MUF9YXTA;
INFOPLIST_FILE = DemoExpandingCollection/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = com.ramotion.dev1;
PRODUCT_NAME = "$(TARGET_NAME)";
@@ -824,7 +824,7 @@
DYLIB_INSTALL_NAME_BASE = "@rpath";
INFOPLIST_FILE = ExpandingCollection/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = com.ramotion.dev;
PRODUCT_NAME = "$(TARGET_NAME)";
@@ -848,7 +848,7 @@
DYLIB_INSTALL_NAME_BASE = "@rpath";
INFOPLIST_FILE = ExpandingCollection/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = com.ramotion.dev;
PRODUCT_NAME = "$(TARGET_NAME)";
@@ -1,5 +1,15 @@
{
"images" : [
{
"idiom" : "iphone",
"size" : "20x20",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "20x20",
"scale" : "3x"
},
{
"idiom" : "iphone",
"size" : "29x29",
@@ -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="L1n-Ia-Jrw">
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="11161"/>
<capability name="Constraints to layout margins" minToolsVersion="6.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
@@ -1,35 +1,59 @@
// Generated using SwiftGen, by O.Halligon — https://github.com/AliSoftware/SwiftGen
import Foundation
import UIKit
#if os(iOS) || os(tvOS) || os(watchOS)
import UIKit.UIImage
typealias Image = UIImage
#elseif os(OSX)
import AppKit.NSImage
typealias Image = NSImage
#endif
extension UIImage {
enum Asset: String {
case BackgroundImage = "BackgroundImage"
case CloseButton = "CloseButton"
case Dots = "dots"
case Face1 = "face1"
case Face2 = "face2"
case Heand = "heand"
case Icons = "icons"
case Image = "image"
case Item0 = "item0"
case Item1 = "item1"
case Item2 = "item2"
case Item3 = "item3"
case LocationButton = "locationButton"
case Map = "map"
case PinIcon = "pinIcon"
case SearchIcon = "searchIcon"
case Stars = "stars"
case Title = "Title"
// swiftlint:disable file_length
// swiftlint:disable line_length
var image: UIImage {
return UIImage(asset: self)
}
}
// swiftlint:disable type_body_length
enum Asset: String {
case backgroundImage = "BackgroundImage"
case closeButton = "CloseButton"
case dots = "dots"
case face1 = "face1"
case face2 = "face2"
case heand = "heand"
case icons = "icons"
case image = "image"
case item0 = "item0"
case item1 = "item1"
case item2 = "item2"
case item3 = "item3"
case locationButton = "locationButton"
case map = "map"
case pinIcon = "pinIcon"
case searchIcon = "searchIcon"
case stars = "stars"
case title = "Title"
convenience init!(asset: Asset) {
self.init(named: asset.rawValue)
var image: Image {
let bundle = Bundle(for: BundleToken.self)
#if os(iOS) || os(tvOS) || os(watchOS)
let image = Image(named: rawValue, in: bundle, compatibleWith: nil)
#elseif os(OSX)
let image = bundle.image(forResource: rawValue)
#endif
guard let result = image else { fatalError("Unable to load image \(rawValue).") }
return result
}
}
// swiftlint:enable type_body_length
extension Image {
convenience init!(asset: Asset) {
#if os(iOS) || os(tvOS) || os(watchOS)
let bundle = Bundle(for: BundleToken.self)
self.init(named: asset.rawValue, in: bundle, compatibleWith: nil)
#elseif os(OSX)
self.init(named: asset.rawValue)
#endif
}
}
private final class BundleToken {}
@@ -14,7 +14,7 @@ class DemoTableViewController: ExpandingTableViewController {
override func viewDidLoad() {
super.viewDidLoad()
configureNavBar()
let image1 = UIImage.Asset.BackgroundImage.image
let image1 = Asset.backgroundImage.image
tableView.backgroundView = UIImageView(image: image1)
}
}
@@ -17,10 +17,10 @@ extension Rotatable {
func rotateAnimationFrom(_ fromItem: UIView, toItem: UIView, duration: Double) {
let fromRotate = animationFrom(0, to: M_PI, key: "transform.rotation", duration: duration)
let fromRotate = animationFrom(0, to: Double.pi, key: "transform.rotation", duration: duration)
let fromOpacity = animationFrom(1, to: 0, key: "opacity", duration: duration)
let toRotate = animationFrom(-M_PI, to: 0, key: "transform.rotation", duration: duration)
let toRotate = animationFrom(-Double.pi, to: 0, key: "transform.rotation", duration: duration)
let toOpacity = animationFrom(0, to: 1, key: "opacity", duration: duration)
fromItem.layer.add(fromRotate, forKey: nil)
+15 -8
View File
@@ -8,21 +8,28 @@
[![CocoaPods](https://img.shields.io/cocoapods/metrics/doc-percent/expanding-collection.svg)](https://cdn.rawgit.com/Ramotion/expanding-collection/master/docs/index.html)
[![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/elastic-pull-to-update.svg?branch=master)](https://travis-ci.org/Ramotion/elastic-pull-to-update)
[![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)
[![Analytics](https://ga-beacon.appspot.com/UA-84973210-1/ramotion/expanding-collection)](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=expanding-collection-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=expanding-collection-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>
[![Animation](https://raw.githubusercontent.com/Ramotion/expanding-collection/master/preview.gif)](https://dribbble.com/shots/2741477-iOS-Expanding-Collection-Open-Source)
The [iPhone mockup](https://store.ramotion.com/product/iphone-6-mockups?utm_source=gthb&utm_medium=special&utm_campaign=expanding-collection) available [here](https://store.ramotion.com/product/iphone-6-mockups?utm_source=gthb&utm_medium=special&utm_campaign=expanding-collection).
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).
## Try this UI control in action
<a href="https://itunes.apple.com/app/apple-store/id1182360240?pt=550053&ct=gthb-expanding-collection&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+
- Xcode 7.3
- iOS 9.0+
- Xcode 8
## Installation
@@ -30,7 +37,7 @@ Just add the Source folder to your project.
or use [CocoaPods](https://cocoapods.org) with Podfile:
``` ruby
pod 'expanding-collection', '~> 1.0.0' swift 3
pod 'expanding-collection', '~> 1.0.3' swift 3
pod 'expanding-collection', '~> 0.3.2' swift 2
```
@@ -42,7 +49,7 @@ github "Ramotion/expanding-collection"
## Usage
```swift
import ExpandingCollection
import expanding_collection
```
#### Create CollectionViewCell
@@ -11,8 +11,16 @@ import UIKit
/// Base class for UICollectionViewCell
open class BasePageCollectionCell: UICollectionViewCell {
/// Animation oposition offset when cell is open
/// DEPRECATED! Animation oposition offset when cell is open
@IBInspectable open var yOffset: CGFloat = 40
/// Spacing between centers of views
@IBInspectable open var ySpacing: CGFloat = CGFloat.greatestFiniteMagnitude
/// Additional height of back view, when it grows
@IBInspectable open var additionalHeight: CGFloat = CGFloat.greatestFiniteMagnitude
/// Additional width of back view, when it grows
@IBInspectable open var additionalWidth: CGFloat = CGFloat.greatestFiniteMagnitude
/// Should front view drow shadow to bottom or not
@IBInspectable open var dropShadow: Bool = true
// MARK: Constants
@@ -85,7 +93,6 @@ extension BasePageCollectionCell {
configurationViews()
shadowView = createShadowViewOnView(frontContainerView)
}
}
// MARK: Control
@@ -101,19 +108,32 @@ extension BasePageCollectionCell {
public func cellIsOpen(_ isOpen: Bool, animated: Bool = true) {
if isOpen == isOpened { return }
frontConstraintY.constant = isOpen == true ? -frontContainerView.bounds.size.height / 5 : 0
backConstraintY.constant = isOpen == true ? frontContainerView.bounds.size.height / 5 - yOffset / 2 : 0
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
} else {
frontConstraintY.constant = isOpen == true ? -ySpacing / 2 : 0
backConstraintY.constant = isOpen == true ? ySpacing / 2 : 0
}
if let widthConstant = backContainerView.getConstraint(.width) {
widthConstant.constant = isOpen == true ? frontContainerView.bounds.size.width + yOffset : frontContainerView.bounds.size.width
if additionalWidth == .greatestFiniteMagnitude {
widthConstant.constant = isOpen == true ? frontContainerView.bounds.size.width + yOffset : frontContainerView.bounds.size.width
} else {
widthConstant.constant = isOpen == true ? frontContainerView.bounds.size.width + additionalWidth : frontContainerView.bounds.size.width
}
}
if let heightConstant = backContainerView.getConstraint(.height) {
heightConstant.constant = isOpen == true ? frontContainerView.bounds.size.height + yOffset : frontContainerView.bounds.size.height
if additionalHeight == .greatestFiniteMagnitude {
heightConstant.constant = isOpen == true ? frontContainerView.bounds.size.height + yOffset : frontContainerView.bounds.size.height
} else {
heightConstant.constant = isOpen == true ? frontContainerView.bounds.size.height + additionalHeight : frontContainerView.bounds.size.height
}
}
isOpened = isOpen
configurationCell()
if animated == true {
UIView.animate(withDuration: 0.3, delay: 0, options: UIViewAnimationOptions(), animations: {
@@ -123,7 +143,6 @@ extension BasePageCollectionCell {
self.contentView.layoutIfNeeded()
}
isOpened = isOpen
}
}
@@ -149,10 +168,12 @@ extension BasePageCollectionCell {
$0.backgroundColor = UIColor(white: 0, alpha: 0)
$0.translatesAutoresizingMaskIntoConstraints = false
$0.layer.masksToBounds = false;
$0.layer.shadowColor = UIColor.black.cgColor
$0.layer.shadowRadius = 10
$0.layer.shadowOpacity = 0.3
$0.layer.shadowOffset = CGSize(width: 0, height:0)
if dropShadow {
$0.layer.shadowColor = UIColor.black.cgColor
$0.layer.shadowRadius = 10
$0.layer.shadowOpacity = 0.3
$0.layer.shadowOffset = CGSize(width: 0, height:0)
}
}
contentView.insertSubview(shadow, belowSubview: view)
@@ -192,8 +213,13 @@ extension BasePageCollectionCell {
frame.size.height += i * superHeight
frame.origin.y -= i * superHeight / 2
frame.origin.x -= i * yOffset / 2
frame.size.width += i * yOffset
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
}
}
@@ -13,12 +13,11 @@ class PageCollectionView: UICollectionView {
}
// MARK: init
extension PageCollectionView {
class func createOnView(_ view: UIView,
layout: UICollectionViewLayout,
height:CGFloat,
height: CGFloat,
dataSource: UICollectionViewDataSource,
delegate: UICollectionViewDelegate) -> PageCollectionView {
@@ -89,6 +89,9 @@ extension ExpandingViewController {
height: itemSize.height + itemSize.height / 5 * 2,
dataSource: self,
delegate: self)
if #available(iOS 10.0, *) {
collectionView?.isPrefetchingEnabled = false
}
transitionDriver = TransitionDriver(view: view)
}
}
+2 -2
View File
@@ -1,11 +1,11 @@
Pod::Spec.new do |s|
s.name = 'expanding-collection'
s.version = '1.0.0'
s.version = '1.0.3'
s.summary = 'Transition animtion from CollectionView to TableView'
s.license = 'MIT'
s.homepage = 'https://github.com/Ramotion/expanding-collection'
s.author = { 'Juri Vasylenko' => 'juri.v@ramotion.com' }
s.ios.deployment_target = '8.0'
s.ios.deployment_target = '9.0'
s.source = { :git => 'https://github.com/Ramotion/expanding-collection.git', :tag => s.version.to_s }
s.source_files = 'Source/**/*.swift'
end