Compare commits

..
49 Commits
Author SHA1 Message Date
Alex eea4c10e57 Merge pull request #60 from Jauzee/fix/socialButtonsPosition
Fix social buttons frames
2017-05-25 10:17:51 +03:00
Abdurahim Jauzee b66f2000ec Merge branch 'master' into fix/socialButtonsPosition 2017-05-24 18:33:38 +03:00
Alex 5fb237ebbe Merge pull request #59 from Jauzee/fix/titleViewPosition
Fix titleView position
2017-05-24 18:18:59 +03:00
Abdurahim Jauzee 470fb5d4c3 fix cell heights 2017-05-23 23:24:00 +03:00
Abdurahim Jauzee 34d7afffd9 fix DemoTableViewController views position 2017-05-23 23:16:28 +03:00
Abdurahim Jauzee 083e73da51 Fix titleView position 2017-05-23 22:47:06 +03:00
Alex K 63574d6dd7 update podspec 2017-05-23 09:35:39 +03:00
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
Alex 0ad7a826d1 Merge pull request #37 from EckoEdc/patch-1
Mark method from UICollectionViewDataSource open
2016-10-10 16:47:02 +03:00
Edric 3e98254fbd Mark method from UICollectionViewDataSource open
This fix compiling error:  override of non open method.
(Seen using Carthage)
2016-10-10 09:25:01 -04:00
Alex.k 83090712f9 update readme 2016-09-30 17:18:39 +03:00
Alex.k 3fbf9587c6 update podspec 2016-09-30 17:11:34 +03:00
Alex.k 027307c052 fixed transition bug 2016-09-30 17:08:49 +03:00
Alex.k 9b2acb1630 converted to swift 3 2016-09-30 15:45:33 +03:00
aleksei1000000 910117cea9 Update README.md 2016-09-29 17:15:39 +03:00
Juri Vasylenko 57f66ff374 Update README.md 2016-08-05 12:18:26 +04:00
Juri Vasylenko 31c6bb617c Update README.md 2016-07-29 16:16:21 +04:00
Juri Vasylenko ab91671d73 Merge pull request #23 from aleksei1000000/patch-1
Update README.md
2016-07-21 15:39:03 +04:00
aleksei1000000 16d082b749 Update README.md 2016-07-21 14:35:48 +03:00
aleksei1000000 36fc87a449 Update README.md 2016-07-21 12:05:53 +03:00
Alex.k 323379b216 update podspec 2016-06-16 09:03:58 +03:00
28 changed files with 850 additions and 616 deletions
+1 -1
View File
@@ -1,4 +1,4 @@
osx_image: xcode7.3
osx_image: xcode8
language: objective-c
xcode_project: DemoExpandingCollection/DemoExpandingCollection.xcodeproj
@@ -488,20 +488,23 @@
isa = PBXProject;
attributes = {
LastSwiftUpdateCheck = 0730;
LastUpgradeCheck = 0730;
LastUpgradeCheck = 0800;
ORGANIZATIONNAME = "Alex K.";
TargetAttributes = {
848596271CF585F3000BCC74 = {
CreatedOnToolsVersion = 7.3.1;
DevelopmentTeam = LEAZS7L33U;
DevelopmentTeam = 34MUF9YXTA;
LastSwiftMigration = 0800;
};
8485963B1CF585F3000BCC74 = {
CreatedOnToolsVersion = 7.3.1;
LastSwiftMigration = 0800;
TestTargetID = 848596271CF585F3000BCC74;
};
8499D8131D001B82004B5B37 = {
CreatedOnToolsVersion = 7.3.1;
DevelopmentTeam = LEAZS7L33U;
LastSwiftMigration = 0800;
};
};
};
@@ -566,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 */
@@ -673,8 +676,10 @@
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
@@ -696,7 +701,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 9.3;
IPHONEOS_DEPLOYMENT_TARGET = 10.0;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
@@ -718,8 +723,10 @@
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
@@ -735,9 +742,10 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 9.3;
IPHONEOS_DEPLOYMENT_TARGET = 10.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
VALIDATE_PRODUCT = YES;
};
name = Release;
@@ -745,32 +753,36 @@
848596461CF585F3000BCC74 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_IDENTITY = "iPhone Developer";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
EMBEDDED_CONTENT_CONTAINS_SWIFT = YES;
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.DemoExpandingCollection;
PRODUCT_BUNDLE_IDENTIFIER = com.ramotion.dev1;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE = "";
SWIFT_VERSION = 3.0;
};
name = Debug;
};
848596471CF585F3000BCC74 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_IDENTITY = "iPhone Developer";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
EMBEDDED_CONTENT_CONTAINS_SWIFT = YES;
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.DemoExpandingCollection;
PRODUCT_BUNDLE_IDENTIFIER = com.ramotion.dev1;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE = "";
SWIFT_VERSION = 3.0;
};
name = Release;
};
@@ -782,6 +794,7 @@
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = com.ramotion.DemoExpandingCollectionTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 3.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/DemoExpandingCollection.app/DemoExpandingCollection";
};
name = Debug;
@@ -794,6 +807,7 @@
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = com.ramotion.DemoExpandingCollectionTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 3.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/DemoExpandingCollection.app/DemoExpandingCollection";
};
name = Release;
@@ -802,7 +816,7 @@
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_IDENTITY = "iPhone Developer";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
CURRENT_PROJECT_VERSION = 1;
DEFINES_MODULE = YES;
DYLIB_COMPATIBILITY_VERSION = 1;
@@ -810,11 +824,12 @@
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)";
SKIP_INSTALL = YES;
SWIFT_VERSION = 3.0;
TARGETED_DEVICE_FAMILY = "1,2";
VERSIONING_SYSTEM = "apple-generic";
VERSION_INFO_PREFIX = "";
@@ -825,7 +840,7 @@
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_IDENTITY = "iPhone Developer";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
CURRENT_PROJECT_VERSION = 1;
DEFINES_MODULE = YES;
DYLIB_COMPATIBILITY_VERSION = 1;
@@ -833,11 +848,12 @@
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)";
SKIP_INSTALL = YES;
SWIFT_VERSION = 3.0;
TARGETED_DEVICE_FAMILY = "1,2";
VERSIONING_SYSTEM = "apple-generic";
VERSION_INFO_PREFIX = "";
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0730"
LastUpgradeVersion = "0800"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
@@ -14,43 +14,43 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
configureNavigationTabBar()
return true
}
func applicationWillResignActive(application: UIApplication) {
func applicationWillResignActive(_ application: UIApplication) {
}
func applicationDidEnterBackground(application: UIApplication) {
func applicationDidEnterBackground(_ application: UIApplication) {
}
func applicationWillEnterForeground(application: UIApplication) {
func applicationWillEnterForeground(_ application: UIApplication) {
}
func applicationDidBecomeActive(application: UIApplication) {
func applicationDidBecomeActive(_ application: UIApplication) {
}
func applicationWillTerminate(application: UIApplication) {
func applicationWillTerminate(_ application: UIApplication) {
}
}
extension AppDelegate {
private func configureNavigationTabBar() {
fileprivate func configureNavigationTabBar() {
//transparent background
UINavigationBar.appearance().setBackgroundImage(UIImage(), forBarMetrics: .Default)
UINavigationBar.appearance().setBackgroundImage(UIImage(), for: .default)
UINavigationBar.appearance().shadowImage = UIImage()
UINavigationBar.appearance().translucent = true
UINavigationBar.appearance().isTranslucent = true
let shadow = NSShadow()
shadow.shadowOffset = CGSize(width: 0, height: 2)
shadow.shadowColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.1)
UINavigationBar.appearance().titleTextAttributes = [
NSForegroundColorAttributeName : UIColor.whiteColor(),
NSForegroundColorAttributeName : UIColor.white,
NSShadowAttributeName: shadow
]
}
@@ -1,5 +1,15 @@
{
"images" : [
{
"idiom" : "iphone",
"size" : "20x20",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "20x20",
"scale" : "3x"
},
{
"idiom" : "iphone",
"size" : "29x29",
@@ -1,9 +1,12 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="10117" systemVersion="15F34" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="L1n-Ia-Jrw">
<?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="L1n-Ia-Jrw">
<device id="retina4_7" orientation="portrait">
<adaptation id="fullscreen"/>
</device>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="10085"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="12088"/>
<capability name="Constraints to layout margins" minToolsVersion="6.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--Demo View Controller-->
@@ -15,20 +18,20 @@
<viewControllerLayoutGuide type="bottom" id="mRg-Mx-OVI"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="CO1-du-RsN">
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="BackgroundImage" translatesAutoresizingMaskIntoConstraints="NO" id="o88-Ae-QCA">
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
</imageView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="1/15" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Irl-Rb-fcB">
<rect key="frame" x="285" y="559" width="31" height="21"/>
<rect key="frame" x="172" y="626.5" width="31" height="20.5"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" red="0.85882352941176465" green="0.8666666666666667" blue="0.87058823529411766" alpha="1" colorSpace="calibratedRGB"/>
<color key="textColor" red="0.85882352941176465" green="0.8666666666666667" blue="0.87058823529411766" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstItem="mRg-Mx-OVI" firstAttribute="top" secondItem="Irl-Rb-fcB" secondAttribute="bottom" constant="20" id="2LM-iO-324"/>
<constraint firstItem="o88-Ae-QCA" firstAttribute="top" secondItem="CpK-wn-s3i" secondAttribute="bottom" constant="-44" id="MHx-PV-wBs"/>
@@ -42,18 +45,18 @@
<nil key="title"/>
<barButtonItem key="leftBarButtonItem" image="searchIcon" id="xuF-jX-6LN"/>
<view key="titleView" contentMode="scaleToFill" id="U0J-H7-fvX">
<rect key="frame" x="180" y="6" width="240" height="33"/>
<rect key="frame" x="67.5" y="5.5" width="240" height="33"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<subviews>
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="Title" translatesAutoresizingMaskIntoConstraints="NO" id="92b-RV-q6w">
<rect key="frame" x="95" y="9" width="51" height="16"/>
<rect key="frame" x="94.5" y="8.5" width="51" height="16"/>
<constraints>
<constraint firstAttribute="width" constant="51" id="E8y-UB-H4U"/>
<constraint firstAttribute="height" constant="16" id="FBz-Jg-2za"/>
</constraints>
</imageView>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.0" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstItem="92b-RV-q6w" firstAttribute="centerX" secondItem="U0J-H7-fvX" secondAttribute="centerX" id="kLZ-Jr-wTP"/>
<constraint firstItem="92b-RV-q6w" firstAttribute="centerY" secondItem="U0J-H7-fvX" secondAttribute="centerY" id="qaL-Bm-FyO"/>
@@ -71,6 +74,8 @@
</navigationItem>
<connections>
<outlet property="pageLabel" destination="Irl-Rb-fcB" id="oUZ-x9-PkD"/>
<outlet property="titleImageView" destination="92b-RV-q6w" id="3lS-Ot-c9A"/>
<outlet property="titleImageViewXConstraint" destination="kLZ-Jr-wTP" id="cFl-I4-nzg"/>
<segue destination="7RW-i0-HfN" kind="show" identifier="NoName" id="enc-PY-spo"/>
</connections>
</viewController>
@@ -102,21 +107,21 @@
<objects>
<tableViewController storyboardIdentifier="DemoTableViewController" automaticallyAdjustsScrollViewInsets="NO" id="7RW-i0-HfN" customClass="DemoTableViewController" customModule="DemoExpandingCollection" customModuleProvider="target" sceneMemberID="viewController">
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" dataMode="static" style="plain" separatorStyle="none" rowHeight="44" sectionHeaderHeight="28" sectionFooterHeight="28" id="2SU-lJ-2AP">
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<sections>
<tableViewSection id="IIl-eL-sK9">
<cells>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" reuseIdentifier="CustomTableViewCell" rowHeight="124" id="SFA-X2-Rbf">
<rect key="frame" x="0.0" y="0.0" width="600" height="124"/>
<rect key="frame" x="0.0" y="0.0" width="375" height="124"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="SFA-X2-Rbf" id="RQr-Ti-ps0">
<rect key="frame" x="0.0" y="0.0" width="600" height="124"/>
<rect key="frame" x="0.0" y="0.0" width="375" height="124"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="map" translatesAutoresizingMaskIntoConstraints="NO" id="MOR-g7-Roh">
<rect key="frame" x="0.0" y="0.0" width="600" height="124"/>
<rect key="frame" x="0.0" y="0.0" width="375" height="124"/>
</imageView>
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="stars" translatesAutoresizingMaskIntoConstraints="NO" id="u4E-kh-oBd">
<rect key="frame" x="40" y="92" width="77" height="12"/>
@@ -126,9 +131,9 @@
</constraints>
</imageView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="La Crescenta-Montrose, CA91020 Glendale
NO. 7911847" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Xh7-la-W1r">
<rect key="frame" x="40" y="48" width="552" height="27"/>
<rect key="frame" x="40" y="49" width="327" height="26.5"/>
<fontDescription key="fontDescription" type="system" pointSize="11"/>
<color key="textColor" red="0.49803921568627452" green="0.51764705882352935" blue="0.53725490196078429" alpha="1" colorSpace="calibratedRGB"/>
<color key="textColor" red="0.49803921568627452" green="0.51764705882352935" blue="0.53725490196078429" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
</subviews>
@@ -145,278 +150,375 @@
</constraints>
</tableViewCellContentView>
</tableViewCell>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" rowHeight="124" id="ew1-hI-ark">
<rect key="frame" x="0.0" y="124" width="600" height="124"/>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" rowHeight="130" id="il3-eE-Dz6">
<rect key="frame" x="0.0" y="124" width="375" height="130"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="ew1-hI-ark" id="tMC-aw-BE2">
<rect key="frame" x="0.0" y="0.0" width="600" height="124"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="il3-eE-Dz6" id="MsP-wf-fvb">
<rect key="frame" x="0.0" y="0.0" width="375" height="130"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="face2" translatesAutoresizingMaskIntoConstraints="NO" id="9zL-0u-FrF">
<rect key="frame" x="40" y="20" width="40" height="40"/>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" alignment="top" translatesAutoresizingMaskIntoConstraints="NO" id="uVu-gN-MRp">
<rect key="frame" x="40" y="15" width="295" height="100"/>
<subviews>
<stackView opaque="NO" contentMode="scaleToFill" alignment="center" spacing="10" translatesAutoresizingMaskIntoConstraints="NO" id="ukw-f4-MVo">
<rect key="frame" x="0.0" y="0.0" width="295" height="40"/>
<subviews>
<imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="face2" translatesAutoresizingMaskIntoConstraints="NO" id="uxT-p4-twy">
<rect key="frame" x="0.0" y="0.0" width="40" height="40"/>
<constraints>
<constraint firstAttribute="width" constant="40" id="MVQ-VZ-6fS"/>
<constraint firstAttribute="height" constant="40" id="Sd9-Ve-7wv"/>
</constraints>
</imageView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" verticalHuggingPriority="251" text="Peter Allan" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="HrH-RB-ew1">
<rect key="frame" x="50" y="11" width="168" height="18"/>
<fontDescription key="fontDescription" type="system" pointSize="15"/>
<color key="textColor" red="0.41960784309999999" green="0.41960784309999999" blue="0.41960784309999999" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="FEB 14th" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="lHC-gQ-gcP">
<rect key="frame" x="228" y="14" width="43" height="12"/>
<fontDescription key="fontDescription" type="system" pointSize="10"/>
<color key="textColor" red="0.76470588240000004" green="0.76470588240000004" blue="0.76470588240000004" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="heand" translatesAutoresizingMaskIntoConstraints="NO" id="A79-W0-b7f">
<rect key="frame" x="281" y="13.5" width="14" height="13"/>
</imageView>
</subviews>
</stackView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="3" baselineAdjustment="alignBaselines" minimumScaleFactor="0.80000000000000004" translatesAutoresizingMaskIntoConstraints="NO" id="cWC-7U-c6U">
<rect key="frame" x="0.0" y="40" width="284.5" height="60"/>
<constraints>
<constraint firstAttribute="height" constant="60" id="Aal-gs-pRU"/>
</constraints>
<string key="text">The federal beach atc requires states that receive funding to develop a risk-based beach evaluation and classification plan and apply it to</string>
<fontDescription key="fontDescription" type="system" pointSize="12"/>
<color key="textColor" red="0.4431372549" green="0.4431372549" blue="0.4431372549" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<constraints>
<constraint firstAttribute="width" constant="40" id="78B-o8-UlD"/>
<constraint firstAttribute="height" constant="40" id="b9d-Vi-STe"/>
<constraint firstAttribute="trailing" secondItem="ukw-f4-MVo" secondAttribute="trailing" id="LFh-OH-GCr"/>
<constraint firstItem="ukw-f4-MVo" firstAttribute="leading" secondItem="uVu-gN-MRp" secondAttribute="leading" id="SZN-hq-17r"/>
</constraints>
</imageView>
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="heand" translatesAutoresizingMaskIntoConstraints="NO" id="Nk4-8x-Lwg">
<rect key="frame" x="524" y="34" width="14" height="13"/>
</imageView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Peter Allan" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="KVC-Pp-S9H">
<rect key="frame" x="108" y="31" width="74" height="18"/>
<fontDescription key="fontDescription" type="system" pointSize="15"/>
<color key="textColor" red="0.41960784313725491" green="0.41960784313725491" blue="0.41960784313725491" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="FEB 14th" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="UAK-of-lpJ">
<rect key="frame" x="219" y="34" width="43" height="12"/>
<fontDescription key="fontDescription" type="system" pointSize="10"/>
<color key="textColor" red="0.76470588235294112" green="0.76470588235294112" blue="0.76470588235294112" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="3" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="2zo-A7-sbM">
<rect key="frame" x="40" y="57" width="498" height="59"/>
<constraints>
<constraint firstAttribute="height" constant="59" id="zel-Yy-v9k"/>
</constraints>
<string key="text">The federal beach atc requires states that receive funding to develop a risk-based beach evaluation and classification plan and apply it to</string>
<fontDescription key="fontDescription" type="system" pointSize="12"/>
<color key="textColor" red="0.44313725490196076" green="0.44313725490196076" blue="0.44313725490196076" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
</stackView>
</subviews>
<constraints>
<constraint firstItem="2zo-A7-sbM" firstAttribute="leading" secondItem="tMC-aw-BE2" secondAttribute="leading" constant="40" id="H38-Fq-dyr"/>
<constraint firstItem="UAK-of-lpJ" firstAttribute="centerY" secondItem="KVC-Pp-S9H" secondAttribute="centerY" id="LsD-yB-O6d"/>
<constraint firstItem="UAK-of-lpJ" firstAttribute="leading" secondItem="KVC-Pp-S9H" secondAttribute="trailing" constant="37" id="Q2S-o9-jqX"/>
<constraint firstAttribute="trailing" secondItem="Nk4-8x-Lwg" secondAttribute="trailing" constant="62" id="V8O-HD-kFA"/>
<constraint firstItem="Nk4-8x-Lwg" firstAttribute="centerY" secondItem="9zL-0u-FrF" secondAttribute="centerY" id="W5E-fE-j0w"/>
<constraint firstAttribute="trailing" secondItem="2zo-A7-sbM" secondAttribute="trailing" constant="62" id="Z9T-o6-3gf"/>
<constraint firstItem="KVC-Pp-S9H" firstAttribute="centerY" secondItem="9zL-0u-FrF" secondAttribute="centerY" id="brv-4K-N8t"/>
<constraint firstItem="KVC-Pp-S9H" firstAttribute="leading" secondItem="9zL-0u-FrF" secondAttribute="trailing" constant="28" id="i1I-Wl-eDa"/>
<constraint firstAttribute="bottomMargin" secondItem="2zo-A7-sbM" secondAttribute="bottom" id="i8F-BH-FCe"/>
<constraint firstItem="9zL-0u-FrF" firstAttribute="leading" secondItem="tMC-aw-BE2" secondAttribute="leading" constant="40" id="vVg-gG-k8j"/>
<constraint firstItem="9zL-0u-FrF" firstAttribute="top" secondItem="tMC-aw-BE2" secondAttribute="top" constant="20" id="w5h-fl-OmZ"/>
<constraint firstItem="uVu-gN-MRp" firstAttribute="top" secondItem="MsP-wf-fvb" secondAttribute="top" constant="15" id="NQl-Be-BKZ"/>
<constraint firstAttribute="bottom" secondItem="uVu-gN-MRp" secondAttribute="bottom" constant="15" id="jvP-x7-pnF"/>
<constraint firstAttribute="trailing" secondItem="uVu-gN-MRp" secondAttribute="trailing" constant="40" id="tiY-7g-NSN"/>
<constraint firstItem="uVu-gN-MRp" firstAttribute="leading" secondItem="MsP-wf-fvb" secondAttribute="leading" constant="40" id="yEt-zX-E7e"/>
</constraints>
</tableViewCellContentView>
</tableViewCell>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" rowHeight="124" id="0ee-7A-I2I">
<rect key="frame" x="0.0" y="248" width="600" height="124"/>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" rowHeight="130" id="72K-TN-0SK">
<rect key="frame" x="0.0" y="254" width="375" height="130"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="0ee-7A-I2I" id="jPx-eH-c2S">
<rect key="frame" x="0.0" y="0.0" width="600" height="124"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="72K-TN-0SK" id="Md6-Nq-ERc">
<rect key="frame" x="0.0" y="0.0" width="375" height="130"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="face1" translatesAutoresizingMaskIntoConstraints="NO" id="T8j-gX-HQZ">
<rect key="frame" x="40" y="20" width="40" height="40"/>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" alignment="top" translatesAutoresizingMaskIntoConstraints="NO" id="STK-Cw-1By">
<rect key="frame" x="40" y="15" width="295" height="100"/>
<subviews>
<stackView opaque="NO" contentMode="scaleToFill" alignment="center" spacing="10" translatesAutoresizingMaskIntoConstraints="NO" id="avn-wq-7Zt">
<rect key="frame" x="0.0" y="0.0" width="295" height="40"/>
<subviews>
<imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="face1" translatesAutoresizingMaskIntoConstraints="NO" id="fq4-to-wKp">
<rect key="frame" x="0.0" y="0.0" width="40" height="40"/>
<constraints>
<constraint firstAttribute="width" constant="40" id="G1F-5B-Qmz"/>
<constraint firstAttribute="height" constant="40" id="xIh-K6-n5R"/>
</constraints>
</imageView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" verticalHuggingPriority="251" text="Amada Iin" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="8rD-uo-vTf">
<rect key="frame" x="50" y="11" width="168" height="18"/>
<fontDescription key="fontDescription" type="system" pointSize="15"/>
<color key="textColor" red="0.41960784309999999" green="0.41960784309999999" blue="0.41960784309999999" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="FEB 14th" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="9wq-EN-tLL">
<rect key="frame" x="228" y="14" width="43" height="12"/>
<fontDescription key="fontDescription" type="system" pointSize="10"/>
<color key="textColor" red="0.76470588240000004" green="0.76470588240000004" blue="0.76470588240000004" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="heand" translatesAutoresizingMaskIntoConstraints="NO" id="CCB-2m-LDr">
<rect key="frame" x="281" y="13.5" width="14" height="13"/>
</imageView>
</subviews>
</stackView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="3" baselineAdjustment="alignBaselines" minimumScaleFactor="0.80000000000000004" translatesAutoresizingMaskIntoConstraints="NO" id="Rj6-os-v8s">
<rect key="frame" x="0.0" y="40" width="284.5" height="60"/>
<constraints>
<constraint firstAttribute="height" constant="60" id="X0h-Mf-l6D"/>
</constraints>
<string key="text">The federal beach atc requires states that receive funding to develop a risk-based beach evaluation and classification plan and apply it to</string>
<fontDescription key="fontDescription" type="system" pointSize="12"/>
<color key="textColor" red="0.4431372549" green="0.4431372549" blue="0.4431372549" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<constraints>
<constraint firstAttribute="height" constant="40" id="AKq-2T-BRC"/>
<constraint firstAttribute="width" constant="40" id="lAw-yT-R7T"/>
<constraint firstItem="avn-wq-7Zt" firstAttribute="leading" secondItem="STK-Cw-1By" secondAttribute="leading" id="JQi-MO-nNf"/>
<constraint firstAttribute="trailing" secondItem="avn-wq-7Zt" secondAttribute="trailing" id="O7i-6t-BF2"/>
</constraints>
</imageView>
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="heand" translatesAutoresizingMaskIntoConstraints="NO" id="szO-5V-CyH">
<rect key="frame" x="524" y="34" width="14" height="13"/>
</imageView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Amada Iin" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="UEu-Ap-Kms">
<rect key="frame" x="108" y="31" width="68" height="18"/>
<fontDescription key="fontDescription" type="system" pointSize="15"/>
<color key="textColor" red="0.41960784309999999" green="0.41960784309999999" blue="0.41960784309999999" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="FEB 14th" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="7hI-Qw-bUn">
<rect key="frame" x="213" y="34" width="43" height="12"/>
<fontDescription key="fontDescription" type="system" pointSize="10"/>
<color key="textColor" red="0.76470588240000004" green="0.76470588240000004" blue="0.76470588240000004" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="3" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="rkV-jC-tTs">
<rect key="frame" x="40" y="57" width="498" height="59"/>
<constraints>
<constraint firstAttribute="height" constant="59" id="pYw-qC-eUH"/>
</constraints>
<string key="text">The federal beach atc requires states that receive funding to develop a risk-based beach evaluation and classification plan and apply it to</string>
<fontDescription key="fontDescription" type="system" pointSize="12"/>
<color key="textColor" red="0.4431372549" green="0.4431372549" blue="0.4431372549" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
</stackView>
</subviews>
<constraints>
<constraint firstItem="UEu-Ap-Kms" firstAttribute="centerY" secondItem="T8j-gX-HQZ" secondAttribute="centerY" id="0ar-MM-JhP"/>
<constraint firstAttribute="trailing" secondItem="szO-5V-CyH" secondAttribute="trailing" constant="62" id="I1Z-x4-mXH"/>
<constraint firstItem="7hI-Qw-bUn" firstAttribute="leading" secondItem="UEu-Ap-Kms" secondAttribute="trailing" constant="37" id="JWw-Z3-bSW"/>
<constraint firstItem="7hI-Qw-bUn" firstAttribute="centerY" secondItem="UEu-Ap-Kms" secondAttribute="centerY" id="KR6-QV-sS2"/>
<constraint firstItem="szO-5V-CyH" firstAttribute="centerY" secondItem="T8j-gX-HQZ" secondAttribute="centerY" id="UVU-13-4LE"/>
<constraint firstItem="rkV-jC-tTs" firstAttribute="leading" secondItem="jPx-eH-c2S" secondAttribute="leading" constant="40" id="cf4-Ue-Xs2"/>
<constraint firstItem="UEu-Ap-Kms" firstAttribute="leading" secondItem="T8j-gX-HQZ" secondAttribute="trailing" constant="28" id="fhv-QP-9Wc"/>
<constraint firstAttribute="trailing" secondItem="rkV-jC-tTs" secondAttribute="trailing" constant="62" id="kZt-vH-S8D"/>
<constraint firstItem="T8j-gX-HQZ" firstAttribute="leading" secondItem="jPx-eH-c2S" secondAttribute="leading" constant="40" id="v3e-He-0Sh"/>
<constraint firstItem="T8j-gX-HQZ" firstAttribute="top" secondItem="jPx-eH-c2S" secondAttribute="top" constant="20" id="v85-ak-nGz"/>
<constraint firstAttribute="bottomMargin" secondItem="rkV-jC-tTs" secondAttribute="bottom" id="wJM-Lw-H9T"/>
<constraint firstItem="STK-Cw-1By" firstAttribute="top" secondItem="Md6-Nq-ERc" secondAttribute="top" constant="15" id="OiO-xC-QYX"/>
<constraint firstAttribute="trailing" secondItem="STK-Cw-1By" secondAttribute="trailing" constant="40" id="T5c-DM-4CG"/>
<constraint firstItem="STK-Cw-1By" firstAttribute="leading" secondItem="Md6-Nq-ERc" secondAttribute="leading" constant="40" id="bFM-Xr-TcA"/>
<constraint firstAttribute="bottom" secondItem="STK-Cw-1By" secondAttribute="bottom" constant="15" id="xiT-eh-j7e"/>
</constraints>
</tableViewCellContentView>
</tableViewCell>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" rowHeight="124" id="fTH-KP-Ac5">
<rect key="frame" x="0.0" y="372" width="600" height="124"/>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" rowHeight="130" id="Tdr-Sn-B0H">
<rect key="frame" x="0.0" y="384" width="375" height="130"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="fTH-KP-Ac5" id="BGd-Mp-TnE">
<rect key="frame" x="0.0" y="0.0" width="600" height="124"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="Tdr-Sn-B0H" id="GLn-XG-K05">
<rect key="frame" x="0.0" y="0.0" width="375" height="130"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="face2" translatesAutoresizingMaskIntoConstraints="NO" id="l6O-iU-Deh">
<rect key="frame" x="40" y="20" width="40" height="40"/>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" alignment="top" translatesAutoresizingMaskIntoConstraints="NO" id="DDu-ZJ-lER">
<rect key="frame" x="40" y="15" width="295" height="100"/>
<subviews>
<stackView opaque="NO" contentMode="scaleToFill" alignment="center" spacing="10" translatesAutoresizingMaskIntoConstraints="NO" id="27f-K8-QUC">
<rect key="frame" x="0.0" y="0.0" width="295" height="40"/>
<subviews>
<imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="face2" translatesAutoresizingMaskIntoConstraints="NO" id="4yu-jC-UXz">
<rect key="frame" x="0.0" y="0.0" width="40" height="40"/>
<constraints>
<constraint firstAttribute="height" constant="40" id="heF-QW-z6Q"/>
<constraint firstAttribute="width" constant="40" id="tiZ-lo-ugS"/>
</constraints>
</imageView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" verticalHuggingPriority="251" text="Peter Allan" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Nsm-QZ-YcV">
<rect key="frame" x="50" y="11" width="168" height="18"/>
<fontDescription key="fontDescription" type="system" pointSize="15"/>
<color key="textColor" red="0.41960784309999999" green="0.41960784309999999" blue="0.41960784309999999" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="FEB 14th" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="d6Y-da-Srh">
<rect key="frame" x="228" y="14" width="43" height="12"/>
<fontDescription key="fontDescription" type="system" pointSize="10"/>
<color key="textColor" red="0.76470588240000004" green="0.76470588240000004" blue="0.76470588240000004" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="heand" translatesAutoresizingMaskIntoConstraints="NO" id="LNB-9D-Kgq">
<rect key="frame" x="281" y="13.5" width="14" height="13"/>
</imageView>
</subviews>
</stackView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="3" baselineAdjustment="alignBaselines" minimumScaleFactor="0.80000000000000004" translatesAutoresizingMaskIntoConstraints="NO" id="guA-2J-wB7">
<rect key="frame" x="0.0" y="40" width="284.5" height="60"/>
<constraints>
<constraint firstAttribute="height" constant="60" id="eVB-K1-R8b"/>
</constraints>
<string key="text">The federal beach atc requires states that receive funding to develop a risk-based beach evaluation and classification plan and apply it to</string>
<fontDescription key="fontDescription" type="system" pointSize="12"/>
<color key="textColor" red="0.4431372549" green="0.4431372549" blue="0.4431372549" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<constraints>
<constraint firstAttribute="height" constant="40" id="Wvu-NC-dmu"/>
<constraint firstAttribute="width" constant="40" id="goR-UO-N7g"/>
<constraint firstAttribute="trailing" secondItem="27f-K8-QUC" secondAttribute="trailing" id="CJy-xz-6Zt"/>
<constraint firstItem="27f-K8-QUC" firstAttribute="leading" secondItem="DDu-ZJ-lER" secondAttribute="leading" id="JyM-0i-VoB"/>
</constraints>
</imageView>
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="heand" translatesAutoresizingMaskIntoConstraints="NO" id="ceS-Mg-PrP">
<rect key="frame" x="524" y="34" width="14" height="13"/>
</imageView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Peter Allan" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="a3U-of-sdv">
<rect key="frame" x="108" y="31" width="74" height="18"/>
<fontDescription key="fontDescription" type="system" pointSize="15"/>
<color key="textColor" red="0.41960784309999999" green="0.41960784309999999" blue="0.41960784309999999" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="FEB 14th" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="h3x-N2-MWJ">
<rect key="frame" x="219" y="34" width="43" height="12"/>
<fontDescription key="fontDescription" type="system" pointSize="10"/>
<color key="textColor" red="0.76470588240000004" green="0.76470588240000004" blue="0.76470588240000004" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="3" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="3ZN-4l-hGa">
<rect key="frame" x="40" y="57" width="498" height="59"/>
<constraints>
<constraint firstAttribute="height" constant="59" id="z9M-6w-uYi"/>
</constraints>
<string key="text">The federal beach atc requires states that receive funding to develop a risk-based beach evaluation and classification plan and apply it to</string>
<fontDescription key="fontDescription" type="system" pointSize="12"/>
<color key="textColor" red="0.4431372549" green="0.4431372549" blue="0.4431372549" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
</stackView>
</subviews>
<constraints>
<constraint firstItem="h3x-N2-MWJ" firstAttribute="centerY" secondItem="a3U-of-sdv" secondAttribute="centerY" id="879-Lf-sHE"/>
<constraint firstItem="l6O-iU-Deh" firstAttribute="top" secondItem="BGd-Mp-TnE" secondAttribute="top" constant="20" id="C4W-pg-781"/>
<constraint firstAttribute="bottomMargin" secondItem="3ZN-4l-hGa" secondAttribute="bottom" id="KIV-vm-vEj"/>
<constraint firstItem="a3U-of-sdv" firstAttribute="centerY" secondItem="l6O-iU-Deh" secondAttribute="centerY" id="N7q-ub-LKa"/>
<constraint firstAttribute="trailing" secondItem="ceS-Mg-PrP" secondAttribute="trailing" constant="62" id="Sfq-JU-4Nm"/>
<constraint firstItem="l6O-iU-Deh" firstAttribute="leading" secondItem="BGd-Mp-TnE" secondAttribute="leading" constant="40" id="VMR-N1-Xjl"/>
<constraint firstItem="ceS-Mg-PrP" firstAttribute="centerY" secondItem="l6O-iU-Deh" secondAttribute="centerY" id="fdg-23-M6H"/>
<constraint firstAttribute="trailing" secondItem="3ZN-4l-hGa" secondAttribute="trailing" constant="62" id="hmQ-iS-d5t"/>
<constraint firstItem="a3U-of-sdv" firstAttribute="leading" secondItem="l6O-iU-Deh" secondAttribute="trailing" constant="28" id="o1q-GY-Lns"/>
<constraint firstItem="3ZN-4l-hGa" firstAttribute="leading" secondItem="BGd-Mp-TnE" secondAttribute="leading" constant="40" id="oCn-vE-6YT"/>
<constraint firstItem="h3x-N2-MWJ" firstAttribute="leading" secondItem="a3U-of-sdv" secondAttribute="trailing" constant="37" id="wku-gF-N0I"/>
<constraint firstItem="DDu-ZJ-lER" firstAttribute="top" secondItem="GLn-XG-K05" secondAttribute="top" constant="15" id="l1S-IL-jMj"/>
<constraint firstAttribute="bottom" secondItem="DDu-ZJ-lER" secondAttribute="bottom" constant="15" id="mWj-0T-I4l"/>
<constraint firstItem="DDu-ZJ-lER" firstAttribute="leading" secondItem="GLn-XG-K05" secondAttribute="leading" constant="40" id="pvZ-k7-1w4"/>
<constraint firstAttribute="trailing" secondItem="DDu-ZJ-lER" secondAttribute="trailing" constant="40" id="wdR-TG-u4d"/>
</constraints>
</tableViewCellContentView>
</tableViewCell>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" rowHeight="124" id="irZ-0L-X9r">
<rect key="frame" x="0.0" y="496" width="600" height="124"/>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" rowHeight="130" id="DKC-ay-0W5">
<rect key="frame" x="0.0" y="514" width="375" height="130"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="irZ-0L-X9r" id="t3x-Eb-ktg">
<rect key="frame" x="0.0" y="0.0" width="600" height="124"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="DKC-ay-0W5" id="OvL-k3-UIL">
<rect key="frame" x="0.0" y="0.0" width="375" height="130"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="face1" translatesAutoresizingMaskIntoConstraints="NO" id="SY0-ki-F5U">
<rect key="frame" x="40" y="20" width="40" height="40"/>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" alignment="top" translatesAutoresizingMaskIntoConstraints="NO" id="STI-xc-qal">
<rect key="frame" x="40" y="15" width="295" height="100"/>
<subviews>
<stackView opaque="NO" contentMode="scaleToFill" alignment="center" spacing="10" translatesAutoresizingMaskIntoConstraints="NO" id="YWJ-Pq-HUf">
<rect key="frame" x="0.0" y="0.0" width="295" height="40"/>
<subviews>
<imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="face1" translatesAutoresizingMaskIntoConstraints="NO" id="Uz6-PY-MeW">
<rect key="frame" x="0.0" y="0.0" width="40" height="40"/>
<constraints>
<constraint firstAttribute="height" constant="40" id="avr-xK-V22"/>
<constraint firstAttribute="width" constant="40" id="dgi-bt-ecS"/>
</constraints>
</imageView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" verticalHuggingPriority="251" text="Amada Iin" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="7OF-et-epa">
<rect key="frame" x="50" y="11" width="168" height="18"/>
<fontDescription key="fontDescription" type="system" pointSize="15"/>
<color key="textColor" red="0.41960784309999999" green="0.41960784309999999" blue="0.41960784309999999" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="FEB 14th" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="xP4-cS-081">
<rect key="frame" x="228" y="14" width="43" height="12"/>
<fontDescription key="fontDescription" type="system" pointSize="10"/>
<color key="textColor" red="0.76470588240000004" green="0.76470588240000004" blue="0.76470588240000004" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="heand" translatesAutoresizingMaskIntoConstraints="NO" id="C86-X3-gRu">
<rect key="frame" x="281" y="13.5" width="14" height="13"/>
</imageView>
</subviews>
</stackView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="3" baselineAdjustment="alignBaselines" minimumScaleFactor="0.80000000000000004" translatesAutoresizingMaskIntoConstraints="NO" id="v80-2F-1zn">
<rect key="frame" x="0.0" y="40" width="284.5" height="60"/>
<constraints>
<constraint firstAttribute="height" constant="60" id="nvf-wL-GDB"/>
</constraints>
<string key="text">The federal beach atc requires states that receive funding to develop a risk-based beach evaluation and classification plan and apply it to</string>
<fontDescription key="fontDescription" type="system" pointSize="12"/>
<color key="textColor" red="0.4431372549" green="0.4431372549" blue="0.4431372549" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<constraints>
<constraint firstAttribute="width" constant="40" id="1XW-AC-9LK"/>
<constraint firstAttribute="height" constant="40" id="jDR-B8-a7U"/>
<constraint firstAttribute="trailing" secondItem="YWJ-Pq-HUf" secondAttribute="trailing" id="5ym-ch-XVe"/>
<constraint firstItem="YWJ-Pq-HUf" firstAttribute="leading" secondItem="STI-xc-qal" secondAttribute="leading" id="mJk-x2-SxR"/>
</constraints>
</imageView>
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="heand" translatesAutoresizingMaskIntoConstraints="NO" id="g7r-dJ-em9">
<rect key="frame" x="524" y="34" width="14" height="13"/>
</imageView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Amada Iin" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="0sx-fO-Xiy">
<rect key="frame" x="108" y="31" width="68" height="18"/>
<fontDescription key="fontDescription" type="system" pointSize="15"/>
<color key="textColor" red="0.41960784309999999" green="0.41960784309999999" blue="0.41960784309999999" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="FEB 14th" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="SVA-lD-IQs">
<rect key="frame" x="213" y="34" width="43" height="12"/>
<fontDescription key="fontDescription" type="system" pointSize="10"/>
<color key="textColor" red="0.76470588240000004" green="0.76470588240000004" blue="0.76470588240000004" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="3" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="kYn-LQ-ReD">
<rect key="frame" x="40" y="57" width="498" height="59"/>
<constraints>
<constraint firstAttribute="height" constant="59" id="sMt-dP-LYh"/>
</constraints>
<string key="text">The federal beach atc requires states that receive funding to develop a risk-based beach evaluation and classification plan and apply it to</string>
<fontDescription key="fontDescription" type="system" pointSize="12"/>
<color key="textColor" red="0.4431372549" green="0.4431372549" blue="0.4431372549" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
</stackView>
</subviews>
<constraints>
<constraint firstItem="SVA-lD-IQs" firstAttribute="centerY" secondItem="0sx-fO-Xiy" secondAttribute="centerY" id="2jW-fL-D7T"/>
<constraint firstAttribute="trailing" secondItem="g7r-dJ-em9" secondAttribute="trailing" constant="62" id="ChQ-bB-Cik"/>
<constraint firstItem="0sx-fO-Xiy" firstAttribute="centerY" secondItem="SY0-ki-F5U" secondAttribute="centerY" id="Faj-Bw-0Tu"/>
<constraint firstItem="kYn-LQ-ReD" firstAttribute="leading" secondItem="t3x-Eb-ktg" secondAttribute="leading" constant="40" id="HLb-38-S1u"/>
<constraint firstAttribute="trailing" secondItem="kYn-LQ-ReD" secondAttribute="trailing" constant="62" id="HzA-Nb-vXy"/>
<constraint firstItem="g7r-dJ-em9" firstAttribute="centerY" secondItem="SY0-ki-F5U" secondAttribute="centerY" id="KEY-Pc-yZs"/>
<constraint firstItem="SY0-ki-F5U" firstAttribute="leading" secondItem="t3x-Eb-ktg" secondAttribute="leading" constant="40" id="NZg-9p-Sb1"/>
<constraint firstItem="0sx-fO-Xiy" firstAttribute="leading" secondItem="SY0-ki-F5U" secondAttribute="trailing" constant="28" id="Xe5-9G-9vl"/>
<constraint firstItem="SY0-ki-F5U" firstAttribute="top" secondItem="t3x-Eb-ktg" secondAttribute="top" constant="20" id="YyV-BS-5UD"/>
<constraint firstAttribute="bottomMargin" secondItem="kYn-LQ-ReD" secondAttribute="bottom" id="oHX-7c-bG2"/>
<constraint firstItem="SVA-lD-IQs" firstAttribute="leading" secondItem="0sx-fO-Xiy" secondAttribute="trailing" constant="37" id="xkH-1T-7dm"/>
<constraint firstItem="STI-xc-qal" firstAttribute="top" secondItem="OvL-k3-UIL" secondAttribute="top" constant="15" id="1Wt-eA-mfs"/>
<constraint firstAttribute="bottom" secondItem="STI-xc-qal" secondAttribute="bottom" constant="15" id="Gcc-F3-tlL"/>
<constraint firstAttribute="trailing" secondItem="STI-xc-qal" secondAttribute="trailing" constant="40" id="leW-dt-mEv"/>
<constraint firstItem="STI-xc-qal" firstAttribute="leading" secondItem="OvL-k3-UIL" secondAttribute="leading" constant="40" id="mhF-9Y-V2L"/>
</constraints>
</tableViewCellContentView>
</tableViewCell>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" rowHeight="124" id="Fj4-n4-S6M">
<rect key="frame" x="0.0" y="620" width="600" height="124"/>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" rowHeight="130" id="Bem-uK-CGC">
<rect key="frame" x="0.0" y="644" width="375" height="130"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="Fj4-n4-S6M" id="D8J-AG-YUN">
<rect key="frame" x="0.0" y="0.0" width="600" height="124"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="Bem-uK-CGC" id="wC3-Hh-anO">
<rect key="frame" x="0.0" y="0.0" width="375" height="130"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="face2" translatesAutoresizingMaskIntoConstraints="NO" id="dRk-IE-zXs">
<rect key="frame" x="40" y="20" width="40" height="40"/>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" alignment="top" translatesAutoresizingMaskIntoConstraints="NO" id="tMM-s3-OKo">
<rect key="frame" x="40" y="15" width="295" height="100"/>
<subviews>
<stackView opaque="NO" contentMode="scaleToFill" alignment="center" spacing="10" translatesAutoresizingMaskIntoConstraints="NO" id="TFL-At-uyI">
<rect key="frame" x="0.0" y="0.0" width="295" height="40"/>
<subviews>
<imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="face2" translatesAutoresizingMaskIntoConstraints="NO" id="QOG-Ub-YqG">
<rect key="frame" x="0.0" y="0.0" width="40" height="40"/>
<constraints>
<constraint firstAttribute="height" constant="40" id="7lU-qa-EHL"/>
<constraint firstAttribute="width" constant="40" id="XYT-JZ-AY1"/>
</constraints>
</imageView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" verticalHuggingPriority="251" text="Peter Allan" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ReU-Mu-iaN">
<rect key="frame" x="50" y="11" width="168" height="18"/>
<fontDescription key="fontDescription" type="system" pointSize="15"/>
<color key="textColor" red="0.41960784309999999" green="0.41960784309999999" blue="0.41960784309999999" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="FEB 14th" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="zzn-X1-aOV">
<rect key="frame" x="228" y="14" width="43" height="12"/>
<fontDescription key="fontDescription" type="system" pointSize="10"/>
<color key="textColor" red="0.76470588240000004" green="0.76470588240000004" blue="0.76470588240000004" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="heand" translatesAutoresizingMaskIntoConstraints="NO" id="PsA-nw-Zed">
<rect key="frame" x="281" y="13.5" width="14" height="13"/>
</imageView>
</subviews>
</stackView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="3" baselineAdjustment="alignBaselines" minimumScaleFactor="0.80000000000000004" translatesAutoresizingMaskIntoConstraints="NO" id="qtA-cn-iTh">
<rect key="frame" x="0.0" y="40" width="284.5" height="60"/>
<constraints>
<constraint firstAttribute="height" constant="60" id="d7O-23-tUP"/>
</constraints>
<string key="text">The federal beach atc requires states that receive funding to develop a risk-based beach evaluation and classification plan and apply it to</string>
<fontDescription key="fontDescription" type="system" pointSize="12"/>
<color key="textColor" red="0.4431372549" green="0.4431372549" blue="0.4431372549" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<constraints>
<constraint firstAttribute="height" constant="40" id="KNl-fy-6Ga"/>
<constraint firstAttribute="width" constant="40" id="hN8-5E-akX"/>
<constraint firstItem="TFL-At-uyI" firstAttribute="leading" secondItem="tMM-s3-OKo" secondAttribute="leading" id="5AL-z3-8xe"/>
<constraint firstAttribute="trailing" secondItem="TFL-At-uyI" secondAttribute="trailing" id="Wab-Pf-VgL"/>
</constraints>
</imageView>
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="heand" translatesAutoresizingMaskIntoConstraints="NO" id="hz8-Cp-lQj">
<rect key="frame" x="524" y="34" width="14" height="13"/>
</imageView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Peter Allan" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="YjL-xf-PcV">
<rect key="frame" x="108" y="31" width="74" height="18"/>
<fontDescription key="fontDescription" type="system" pointSize="15"/>
<color key="textColor" red="0.41960784309999999" green="0.41960784309999999" blue="0.41960784309999999" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="FEB 14th" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="J4t-pX-zbM">
<rect key="frame" x="219" y="34" width="43" height="12"/>
<fontDescription key="fontDescription" type="system" pointSize="10"/>
<color key="textColor" red="0.76470588240000004" green="0.76470588240000004" blue="0.76470588240000004" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="3" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Q6w-vY-gMp">
<rect key="frame" x="40" y="57" width="498" height="59"/>
<constraints>
<constraint firstAttribute="height" constant="59" id="T4M-G7-7hc"/>
</constraints>
<string key="text">The federal beach atc requires states that receive funding to develop a risk-based beach evaluation and classification plan and apply it to</string>
<fontDescription key="fontDescription" type="system" pointSize="12"/>
<color key="textColor" red="0.4431372549" green="0.4431372549" blue="0.4431372549" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
</stackView>
</subviews>
<constraints>
<constraint firstItem="Q6w-vY-gMp" firstAttribute="leading" secondItem="D8J-AG-YUN" secondAttribute="leading" constant="40" id="1ka-fN-GDR"/>
<constraint firstItem="dRk-IE-zXs" firstAttribute="leading" secondItem="D8J-AG-YUN" secondAttribute="leading" constant="40" id="7Oe-Rd-NXO"/>
<constraint firstItem="hz8-Cp-lQj" firstAttribute="centerY" secondItem="dRk-IE-zXs" secondAttribute="centerY" id="C2R-V0-FlH"/>
<constraint firstItem="J4t-pX-zbM" firstAttribute="leading" secondItem="YjL-xf-PcV" secondAttribute="trailing" constant="37" id="DG5-6g-aw8"/>
<constraint firstItem="dRk-IE-zXs" firstAttribute="top" secondItem="D8J-AG-YUN" secondAttribute="top" constant="20" id="FvH-zN-qew"/>
<constraint firstItem="J4t-pX-zbM" firstAttribute="centerY" secondItem="YjL-xf-PcV" secondAttribute="centerY" id="JiC-Tf-VdR"/>
<constraint firstAttribute="trailing" secondItem="hz8-Cp-lQj" secondAttribute="trailing" constant="62" id="LWy-zf-18F"/>
<constraint firstItem="YjL-xf-PcV" firstAttribute="leading" secondItem="dRk-IE-zXs" secondAttribute="trailing" constant="28" id="PDn-rh-K7o"/>
<constraint firstAttribute="trailing" secondItem="Q6w-vY-gMp" secondAttribute="trailing" constant="62" id="X6j-C7-AtW"/>
<constraint firstItem="YjL-xf-PcV" firstAttribute="centerY" secondItem="dRk-IE-zXs" secondAttribute="centerY" id="jkE-J3-oHA"/>
<constraint firstAttribute="bottomMargin" secondItem="Q6w-vY-gMp" secondAttribute="bottom" id="nTe-QJ-NrE"/>
<constraint firstAttribute="trailing" secondItem="tMM-s3-OKo" secondAttribute="trailing" constant="40" id="0OQ-7D-Xjo"/>
<constraint firstItem="tMM-s3-OKo" firstAttribute="top" secondItem="wC3-Hh-anO" secondAttribute="top" constant="15" id="Aqq-GD-5qX"/>
<constraint firstItem="tMM-s3-OKo" firstAttribute="leading" secondItem="wC3-Hh-anO" secondAttribute="leading" constant="40" id="Lz1-G1-EfS"/>
<constraint firstAttribute="bottom" secondItem="tMM-s3-OKo" secondAttribute="bottom" constant="15" id="g3Y-GA-ZAk"/>
</constraints>
</tableViewCellContentView>
</tableViewCell>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" rowHeight="130" id="3rA-ws-KnH">
<rect key="frame" x="0.0" y="774" width="375" height="130"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="3rA-ws-KnH" id="vNS-El-lEA">
<rect key="frame" x="0.0" y="0.0" width="375" height="130"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" alignment="top" translatesAutoresizingMaskIntoConstraints="NO" id="dHy-no-3dG">
<rect key="frame" x="40" y="15" width="295" height="100"/>
<subviews>
<stackView opaque="NO" contentMode="scaleToFill" alignment="center" spacing="10" translatesAutoresizingMaskIntoConstraints="NO" id="qg6-9G-buN">
<rect key="frame" x="0.0" y="0.0" width="295" height="40"/>
<subviews>
<imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="face1" translatesAutoresizingMaskIntoConstraints="NO" id="d7e-fT-v2a">
<rect key="frame" x="0.0" y="0.0" width="40" height="40"/>
<constraints>
<constraint firstAttribute="height" constant="40" id="6Ky-QD-1rh"/>
<constraint firstAttribute="width" constant="40" id="R3O-gp-WGo"/>
</constraints>
</imageView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" verticalHuggingPriority="251" text="Amada Iin" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="dsG-zh-ZDw">
<rect key="frame" x="50" y="11" width="168" height="18"/>
<fontDescription key="fontDescription" type="system" pointSize="15"/>
<color key="textColor" red="0.41960784309999999" green="0.41960784309999999" blue="0.41960784309999999" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="FEB 14th" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="37E-Ih-nze">
<rect key="frame" x="228" y="14" width="43" height="12"/>
<fontDescription key="fontDescription" type="system" pointSize="10"/>
<color key="textColor" red="0.76470588240000004" green="0.76470588240000004" blue="0.76470588240000004" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="heand" translatesAutoresizingMaskIntoConstraints="NO" id="I3D-43-QUr">
<rect key="frame" x="281" y="13.5" width="14" height="13"/>
</imageView>
</subviews>
</stackView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="3" baselineAdjustment="alignBaselines" minimumScaleFactor="0.80000000000000004" translatesAutoresizingMaskIntoConstraints="NO" id="uhH-HH-oP4">
<rect key="frame" x="0.0" y="40" width="284.5" height="60"/>
<constraints>
<constraint firstAttribute="height" constant="60" id="kTR-Ho-zi0"/>
</constraints>
<string key="text">The federal beach atc requires states that receive funding to develop a risk-based beach evaluation and classification plan and apply it to</string>
<fontDescription key="fontDescription" type="system" pointSize="12"/>
<color key="textColor" red="0.4431372549" green="0.4431372549" blue="0.4431372549" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<constraints>
<constraint firstAttribute="trailing" secondItem="qg6-9G-buN" secondAttribute="trailing" id="Pjy-os-XZx"/>
<constraint firstItem="qg6-9G-buN" firstAttribute="leading" secondItem="dHy-no-3dG" secondAttribute="leading" id="lZi-8T-Hep"/>
</constraints>
</stackView>
</subviews>
<constraints>
<constraint firstItem="dHy-no-3dG" firstAttribute="leading" secondItem="vNS-El-lEA" secondAttribute="leading" constant="40" id="1Pl-pq-EEl"/>
<constraint firstAttribute="trailing" secondItem="dHy-no-3dG" secondAttribute="trailing" constant="40" id="K29-x8-3Dt"/>
<constraint firstAttribute="bottom" secondItem="dHy-no-3dG" secondAttribute="bottom" constant="15" id="nC7-OP-5iZ"/>
<constraint firstItem="dHy-no-3dG" firstAttribute="top" secondItem="vNS-El-lEA" secondAttribute="top" constant="15" id="w4v-Gg-Zqa"/>
</constraints>
</tableViewCellContentView>
</tableViewCell>
@@ -428,22 +530,23 @@
<outlet property="delegate" destination="7RW-i0-HfN" id="28D-Ct-5A9"/>
</connections>
</tableView>
<toolbarItems/>
<navigationItem key="navigationItem" id="9zG-W9-jGP">
<nil key="title"/>
<barButtonItem key="leftBarButtonItem" image="searchIcon" id="sSw-AG-wrF"/>
<view key="titleView" contentMode="scaleToFill" id="qyb-Fh-aIr" userLabel="Item View">
<rect key="frame" x="180" y="6" width="240" height="33"/>
<rect key="frame" x="67.5" y="5.5" width="240" height="33"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<subviews>
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="Title" translatesAutoresizingMaskIntoConstraints="NO" id="a24-t2-9jd">
<rect key="frame" x="95" y="9" width="51" height="16"/>
<rect key="frame" x="94.5" y="8.5" width="51" height="16"/>
<constraints>
<constraint firstAttribute="height" constant="16" id="5Zr-Wx-iQB"/>
<constraint firstAttribute="width" constant="51" id="RtX-4m-x9W"/>
</constraints>
</imageView>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.0" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstItem="a24-t2-9jd" firstAttribute="centerX" secondItem="qyb-Fh-aIr" secondAttribute="centerX" id="sdW-OO-2BS"/>
<constraint firstItem="a24-t2-9jd" firstAttribute="centerY" secondItem="qyb-Fh-aIr" secondAttribute="centerY" id="xKF-DL-knz"/>
@@ -455,6 +558,11 @@
</connections>
</barButtonItem>
</navigationItem>
<simulatedToolbarMetrics key="simulatedBottomBarMetrics"/>
<connections>
<outlet property="titleImageView" destination="a24-t2-9jd" id="dZR-2A-N8b"/>
<outlet property="titleImageViewXConstraint" destination="sdW-OO-2BS" id="huK-Bc-7RX"/>
</connections>
</tableViewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="koT-TQ-RUs" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
@@ -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 {}
@@ -10,8 +10,8 @@ import UIKit
extension UICollectionView {
func getReusableCellWithIdentifier<T: UICollectionViewCell where T: CollectionViewCellIdentifiable>(indexPath: NSIndexPath) -> T {
guard let cell = dequeueReusableCellWithReuseIdentifier(T.cellIdentifier, forIndexPath: indexPath) as? T else {
func getReusableCellWithIdentifier<T: UICollectionViewCell>(_ indexPath: IndexPath) -> T where T: CollectionViewCellIdentifiable {
guard let cell = dequeueReusableCell(withReuseIdentifier: T.cellIdentifier, for: indexPath) as? T else {
fatalError("Couldn't instantiate view controller with identifier \(T.cellIdentifier) ")
}
@@ -27,7 +27,7 @@ protocol CollectionViewCellIdentifiable {
extension CollectionViewCellIdentifiable where Self: UICollectionViewCell {
static var cellIdentifier: String {
return String(self)
return String(describing: self)
}
}
@@ -14,16 +14,16 @@ extension UIStoryboard {
case Main
}
convenience init(storyboard: Storyboard, bundle: NSBundle? = nil) {
convenience init(storyboard: Storyboard, bundle: Bundle? = nil) {
self.init(name: storyboard.rawValue, bundle: bundle)
}
class func storyboard(storyboard: Storyboard, bundle: NSBundle? = nil) -> UIStoryboard {
class func storyboard(_ storyboard: Storyboard, bundle: Bundle? = nil) -> UIStoryboard {
return UIStoryboard(name: storyboard.rawValue, bundle: bundle)
}
func instantiateViewController<T: UIViewController where T: StoryboardIdentifiable>() -> T {
guard let viewController = instantiateViewControllerWithIdentifier(T.storyboardIdentifier) as? T else {
func instantiateViewController<T: UIViewController>() -> T where T: StoryboardIdentifiable {
guard let viewController = self.instantiateViewController(withIdentifier: T.storyboardIdentifier) as? T else {
fatalError("Couldn't instantiate view controller with identifier \(T.storyboardIdentifier) ")
}
@@ -41,6 +41,6 @@ protocol StoryboardIdentifiable {
extension StoryboardIdentifiable where Self: UIViewController {
static var storyboardIdentifier: String {
return String(self)
return String(describing: self)
}
}
@@ -10,29 +10,46 @@ import UIKit
class DemoTableViewController: ExpandingTableViewController {
private var scrollOffsetY: CGFloat = 0
fileprivate var scrollOffsetY: CGFloat = 0
override func viewDidLoad() {
super.viewDidLoad()
configureNavBar()
let image1 = UIImage.Asset.BackgroundImage.image
let image1 = Asset.backgroundImage.image
tableView.backgroundView = UIImageView(image: image1)
}
@IBOutlet weak var titleImageView: UIImageView!
@IBOutlet weak var titleImageViewXConstraint: NSLayoutConstraint!
}
// MARK: Helpers
// MARK: - Lifecycle
extension DemoTableViewController {
private func configureNavBar() {
navigationItem.leftBarButtonItem?.image = navigationItem.leftBarButtonItem?.image!.imageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal)
navigationItem.rightBarButtonItem?.image = navigationItem.rightBarButtonItem?.image!.imageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal)
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
guard let titleView = navigationItem.titleView else { return }
let center = UIScreen.main.bounds.midX
let diff = center - titleView.frame.midX
titleImageViewXConstraint.constant = diff
}
}
// MARK: Helpers
extension DemoTableViewController {
fileprivate func configureNavBar() {
navigationItem.leftBarButtonItem?.image = navigationItem.leftBarButtonItem?.image!.withRenderingMode(UIImageRenderingMode.alwaysOriginal)
navigationItem.rightBarButtonItem?.image = navigationItem.rightBarButtonItem?.image!.withRenderingMode(UIImageRenderingMode.alwaysOriginal)
}
}
// MARK: Actions
extension DemoTableViewController {
@IBAction func backButtonHandler(sender: AnyObject) {
@IBAction func backButtonHandler(_ sender: AnyObject) {
// buttonAnimation
let viewControllers: [DemoViewController?] = navigationController?.viewControllers.map { $0 as? DemoViewController } ?? []
@@ -46,10 +63,9 @@ extension DemoTableViewController {
}
// MARK: UIScrollViewDelegate
extension DemoTableViewController {
override func scrollViewDidScroll(scrollView: UIScrollView) {
override func scrollViewDidScroll(_ scrollView: UIScrollView) {
// if scrollView.contentOffset.y < -25 {
// // buttonAnimation
// let viewControllers: [DemoViewController?] = navigationController?.viewControllers.map { $0 as? DemoViewController } ?? []
@@ -1,8 +1,9 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="10117" systemVersion="15F34" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES">
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="11201" systemVersion="15G1004" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="10085"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="11161"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
@@ -12,45 +13,40 @@
<autoresizingMask key="autoresizingMask"/>
<view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
<rect key="frame" x="0.0" y="0.0" width="256" height="335"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="rbd-6U-uYZ">
<rect key="frame" x="0.0" y="0.0" width="256" height="335"/>
<subviews>
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="icons" translatesAutoresizingMaskIntoConstraints="NO" id="7zK-Le-Npw">
<rect key="frame" x="20" y="287" width="116" height="40"/>
<constraints>
<constraint firstAttribute="width" constant="116" id="7hq-gd-WaT"/>
<constraint firstAttribute="height" constant="40" id="cUH-6u-zMD"/>
</constraints>
</imageView>
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="dots" translatesAutoresizingMaskIntoConstraints="NO" id="Au6-h8-xBa">
<rect key="frame" x="228" y="298" width="4" height="19"/>
<constraints>
<constraint firstAttribute="height" constant="19" id="KJW-6L-1Ol"/>
<constraint firstAttribute="width" constant="4" id="YcW-cL-JpF"/>
</constraints>
</imageView>
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="stars" translatesAutoresizingMaskIntoConstraints="NO" id="l9V-6B-rdj">
<rect key="frame" x="159" y="266" width="77" height="12"/>
<constraints>
<constraint firstAttribute="height" constant="12" id="Nl5-u6-NGX"/>
<constraint firstAttribute="width" constant="77" id="NwE-fo-yyB"/>
</constraints>
</imageView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="NO. 7911847" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="pMH-Qa-ClW">
<rect key="frame" x="24" y="265" width="68" height="14"/>
<fontDescription key="fontDescription" type="system" pointSize="11"/>
<color key="textColor" red="0.49803921568627452" green="0.51764705882352935" blue="0.53725490196078429" alpha="1" colorSpace="calibratedRGB"/>
<color key="textColor" red="0.49803921568627452" green="0.51764705882352935" blue="0.53725490196078429" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="La Crescenta-Montrose, CA91020" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="eC4-wU-lTH">
<rect key="frame" x="39" y="240" width="179" height="14"/>
<fontDescription key="fontDescription" type="system" pointSize="11"/>
<color key="textColor" red="0.49803921569999998" green="0.51764705879999995" blue="0.53725490200000003" alpha="1" colorSpace="calibratedRGB"/>
<color key="textColor" red="0.49803921569999998" green="0.51764705879999995" blue="0.53725490200000003" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstItem="Au6-h8-xBa" firstAttribute="top" secondItem="l9V-6B-rdj" secondAttribute="bottom" constant="20" id="1qd-Em-ZT9"/>
<constraint firstItem="pMH-Qa-ClW" firstAttribute="leading" secondItem="rbd-6U-uYZ" secondAttribute="leading" constant="24" id="7zn-VD-NCK"/>
@@ -67,33 +63,27 @@
</constraints>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="4h2-Xv-xjU">
<rect key="frame" x="0.0" y="0.0" width="256" height="335"/>
<subviews>
<imageView userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="item0" translatesAutoresizingMaskIntoConstraints="NO" id="9FK-FA-F0l">
<rect key="frame" x="0.0" y="0.0" width="256" height="335"/>
</imageView>
<imageView userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="item0" translatesAutoresizingMaskIntoConstraints="NO" id="9FK-FA-F0l"/>
<label opaque="NO" userInteractionEnabled="NO" tag="101" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="ATCOASTAL" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="XFh-D7-eSl">
<rect key="frame" x="62" y="10" width="132" height="29"/>
<accessibility key="accessibilityConfiguration">
<bool key="isElement" value="NO"/>
</accessibility>
<fontDescription key="fontDescription" type="system" pointSize="24"/>
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
<color key="shadowColor" red="0.0" green="0.0" blue="0.0" alpha="0.076029349662162168" colorSpace="calibratedRGB"/>
<color key="shadowColor" red="0.0" green="0.0" blue="0.0" alpha="0.076029349662162168" colorSpace="custom" customColorSpace="sRGB"/>
<size key="shadowOffset" width="0.0" height="0.0"/>
</label>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="oce-vs-fcR" userLabel="LeftView">
<rect key="frame" x="8" y="293" width="110" height="32"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="NORTH LAT 36" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ZG8-y8-Dfi">
<rect key="frame" x="13" y="9" width="85" height="15"/>
<fontDescription key="fontDescription" type="system" weight="thin" pointSize="12"/>
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<color key="backgroundColor" red="1" green="0.2070791421" blue="0.80130883779999995" alpha="0.0" colorSpace="calibratedRGB"/>
<color key="backgroundColor" red="1" green="0.2070791421" blue="0.80130883779999995" alpha="0.0" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstItem="ZG8-y8-Dfi" firstAttribute="centerX" secondItem="oce-vs-fcR" secondAttribute="centerX" id="5kH-aW-2nu"/>
<constraint firstAttribute="height" constant="32" id="Ltd-P2-jig"/>
@@ -101,10 +91,8 @@
</constraints>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="FVj-GH-Mhw" userLabel="CenterView">
<rect key="frame" x="119" y="293" width="20" height="32"/>
<subviews>
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="pinIcon" translatesAutoresizingMaskIntoConstraints="NO" id="LFF-iv-Z1U">
<rect key="frame" x="2" y="7" width="15" height="18"/>
<accessibility key="accessibilityConfiguration">
<accessibilityTraits key="traits" staticText="YES"/>
<bool key="isElement" value="YES"/>
@@ -115,7 +103,7 @@
</constraints>
</imageView>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.0" colorSpace="custom" customColorSpace="sRGB"/>
<accessibility key="accessibilityConfiguration">
<accessibilityTraits key="traits" staticText="YES"/>
<bool key="isElement" value="NO"/>
@@ -128,16 +116,14 @@
</constraints>
</view>
<view tag="4" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="EKg-XH-vNU" userLabel="RightView">
<rect key="frame" x="140" y="293" width="110" height="32"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="EAST LNG 97" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="zmS-RM-seQ">
<rect key="frame" x="18" y="9" width="75" height="15"/>
<fontDescription key="fontDescription" type="system" weight="thin" pointSize="12"/>
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<color key="backgroundColor" red="1" green="0.20707914213106515" blue="0.8013088377544425" alpha="0.0" colorSpace="calibratedRGB"/>
<color key="backgroundColor" red="1" green="0.20707914213106515" blue="0.8013088377544425" alpha="0.0" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstItem="zmS-RM-seQ" firstAttribute="centerY" secondItem="EKg-XH-vNU" secondAttribute="centerY" id="dxV-Q6-AU9"/>
<constraint firstItem="zmS-RM-seQ" firstAttribute="centerX" secondItem="EKg-XH-vNU" secondAttribute="centerX" id="ls8-YV-n1Q"/>
@@ -145,7 +131,7 @@
</constraints>
</view>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstItem="9FK-FA-F0l" firstAttribute="top" secondItem="4h2-Xv-xjU" secondAttribute="top" id="0HR-8P-WVW"/>
<constraint firstItem="EKg-XH-vNU" firstAttribute="leading" secondItem="FVj-GH-Mhw" secondAttribute="trailing" constant="1" id="6Bb-cJ-uQs"/>
@@ -166,9 +152,8 @@
</constraints>
</view>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
</view>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.0" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstItem="4h2-Xv-xjU" firstAttribute="centerY" secondItem="gTV-IL-0wX" secondAttribute="centerY" id="0xA-8H-CCG"/>
<constraint firstItem="rbd-6U-uYZ" firstAttribute="centerX" secondItem="gTV-IL-0wX" secondAttribute="centerX" id="6nN-mZ-xkq"/>
@@ -178,7 +163,7 @@
<size key="customSize" width="275" height="575"/>
<connections>
<outlet property="backConstraintY" destination="dmf-qy-2nS" id="szE-V2-yce"/>
<outlet property="backContainerView" destination="rbd-6U-uYZ" id="bk5-30-huH"/>
<outlet property="backContainerView" destination="rbd-6U-uYZ" id="fl2-yE-o3C"/>
<outlet property="backgroundImageView" destination="9FK-FA-F0l" id="kns-UF-jMo"/>
<outlet property="customTitle" destination="XFh-D7-eSl" id="eia-lY-ptu"/>
<outlet property="frontConstraintY" destination="0xA-8H-CCG" id="qOL-jY-lrP"/>
@@ -11,14 +11,16 @@ import UIKit
class DemoViewController: ExpandingViewController {
typealias ItemInfo = (imageName: String, title: String)
private var cellsIsOpen = [Bool]()
private let items: [ItemInfo] = [("item0", "Boston"),("item1", "New York"),("item2", "San Francisco"),("item3", "Washington")]
fileprivate var cellsIsOpen = [Bool]()
fileprivate let items: [ItemInfo] = [("item0", "Boston"),("item1", "New York"),("item2", "San Francisco"),("item3", "Washington")]
@IBOutlet weak var pageLabel: UILabel!
@IBOutlet weak var titleImageView: UIImageView!
@IBOutlet weak var titleImageViewXConstraint: NSLayoutConstraint!
}
// MARK: life cicle
// MARK: - Lifecycle 🌎
extension DemoViewController {
override func viewDidLoad() {
@@ -26,59 +28,66 @@ extension DemoViewController {
super.viewDidLoad()
registerCell()
fillCellIsOpeenArry()
addGestureToView(collectionView!)
fillCellIsOpenArray()
addGesture(to: collectionView!)
configureNavBar()
}
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
guard let titleView = navigationItem.titleView else { return }
let center = UIScreen.main.bounds.midX
let diff = center - titleView.frame.midX
titleImageViewXConstraint.constant = diff
}
}
// MARK: Helpers
// MARK: Helpers
extension DemoViewController {
private func registerCell() {
let nib = UINib(nibName: String(DemoCollectionViewCell), bundle: nil)
collectionView?.registerNib(nib, forCellWithReuseIdentifier: String(DemoCollectionViewCell))
fileprivate func registerCell() {
let nib = UINib(nibName: String(describing: DemoCollectionViewCell.self), bundle: nil)
collectionView?.register(nib, forCellWithReuseIdentifier: String(describing: DemoCollectionViewCell.self))
}
private func fillCellIsOpeenArry() {
for _ in items {
cellsIsOpen.append(false)
}
fileprivate func fillCellIsOpenArray() {
cellsIsOpen = Array(repeating: false, count: items.count)
}
private func getViewController() -> ExpandingTableViewController {
fileprivate func getViewController() -> ExpandingTableViewController {
let storyboard = UIStoryboard(storyboard: .Main)
let toViewController: DemoTableViewController = storyboard.instantiateViewController()
return toViewController
}
private func configureNavBar() {
navigationItem.leftBarButtonItem?.image = navigationItem.leftBarButtonItem?.image!.imageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal)
fileprivate func configureNavBar() {
navigationItem.leftBarButtonItem?.image = navigationItem.leftBarButtonItem?.image!.withRenderingMode(UIImageRenderingMode.alwaysOriginal)
}
}
/// MARK: Gesture
extension DemoViewController {
private func addGestureToView(toView: UIView) {
let gesutereUp = Init(UISwipeGestureRecognizer(target: self, action: #selector(DemoViewController.swipeHandler(_:)))) {
$0.direction = .Up
fileprivate func addGesture(to view: UIView) {
let upGesture = Init(UISwipeGestureRecognizer(target: self, action: #selector(DemoViewController.swipeHandler(_:)))) {
$0.direction = .up
}
let gesutereDown = Init(UISwipeGestureRecognizer(target: self, action: #selector(DemoViewController.swipeHandler(_:)))) {
$0.direction = .Down
let downGesture = Init(UISwipeGestureRecognizer(target: self, action: #selector(DemoViewController.swipeHandler(_:)))) {
$0.direction = .down
}
toView.addGestureRecognizer(gesutereUp)
toView.addGestureRecognizer(gesutereDown)
view.addGestureRecognizer(upGesture)
view.addGestureRecognizer(downGesture)
}
func swipeHandler(sender: UISwipeGestureRecognizer) {
let indexPath = NSIndexPath(forRow: currentIndex, inSection: 0)
guard let cell = collectionView?.cellForItemAtIndexPath(indexPath) as? DemoCollectionViewCell else { return }
func swipeHandler(_ sender: UISwipeGestureRecognizer) {
let indexPath = IndexPath(row: currentIndex, section: 0)
guard let cell = collectionView?.cellForItem(at: indexPath) as? DemoCollectionViewCell else { return }
// double swipe Up transition
if cell.isOpened == true && sender.direction == .Up {
if cell.isOpened == true && sender.direction == .up {
pushToViewController(getViewController())
if let rightButton = navigationItem.rightBarButtonItem as? AnimatingBarButton {
@@ -86,27 +95,27 @@ extension DemoViewController {
}
}
let open = sender.direction == .Up ? true : false
let open = sender.direction == .up ? true : false
cell.cellIsOpen(open)
cellsIsOpen[indexPath.row] = cell.isOpened
}
}
// MARK: UIScrollViewDelegate
// MARK: UIScrollViewDelegate
extension DemoViewController {
func scrollViewDidScroll(scrollView: UIScrollView) {
func scrollViewDidScroll(_ scrollView: UIScrollView) {
pageLabel.text = "\(currentIndex+1)/\(items.count)"
}
}
// MARK: UICollectionViewDataSource
extension DemoViewController {
override func collectionView(collectionView: UICollectionView, willDisplayCell cell: UICollectionViewCell, forItemAtIndexPath indexPath: NSIndexPath) {
super.collectionView(collectionView, willDisplayCell: cell, forItemAtIndexPath: indexPath)
override func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
super.collectionView(collectionView, willDisplay: cell, forItemAt: indexPath)
guard let cell = cell as? DemoCollectionViewCell else { return }
let index = indexPath.row % items.count
@@ -116,9 +125,9 @@ extension DemoViewController {
cell.cellIsOpen(cellsIsOpen[index], animated: false)
}
func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
guard let cell = collectionView.cellForItemAtIndexPath(indexPath) as? DemoCollectionViewCell
where currentIndex == indexPath.row else { return }
func collectionView(_ collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: IndexPath) {
guard let cell = collectionView.cellForItem(at: indexPath) as? DemoCollectionViewCell
, currentIndex == indexPath.row else { return }
if cell.isOpened == false {
cell.cellIsOpen(true)
@@ -130,17 +139,18 @@ extension DemoViewController {
}
}
}
}
// MARK: UICollectionViewDataSource
extension DemoViewController {
override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return items.count
}
override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
return collectionView.dequeueReusableCellWithReuseIdentifier(String(DemoCollectionViewCell), forIndexPath: indexPath)
override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
return collectionView.dequeueReusableCell(withReuseIdentifier: String(describing: DemoCollectionViewCell.self), for: indexPath)
}
}
@@ -36,7 +36,7 @@ extension AnimatingBarButton {
extension AnimatingBarButton {
func animationSelected(selected: Bool) {
func animationSelected(_ selected: Bool) {
if selected {
rotateAnimationFrom(normalView, toItem: selectedView, duration: duration)
} else {
@@ -49,7 +49,7 @@ extension AnimatingBarButton {
extension AnimatingBarButton {
private func configurateImageViews() {
fileprivate func configurateImageViews() {
configureImageView(normalView, imageName: normalImageName)
configureImageView(selectedView, imageName: selectedImageName)
@@ -57,29 +57,31 @@ extension AnimatingBarButton {
// normalView.hidden = true
}
private func configureImageView(imageView: UIImageView, imageName: String) {
fileprivate func configureImageView(_ imageView: UIImageView, imageName: String) {
guard let customView = customView else { return }
imageView.translatesAutoresizingMaskIntoConstraints = false
imageView.image = UIImage(named: imageName)
imageView.contentMode = .ScaleAspectFit
imageView.contentMode = .scaleAspectFit
// imageView.backgroundColor = .greenColor()
// imageView.layer.anchorPoint = CGPoint(x: 0.5, y: 0.5)
customView.addSubview(imageView)
// add constraints
[(NSLayoutAttribute.CenterX, 12), (.CenterY, -1)].forEach { info in
[(NSLayoutAttribute.centerX, 12), (.centerY, -1)].forEach { info in
(customView, imageView) >>>- {
$0.attribute = info.0
$0.constant = CGFloat(info.1)
return
}
}
[NSLayoutAttribute.Height, .Width].forEach { attribute in
[NSLayoutAttribute.height, .width].forEach { attribute in
imageView >>>- {
$0.attribute = attribute
$0.constant = 20
return
}
}
}
@@ -10,33 +10,33 @@ import UIKit
protocol Rotatable {
func rotateAnimationFrom(fromItem: UIView, toItem: UIView, duration: Double)
func rotateAnimationFrom(_ fromItem: UIView, toItem: UIView, duration: Double)
}
extension Rotatable {
func rotateAnimationFrom(fromItem: UIView, toItem: UIView, duration: Double) {
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.addAnimation(fromRotate, forKey: nil)
fromItem.layer.addAnimation(fromOpacity, forKey: nil)
fromItem.layer.add(fromRotate, forKey: nil)
fromItem.layer.add(fromOpacity, forKey: nil)
toItem.layer.addAnimation(toRotate, forKey: nil)
toItem.layer.addAnimation(toOpacity, forKey: nil)
toItem.layer.add(toRotate, forKey: nil)
toItem.layer.add(toOpacity, forKey: nil)
}
private func animationFrom(from: Double, to: Double, key: String, duration: Double) -> CABasicAnimation {
fileprivate func animationFrom(_ from: Double, to: Double, key: String, duration: Double) -> CABasicAnimation {
return Init(CABasicAnimation(keyPath: key)) {
$0.duration = duration
$0.fromValue = from
$0.toValue = to
$0.fillMode = kCAFillModeForwards
$0.removedOnCompletion = false
$0.isRemovedOnCompletion = false
}
}
}
@@ -28,7 +28,7 @@ class DemoExpandingCollectionTests: XCTestCase {
func testPerformanceExample() {
// This is an example of a performance test case.
measureBlock {
measure {
// Put the code you want to measure the time of here.
}
}
+22 -12
View File
@@ -1,4 +1,4 @@
![header](https://raw.githubusercontent.com/Ramotion/expanding-collection/master/header.png)
[![header](https://raw.githubusercontent.com/Ramotion/expanding-collection/master/header.png)](https://business.ramotion.com?utm_source=gthb&utm_medium=special&utm_campaign=expanding-collection-logo)
# expanding-collection
@@ -8,18 +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)
[shot on dribbble](https://dribbble.com/shots/2741477-iOS-Expanding-Collection-Open-Source):
![Animation](https://raw.githubusercontent.com/Ramotion/expanding-collection/master/preview.gif)
## About
This project is maintained by Ramotion, Inc.<br>
We specialize in the designing and coding of custom UI for Mobile Apps and Websites.<br><br>**Looking for developers for your project?**
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).
<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?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
@@ -27,7 +37,9 @@ Just add the Source folder to your project.
or use [CocoaPods](https://cocoapods.org) with Podfile:
``` ruby
pod 'expanding-collection'
pod 'expanding-collection', '~> 1.0.3' swift 3
pod 'expanding-collection', '~> 0.3.2' swift 2
```
or [Carthage](https://github.com/Carthage/Carthage) users can simply add to their `Cartfile`:
```
@@ -37,7 +49,7 @@ github "Ramotion/expanding-collection"
## Usage
```swift
import ExpandingCollection
import expanding_collection
```
#### Create CollectionViewCell
@@ -160,9 +172,7 @@ override func viewDidLoad() {
Expanding collection is released under the MIT license.
See [LICENSE](./LICENSE) for details.
## About
The project maintained by [app development agency](https://ramotion.com?utm_source=gthb&utm_medium=special&utm_campaign=expanding-collection) [Ramotion Inc.](https://ramotion.com?utm_source=gthb&utm_medium=special&utm_campaign=expanding-collection)
See our other [open-source projects](https://github.com/ramotion) or [hire](https://ramotion.com?utm_source=gthb&utm_medium=special&utm_campaign=expanding-collection) us to design, develop, and grow your product.
## Follow us
[![Twitter URL](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/intent/tweet?text=https://github.com/ramotion/expanding-collection)
[![Twitter Follow](https://img.shields.io/twitter/follow/ramotion.svg?style=social)](https://twitter.com/ramotion)
@@ -9,11 +9,11 @@
import UIKit
/// Base class for UITableViewcontroller which have back transition method
public class ExpandingTableViewController: UITableViewController {
open class ExpandingTableViewController: UITableViewController {
// MARK: Vars
/// The height of the table view header
public var headerHeight: CGFloat = 236
open var headerHeight: CGFloat = 236
var transitionDriver: TransitionDriver?
}
@@ -22,21 +22,21 @@ public class ExpandingTableViewController: UITableViewController {
extension ExpandingTableViewController {
private func getScreen() -> UIImage? {
fileprivate func getScreen() -> UIImage? {
let height = (headerHeight - tableView.contentOffset.y) < 0 ? 0 : (headerHeight - tableView.contentOffset.y)
let backImageSize = CGSize(width: view.bounds.width, height: view.bounds.height - height + getTabBarHeight())
let backImageOrigin = CGPoint(x: 0, y: height + tableView.contentOffset.y)
return view.takeSnapshot(CGRect(origin: backImageOrigin, size: backImageSize))
}
private func getTabBarHeight() -> CGFloat {
fileprivate func getTabBarHeight() -> CGFloat {
guard let navigationController = self.navigationController else {
return 0
}
let insets = automaticallyAdjustsScrollViewInsets
let tabBarHeight = insets == true ? navigationController.navigationBar.frame.size.height : 0
let stausBarHeight = insets == true ? UIApplication.sharedApplication().statusBarFrame.size.height : 0
let stausBarHeight = insets == true ? UIApplication.shared.statusBarFrame.size.height : 0
return tabBarHeight + stausBarHeight
}
@@ -60,7 +60,6 @@ extension ExpandingTableViewController {
offset += getTabBarHeight()
transitionDriver.popTransitionAnimationContantOffset(offset, backImage: backImage)
self.navigationController?.popViewControllerAnimated(false)
let _ = self.navigationController?.popViewController(animated: false)
}
}
}
@@ -9,10 +9,18 @@
import UIKit
/// Base class for UICollectionViewCell
public class BasePageCollectionCell: UICollectionViewCell {
open class BasePageCollectionCell: UICollectionViewCell {
/// Animation oposition offset when cell is open
@IBInspectable public var yOffset: CGFloat = 40
/// 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
@@ -28,19 +36,19 @@ public class BasePageCollectionCell: UICollectionViewCell {
// MARK: Vars
/// The view used as the face of the cell must connectid from xib or storyboard.
@IBOutlet public weak var frontContainerView: UIView!
@IBOutlet open weak var frontContainerView: UIView!
/// The view used as the back of the cell must connectid from xib or storyboard.
@IBOutlet public weak var backContainerView: UIView!
@IBOutlet open weak var backContainerView: UIView!
/// constraints for backContainerView must connectid from xib or storyboard
@IBOutlet public weak var backConstraintY: NSLayoutConstraint!
@IBOutlet open weak var backConstraintY: NSLayoutConstraint!
/// constraints for frontContainerView must connectid from xib or storyboard
@IBOutlet public weak var frontConstraintY: NSLayoutConstraint!
@IBOutlet open weak var frontConstraintY: NSLayoutConstraint!
var shadowView: UIView?
/// A Boolean value that indicates whether the cell is opened.
public var isOpened = false
open var isOpened = false
// MARK: inits
@@ -75,17 +83,16 @@ public class BasePageCollectionCell: UICollectionViewCell {
extension BasePageCollectionCell {
public override func awakeFromNib() {
open override func awakeFromNib() {
super.awakeFromNib()
commonInit()
}
private func commonInit() {
fileprivate func commonInit() {
configurationViews()
shadowView = createShadowViewOnView(frontContainerView)
}
}
// MARK: Control
@@ -98,32 +105,44 @@ extension BasePageCollectionCell {
- parameter isOpen: Contains the value true if the cell should display open state, if false should display close state.
- parameter animated: Set to true if the change in selection state is animated.
*/
public func cellIsOpen(isOpen: Bool, animated: Bool = true) {
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 let widthConstant = backContainerView.getConstraint(.Width) {
widthConstant.constant = isOpen == true ? frontContainerView.bounds.size.width + yOffset : frontContainerView.bounds.size.width
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 heightConstant = backContainerView.getConstraint(.Height) {
heightConstant.constant = isOpen == true ? frontContainerView.bounds.size.height + yOffset : frontContainerView.bounds.size.height
if let widthConstant = backContainerView.getConstraint(.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) {
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.animateWithDuration(0.3, delay: 0, options: .CurveEaseInOut, animations: {
UIView.animate(withDuration: 0.3, delay: 0, options: UIViewAnimationOptions(), animations: {
self.contentView.layoutIfNeeded()
}, completion: nil)
} else {
self.contentView.layoutIfNeeded()
}
isOpened = isOpen
}
}
@@ -131,7 +150,7 @@ extension BasePageCollectionCell {
extension BasePageCollectionCell {
private func configurationViews() {
fileprivate func configurationViews() {
backContainerView.layer.masksToBounds = true
backContainerView.layer.cornerRadius = 5
@@ -142,42 +161,46 @@ extension BasePageCollectionCell {
layer.masksToBounds = false
}
private func createShadowViewOnView(view: UIView?) -> UIView? {
fileprivate func createShadowViewOnView(_ view: UIView?) -> UIView? {
guard let view = view else {return nil}
let shadow = Init(UIView(frame: .zero)) {
$0.backgroundColor = .clearColor()
$0.backgroundColor = UIColor(white: 0, alpha: 0)
$0.translatesAutoresizingMaskIntoConstraints = false
$0.layer.masksToBounds = false;
$0.layer.shadowColor = UIColor.blackColor().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)
// create constraints
for info: (attribute: NSLayoutAttribute, scale: CGFloat) in [(NSLayoutAttribute.Width, 0.8), (NSLayoutAttribute.Height, 0.9)] {
for info: (attribute: NSLayoutAttribute, scale: CGFloat) in [(NSLayoutAttribute.width, 0.8), (NSLayoutAttribute.height, 0.9)] {
if let frontViewConstraint = view.getConstraint(info.attribute) {
shadow >>>- {
$0.attribute = info.attribute
$0.constant = frontViewConstraint.constant * info.scale
return
}
}
}
for info: (attribute: NSLayoutAttribute, offset: CGFloat) in [(NSLayoutAttribute.CenterX, 0), (NSLayoutAttribute.CenterY, 30)] {
for info: (attribute: NSLayoutAttribute, offset: CGFloat) in [(NSLayoutAttribute.centerX, 0), (NSLayoutAttribute.centerY, 30)] {
(contentView, shadow, view) >>>- {
$0.attribute = info.attribute
$0.constant = info.offset
return
}
}
// size shadow
let width = shadow.getConstraint(.Width)?.constant
let height = shadow.getConstraint(.Height)?.constant
let width = shadow.getConstraint(.width)?.constant
let height = shadow.getConstraint(.height)?.constant
shadow.layer.shadowPath = UIBezierPath(roundedRect: CGRect(x: 0, y: 0, width: width!, height: height!), cornerRadius: 0).CGPath
shadow.layer.shadowPath = UIBezierPath(roundedRect: CGRect(x: 0, y: 0, width: width!, height: height!), cornerRadius: 0).cgPath
return shadow
}
@@ -190,19 +213,24 @@ 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
}
}
func configureCellViewConstraintsWithSize(size: CGSize) {
guard isOpened == false && frontContainerView.getConstraint(.Width)?.constant != size.width else { return }
func configureCellViewConstraintsWithSize(_ size: CGSize) {
guard isOpened == false && frontContainerView.getConstraint(.width)?.constant != size.width else { return }
[frontContainerView, backContainerView].forEach {
let constraintWidth = $0.getConstraint(.Width)
let constraintWidth = $0?.getConstraint(.width)
constraintWidth?.constant = size.width
let constraintHeight = $0.getConstraint(.Height)
let constraintHeight = $0?.getConstraint(.height)
constraintHeight?.constant = size.height
}
}
@@ -212,10 +240,10 @@ extension BasePageCollectionCell {
extension BasePageCollectionCell {
private func highlightedImageFalseOnView(view: UIView) {
fileprivate func highlightedImageFalseOnView(_ view: UIView) {
for item in view.subviews {
if case let imageView as UIImageView = item {
imageView.highlighted = false
imageView.isHighlighted = false
}
if item.subviews.count > 0 {
highlightedImageFalseOnView(item)
@@ -223,7 +251,7 @@ extension BasePageCollectionCell {
}
}
private func copyShadowFromView(fromView: UIView, toView: UIView) {
fileprivate func copyShadowFromView(_ fromView: UIView, toView: UIView) {
fromView.layer.shadowPath = toView.layer.shadowPath
fromView.layer.masksToBounds = toView.layer.masksToBounds
fromView.layer.shadowColor = toView.layer.shadowColor
@@ -236,8 +264,8 @@ extension BasePageCollectionCell {
func copyCell() -> BasePageCollectionCell? {
highlightedImageFalseOnView(contentView)
let data = NSKeyedArchiver.archivedDataWithRootObject(self)
guard case let copyView as BasePageCollectionCell = NSKeyedUnarchiver.unarchiveObjectWithData(data),
let data = NSKeyedArchiver.archivedData(withRootObject: self)
guard case let copyView as BasePageCollectionCell = NSKeyedUnarchiver.unarchiveObject(with: data),
let shadowView = self.shadowView else {
return nil
}
@@ -258,34 +286,34 @@ extension BasePageCollectionCell {
return copyView
}
public override func encodeWithCoder(coder: NSCoder) {
super.encodeWithCoder(coder)
coder.encodeObject(backContainerView, forKey: Constants.backContainer)
coder.encodeObject(frontContainerView, forKey: Constants.frontContainer)
coder.encodeObject(frontConstraintY, forKey: Constants.frontContainerY)
coder.encodeObject(backConstraintY, forKey: Constants.backContainerY)
coder.encodeObject(shadowView, forKey: Constants.shadowView)
open override func encode(with coder: NSCoder) {
super.encode(with: coder)
coder.encode(backContainerView, forKey: Constants.backContainer)
coder.encode(frontContainerView, forKey: Constants.frontContainer)
coder.encode(frontConstraintY, forKey: Constants.frontContainerY)
coder.encode(backConstraintY, forKey: Constants.backContainerY)
coder.encode(shadowView, forKey: Constants.shadowView)
}
private func configureOutletFromDecoder(coder: NSCoder) {
if case let shadowView as UIView = coder.decodeObjectForKey(Constants.shadowView) {
fileprivate func configureOutletFromDecoder(_ coder: NSCoder) {
if case let shadowView as UIView = coder.decodeObject(forKey: Constants.shadowView) {
self.shadowView = shadowView
}
if case let backView as UIView = coder.decodeObjectForKey(Constants.backContainer) {
if case let backView as UIView = coder.decodeObject(forKey: Constants.backContainer) {
backContainerView = backView
}
if case let frontView as UIView = coder.decodeObjectForKey(Constants.frontContainer) {
if case let frontView as UIView = coder.decodeObject(forKey: Constants.frontContainer) {
frontContainerView = frontView
}
if case let constraint as NSLayoutConstraint = coder.decodeObjectForKey(Constants.frontContainerY) {
if case let constraint as NSLayoutConstraint = coder.decodeObject(forKey: Constants.frontContainerY) {
frontConstraintY = constraint
}
if case let constraint as NSLayoutConstraint = coder.decodeObjectForKey(Constants.backContainerY) {
if case let constraint as NSLayoutConstraint = coder.decodeObject(forKey: Constants.backContainerY) {
backConstraintY = constraint
}
}
}
}
@@ -10,7 +10,7 @@ import UIKit
class PageCollectionLayout: UICollectionViewFlowLayout {
private var lastCollectionViewSize: CGSize = CGSizeZero
fileprivate var lastCollectionViewSize: CGSize = CGSize.zero
var scalingOffset: CGFloat = 200
var minimumScaleFactor: CGFloat = 0.9
@@ -31,8 +31,8 @@ class PageCollectionLayout: UICollectionViewFlowLayout {
extension PageCollectionLayout {
private func commonInit(itemSize: CGSize) {
scrollDirection = .Horizontal
fileprivate func commonInit(_ itemSize: CGSize) {
scrollDirection = .horizontal
minimumLineSpacing = 25
self.itemSize = itemSize
}
@@ -42,8 +42,8 @@ extension PageCollectionLayout {
extension PageCollectionLayout {
override func invalidateLayoutWithContext(context: UICollectionViewLayoutInvalidationContext) {
super.invalidateLayoutWithContext(context)
override func invalidateLayout(with context: UICollectionViewLayoutInvalidationContext) {
super.invalidateLayout(with: context)
guard let collectionView = self.collectionView else { return }
@@ -53,13 +53,13 @@ extension PageCollectionLayout {
}
}
override func targetContentOffsetForProposedContentOffset(proposedContentOffset: CGPoint, withScrollingVelocity velocity: CGPoint) -> CGPoint {
override func targetContentOffset(forProposedContentOffset proposedContentOffset: CGPoint, withScrollingVelocity velocity: CGPoint) -> CGPoint {
guard let collectionView = self.collectionView else {
return proposedContentOffset
}
let proposedRect = CGRectMake(proposedContentOffset.x, 0, collectionView.bounds.width, collectionView.bounds.height)
guard let layoutAttributes = self.layoutAttributesForElementsInRect(proposedRect) else {
let proposedRect = CGRect(x: proposedContentOffset.x, y: 0, width: collectionView.bounds.width, height: collectionView.bounds.height)
guard let layoutAttributes = self.layoutAttributesForElements(in: proposedRect) else {
return proposedContentOffset
}
@@ -67,7 +67,7 @@ extension PageCollectionLayout {
let proposedContentOffsetCenterX = proposedContentOffset.x + collectionView.bounds.width / 2
for attributes in layoutAttributes {
if attributes.representedElementCategory != .Cell {
if attributes.representedElementCategory != .cell {
continue
}
@@ -93,27 +93,27 @@ extension PageCollectionLayout {
newOffsetX += velocity.x > 0 ? pageWidth : -pageWidth
}
return CGPointMake(newOffsetX, proposedContentOffset.y)
return CGPoint(x: newOffsetX, y: proposedContentOffset.y)
}
override func shouldInvalidateLayoutForBoundsChange(newBounds: CGRect) -> Bool {
override func shouldInvalidateLayout(forBoundsChange newBounds: CGRect) -> Bool {
return true
}
override func layoutAttributesForElementsInRect(rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
guard let collectionView = self.collectionView,
let superAttributes = super.layoutAttributesForElementsInRect(rect) else {
return super.layoutAttributesForElementsInRect(rect)
let superAttributes = super.layoutAttributesForElements(in: rect) else {
return super.layoutAttributesForElements(in: rect)
}
if scaleItems == false{
return super.layoutAttributesForElementsInRect(rect)
return super.layoutAttributesForElements(in: rect)
}
let contentOffset = collectionView.contentOffset
let size = collectionView.bounds.size
let visibleRect = CGRectMake(contentOffset.x, contentOffset.y, size.width, size.height)
let visibleCenterX = CGRectGetMidX(visibleRect)
let visibleRect = CGRect(x: contentOffset.x, y: contentOffset.y, width: size.width, height: size.height)
let visibleCenterX = visibleRect.midX
guard case let newAttributesArray as [UICollectionViewLayoutAttributes] = NSArray(array: superAttributes, copyItems: true) else {
return nil
@@ -137,13 +137,13 @@ extension PageCollectionLayout {
extension PageCollectionLayout {
private func configureInset() -> Void {
fileprivate func configureInset() -> Void {
guard let collectionView = self.collectionView else {
return
}
let inset = collectionView.bounds.size.width / 2 - itemSize.width / 2
collectionView.contentInset = UIEdgeInsetsMake(0, inset, 0, inset)
collectionView.contentOffset = CGPointMake(-inset, 0)
collectionView.contentOffset = CGPoint(x: -inset, y: 0)
}
}
@@ -13,12 +13,11 @@ class PageCollectionView: UICollectionView {
}
// MARK: init
extension PageCollectionView {
class func createOnView(view: UIView,
class func createOnView(_ view: UIView,
layout: UICollectionViewLayout,
height:CGFloat,
height: CGFloat,
dataSource: UICollectionViewDataSource,
delegate: UICollectionViewDelegate) -> PageCollectionView {
@@ -28,20 +27,24 @@ extension PageCollectionView {
$0.showsHorizontalScrollIndicator = false
$0.dataSource = dataSource
$0.delegate = delegate
$0.backgroundColor = .clearColor()
$0.backgroundColor = UIColor(white: 0, alpha: 0)
}
view.addSubview(collectionView)
// add constraints
collectionView >>>- {
$0.attribute = .Height
$0.attribute = .height
$0.constant = height
return
}
[NSLayoutAttribute.Left, .Right, .CenterY].forEach { attribute in
(view, collectionView) >>>- { $0.attribute = attribute }
[NSLayoutAttribute.left, .right, .centerY].forEach { attribute in
(view, collectionView) >>>- {
$0.attribute = attribute
return
}
}
return collectionView
}
}
}
@@ -9,18 +9,18 @@
import UIKit
/// UIViewController with UICollectionView with custom transition method
public class ExpandingViewController: UIViewController {
open class ExpandingViewController: UIViewController {
/// The default size to use for cells.
public var itemSize = CGSize(width: 256, height: 335)
open var itemSize = CGSize(width: 256, height: 335)
/// The collection view object managed by this view controller.
public var collectionView: UICollectionView?
open var collectionView: UICollectionView?
private var transitionDriver: TransitionDriver?
fileprivate var transitionDriver: TransitionDriver?
/// Index of current cell
public var currentIndex: Int {
open var currentIndex: Int {
guard let collectionView = self.collectionView else { return 0 }
let startOffset = (collectionView.bounds.size.width - itemSize.width) / 2
@@ -29,7 +29,9 @@ public class ExpandingViewController: UIViewController {
}
let minimumLineSpacing = collectionLayout.minimumLineSpacing
return Int((collectionView.contentOffset.x + startOffset + itemSize.width / 2) / (itemSize.width + minimumLineSpacing))
let a = collectionView.contentOffset.x + startOffset + itemSize.width / 2
let b = itemSize.width + minimumLineSpacing
return Int(a / b)
}
}
@@ -37,7 +39,7 @@ public class ExpandingViewController: UIViewController {
extension ExpandingViewController {
public override func viewDidLoad() {
open override func viewDidLoad() {
super.viewDidLoad()
commonInit()
}
@@ -52,7 +54,7 @@ public extension ExpandingViewController {
- parameter viewController: The table view controller to push onto the stack.
*/
func pushToViewController(viewController: ExpandingTableViewController) {
func pushToViewController(_ viewController: ExpandingTableViewController) {
guard let collectionView = self.collectionView,
let navigationController = self.navigationController else {
return
@@ -61,7 +63,7 @@ public extension ExpandingViewController {
viewController.transitionDriver = transitionDriver
let insets = viewController.automaticallyAdjustsScrollViewInsets
let tabBarHeight = insets == true ? navigationController.navigationBar.frame.size.height : 0
let stausBarHeight = insets == true ? UIApplication.sharedApplication().statusBarFrame.size.height : 0
let stausBarHeight = insets == true ? UIApplication.shared.statusBarFrame.size.height : 0
let backImage = getBackImage(viewController, headerHeight: viewController.headerHeight)
transitionDriver?.pushTransitionAnimationIndex(currentIndex,
@@ -79,7 +81,7 @@ public extension ExpandingViewController {
extension ExpandingViewController {
private func commonInit() {
fileprivate func commonInit() {
let layout = PageCollectionLayout(itemSize: itemSize)
collectionView = PageCollectionView.createOnView(view,
@@ -87,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)
}
}
@@ -95,7 +100,7 @@ extension ExpandingViewController {
extension ExpandingViewController {
private func getBackImage(viewController: UIViewController, headerHeight: CGFloat) -> UIImage? {
fileprivate func getBackImage(_ viewController: UIViewController, headerHeight: CGFloat) -> UIImage? {
let imageSize = CGSize(width: viewController.view.bounds.width, height: viewController.view.bounds.height - headerHeight)
let imageFrame = CGRect(origin: CGPoint(x: 0, y: 0), size: imageSize)
return viewController.view.takeSnapshot(imageFrame)
@@ -107,18 +112,18 @@ extension ExpandingViewController {
extension ExpandingViewController: UICollectionViewDataSource, UICollectionViewDelegate {
public func collectionView(collectionView: UICollectionView, willDisplayCell cell: UICollectionViewCell, forItemAtIndexPath indexPath: NSIndexPath) {
open func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
guard case let cell as BasePageCollectionCell = cell else {
return
}
cell.configureCellViewConstraintsWithSize(itemSize)
}
public func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
open func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
fatalError("need emplementation in subclass")
}
public func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
open func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
fatalError("need emplementation in subclass")
}
}
@@ -127,9 +132,9 @@ extension ExpandingViewController: UICollectionViewDataSource, UICollectionViewD
extension ExpandingViewController {
public func scrollViewDidEndDecelerating(scrollView: UIScrollView) {
let indexPath = NSIndexPath(forRow: currentIndex, inSection: 0)
if case let currentCell as BasePageCollectionCell = collectionView?.cellForItemAtIndexPath(indexPath) {
public func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
let indexPath = IndexPath(row: currentIndex, section: 0)
if case let currentCell as BasePageCollectionCell = collectionView?.cellForItem(at: indexPath) {
currentCell.configurationCell()
}
}
@@ -10,21 +10,21 @@ import UIKit
protocol CornerAnimatable {
func animationCornerRadius(radius: CGFloat, duration: Double)
func animationCornerRadius(_ radius: CGFloat, duration: Double)
}
extension CornerAnimatable where Self: UIView {
func animationCornerRadius(radius: CGFloat, duration: Double) {
func animationCornerRadius(_ radius: CGFloat, duration: Double) {
let animation = Init(CABasicAnimation(keyPath: "cornerRadius")) {
$0.duration = duration
$0.toValue = radius
$0.fillMode = kCAFillModeForwards
$0.removedOnCompletion = false;
$0.isRemovedOnCompletion = false;
}
layer.addAnimation(animation, forKey: nil)
layer.add(animation, forKey: nil)
}
}
extension UIView: CornerAnimatable {}
extension UIView: CornerAnimatable {}
@@ -8,9 +8,9 @@
import Foundation
@warn_unused_result
internal func Init<Type>(value : Type, @noescape block: (object: Type) -> Void) -> Type
internal func Init<Type>(_ value : Type, block: (_ object: Type) -> Void) -> Type
{
block(object: value)
block(value)
return value
}
@@ -9,19 +9,25 @@
import UIKit
struct ConstraintInfo {
var attribute: NSLayoutAttribute = .Left
var secondAttribute: NSLayoutAttribute = .NotAnAttribute
var attribute: NSLayoutAttribute = .left
var secondAttribute: NSLayoutAttribute = .notAnAttribute
var constant: CGFloat = 0
var identifier: String?
var relation: NSLayoutRelation = .Equal
var relation: NSLayoutRelation = .equal
}
infix operator >>>- { associativity left precedence 150 }
precedencegroup ConstOp {
associativity: left
higherThan: AssignmentPrecedence
}
func >>>- <T: UIView> (left: (T, T), @noescape block: (inout ConstraintInfo) -> ()) -> NSLayoutConstraint {
infix operator >>>- : ConstOp
@discardableResult
func >>>- <T: UIView> (left: (T, T), block: (inout ConstraintInfo) -> Void) -> NSLayoutConstraint {
var info = ConstraintInfo()
block(&info)
info.secondAttribute = info.secondAttribute == .NotAnAttribute ? info.attribute : info.secondAttribute
info.secondAttribute = info.secondAttribute == .notAnAttribute ? info.attribute : info.secondAttribute
let constraint = NSLayoutConstraint(item: left.1,
attribute: info.attribute,
@@ -35,7 +41,8 @@ func >>>- <T: UIView> (left: (T, T), @noescape block: (inout ConstraintInfo) ->
return constraint
}
func >>>- <T: UIView> (left: T, @noescape block: (inout ConstraintInfo) -> ()) -> NSLayoutConstraint {
@discardableResult
func >>>- <T: UIView> (left: T, block: (inout ConstraintInfo) -> Void) -> NSLayoutConstraint {
var info = ConstraintInfo()
block(&info)
@@ -51,10 +58,11 @@ func >>>- <T: UIView> (left: T, @noescape block: (inout ConstraintInfo) -> ()) -
return constraint
}
func >>>- <T: UIView> (left: (T, T, T), @noescape block: (inout ConstraintInfo) -> ()) -> NSLayoutConstraint {
@discardableResult
func >>>- <T: UIView> (left: (T, T, T), block: (inout ConstraintInfo) -> Void) -> NSLayoutConstraint {
var info = ConstraintInfo()
block(&info)
info.secondAttribute = info.secondAttribute == .NotAnAttribute ? info.attribute : info.secondAttribute
info.secondAttribute = info.secondAttribute == .notAnAttribute ? info.attribute : info.secondAttribute
let constraint = NSLayoutConstraint(item: left.1,
attribute: info.attribute,
@@ -72,13 +80,16 @@ func >>>- <T: UIView> (left: (T, T, T), @noescape block: (inout ConstraintInfo)
extension UIView {
func addScaleToFillConstratinsOnView(view: UIView) {
[NSLayoutAttribute.Left, .Right, .Top, .Bottom].forEach { attribute in
(self, view) >>>- { $0.attribute = attribute }
func addScaleToFillConstratinsOnView(_ view: UIView) {
[NSLayoutAttribute.left, .right, .top, .bottom].forEach { attribute in
(self, view) >>>- {
$0.attribute = attribute
return
}
}
}
func getConstraint(attributes: NSLayoutAttribute) -> NSLayoutConstraint? {
func getConstraint(_ attributes: NSLayoutAttribute) -> NSLayoutConstraint? {
return constraints.filter {
if $0.firstAttribute == attributes && $0.secondItem == nil {
return true
@@ -9,20 +9,20 @@
import UIKit
extension UIView {
func takeSnapshot(frame: CGRect) -> UIImage? {
func takeSnapshot(_ frame: CGRect) -> UIImage? {
UIGraphicsBeginImageContextWithOptions(frame.size, false, 0.0)
let context = UIGraphicsGetCurrentContext();
CGContextTranslateCTM(context, frame.origin.x * -1, frame.origin.y * -1)
context?.translateBy(x: frame.origin.x * -1, y: frame.origin.y * -1)
guard let currentContext = UIGraphicsGetCurrentContext() else {
return nil
}
self.layer.renderInContext(currentContext)
self.layer.render(in: currentContext)
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
}
}
}
@@ -9,16 +9,16 @@
import UIKit
protocol SubviewsForEach {
func subviewsForEach(f: UIView -> Void)
func subviewsForEach(_ f: (UIView) -> Void)
}
extension SubviewsForEach where Self: UIView {
func subviewsForEach(f: UIView -> Void) {
func subviewsForEach(_ f: (UIView) -> Void) {
forEachView(self, f: f)
}
private func forEachView(view: UIView, f: UIView -> Void) {
fileprivate func forEachView(_ view: UIView, f: (UIView) -> Void) {
view.subviews.forEach {
f($0)
@@ -29,4 +29,4 @@ extension SubviewsForEach where Self: UIView {
}
}
extension UIView: SubviewsForEach {}
extension UIView: SubviewsForEach {}
+55 -47
View File
@@ -17,20 +17,20 @@ class TransitionDriver {
// MARK: Vars
private let view: UIView
private let duration: Double = 0.4
fileprivate let view: UIView
fileprivate let duration: Double = 0.4
// for push animation
private var copyCell: BasePageCollectionCell?
private var currentCell: BasePageCollectionCell?
private var backImageView: UIImageView?
fileprivate var copyCell: BasePageCollectionCell?
fileprivate var currentCell: BasePageCollectionCell?
fileprivate var backImageView: UIImageView?
private var leftCell: UICollectionViewCell?
private var rightCell: UICollectionViewCell?
private var step: CGFloat = 0
fileprivate var leftCell: UICollectionViewCell?
fileprivate var rightCell: UICollectionViewCell?
fileprivate var step: CGFloat = 0
private var frontViewFrame = CGRect.zero
private var backViewFrame = CGRect.zero
fileprivate var frontViewFrame = CGRect.zero
fileprivate var backViewFrame = CGRect.zero
init(view: UIView) {
self.view = view
@@ -41,14 +41,14 @@ class TransitionDriver {
extension TransitionDriver {
func pushTransitionAnimationIndex(currentIndex: Int,
func pushTransitionAnimationIndex(_ currentIndex: Int,
collecitionView: UICollectionView,
backImage: UIImage?,
headerHeight: CGFloat,
insets: CGFloat,
completion: UIView -> Void) {
completion: @escaping (UIView) -> Void) {
guard case let cell as BasePageCollectionCell = collecitionView.cellForItemAtIndexPath(NSIndexPath(forRow: currentIndex, inSection: 0)),
guard case let cell as BasePageCollectionCell = collecitionView.cellForItem(at: IndexPath(row: currentIndex, section: 0)),
let copyView = cell.copyCell() else { return }
copyCell = copyView
@@ -56,7 +56,7 @@ extension TransitionDriver {
moveCellsCurrentIndex(currentIndex, collectionView: collecitionView)
currentCell = cell
cell.hidden = true
cell.isHidden = true
configurateCell(copyView, backImage: backImage)
backImageView = addImageToView(copyView.backContainerView, image: backImage)
@@ -67,23 +67,24 @@ extension TransitionDriver {
// corner animation
copyView.backContainerView.animationCornerRadius(0, duration: duration)
copyView.frontContainerView.animationCornerRadius(0, duration: duration)
copyView.center = view.center
// constraints animation
UIView.animateWithDuration(duration, delay: 0, options: .CurveEaseInOut, animations: {
UIView.animate(withDuration: duration, delay: 0, options: UIViewAnimationOptions(), animations: {
self.view.layoutIfNeeded()
self.backImageView?.alpha = 1
self.copyCell?.shadowView?.alpha = 0
copyView.frontContainerView.subviewsForEach { if $0.tag == Constants.HideKey { $0.alpha = 0 } }
}, completion: { success in
let data = NSKeyedArchiver.archivedDataWithRootObject(copyView.frontContainerView)
guard case let headerView as UIView = NSKeyedUnarchiver.unarchiveObjectWithData(data) else {
let data = NSKeyedArchiver.archivedData(withRootObject: copyView.frontContainerView)
guard case let headerView as UIView = NSKeyedUnarchiver.unarchiveObject(with: data) else {
fatalError("must copy")
}
completion(headerView)
})
}
func popTransitionAnimationContantOffset(offset: CGFloat, backImage: UIImage?) {
func popTransitionAnimationContantOffset(_ offset: CGFloat, backImage: UIImage?) {
guard let copyCell = self.copyCell else {
return
}
@@ -99,7 +100,7 @@ extension TransitionDriver {
copyCell.backContainerView.animationCornerRadius(copyCell.backContainerView.layer.cornerRadius, duration: duration)
copyCell.frontContainerView.animationCornerRadius(copyCell.frontContainerView.layer.cornerRadius, duration: duration)
UIView.animateWithDuration(duration, delay: 0, options: .CurveEaseInOut, animations: {
UIView.animate(withDuration: duration, delay: 0, options: UIViewAnimationOptions(), animations: {
self.rightCell?.center.x -= self.step
self.leftCell?.center.x += self.step
@@ -109,7 +110,7 @@ extension TransitionDriver {
copyCell.frontContainerView.subviewsForEach { if $0.tag == Constants.HideKey { $0.alpha = 1 } }
}, completion: { success in
self.currentCell?.hidden = false
self.currentCell?.isHidden = false
self.removeCurrentCell()
})
}
@@ -119,31 +120,35 @@ extension TransitionDriver {
extension TransitionDriver {
private func removeCurrentCell() {
fileprivate func removeCurrentCell() {
if case let currentCell as UIView = self.copyCell {
currentCell.removeFromSuperview()
}
}
private func configurateCell(cell: BasePageCollectionCell, backImage: UIImage?) {
fileprivate func configurateCell(_ cell: BasePageCollectionCell, backImage: UIImage?) {
cell.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(cell)
// add constraints
[(NSLayoutAttribute.Width, cell.bounds.size.width), (NSLayoutAttribute.Height, cell.bounds.size.height)].forEach { info in
[(NSLayoutAttribute.width, cell.bounds.size.width), (NSLayoutAttribute.height, cell.bounds.size.height)].forEach { info in
cell >>>- {
$0.attribute = info.0
$0.constant = info.1
return
}
}
[NSLayoutAttribute.CenterX, .CenterY].forEach { attribute in
(view, cell) >>>- { $0.attribute = attribute }
[NSLayoutAttribute.centerX, .centerY].forEach { attribute in
(view, cell) >>>- {
$0.attribute = attribute
return
}
}
cell.layoutIfNeeded()
}
private func addImageToView(view: UIView, image: UIImage?) -> UIImageView? {
fileprivate func addImageToView(_ view: UIView, image: UIImage?) -> UIImageView? {
guard let image = image else { return nil }
let imageView = Init(UIImageView(image: image)) {
@@ -153,30 +158,33 @@ extension TransitionDriver {
view.addSubview(imageView)
// add constraints
[NSLayoutAttribute.Left, .Right, .Top, .Bottom].forEach { attribute in
(view, imageView) >>>- { $0.attribute = attribute }
[NSLayoutAttribute.left, .right, .top, .bottom].forEach { attribute in
(view, imageView) >>>- {
$0.attribute = attribute
return
}
}
imageView.layoutIfNeeded()
return imageView
}
private func moveCellsCurrentIndex(currentIndex: Int, collectionView: UICollectionView) {
fileprivate func moveCellsCurrentIndex(_ currentIndex: Int, collectionView: UICollectionView) {
self.leftCell = nil
self.rightCell = nil
if let leftCell = collectionView.cellForItemAtIndexPath(NSIndexPath(forRow: currentIndex - 1, inSection: 0)) {
if let leftCell = collectionView.cellForItem(at: IndexPath(row: currentIndex - 1, section: 0)) {
let step = leftCell.frame.size.width + (leftCell.frame.origin.x - collectionView.contentOffset.x)
UIView.animateWithDuration(0.2, animations: {
UIView.animate(withDuration: 0.2, animations: {
leftCell.center.x -= step
})
self.leftCell = leftCell
self.step = step
}
if let rightCell = collectionView.cellForItemAtIndexPath(NSIndexPath(forRow: currentIndex + 1, inSection: 0)) {
if let rightCell = collectionView.cellForItem(at: IndexPath(row: currentIndex + 1, section: 0)) {
let step = collectionView.frame.size.width - (rightCell.frame.origin.x - collectionView.contentOffset.x)
UIView.animateWithDuration(0.2, animations: {
UIView.animate(withDuration: 0.2, animations: {
rightCell.center.x += step
})
self.rightCell = rightCell
@@ -189,14 +197,14 @@ extension TransitionDriver {
extension TransitionDriver {
private func openFrontViewConfigureConstraints(cell: BasePageCollectionCell, height: CGFloat, insets: CGFloat) {
fileprivate func openFrontViewConfigureConstraints(_ cell: BasePageCollectionCell, height: CGFloat, insets: CGFloat) {
if let heightConstraint = cell.frontContainerView.getConstraint(.Height) {
if let heightConstraint = cell.frontContainerView.getConstraint(.height) {
frontViewFrame.size.height = heightConstraint.constant
heightConstraint.constant = height
}
if let widthConstraint = cell.frontContainerView.getConstraint(.Width) {
if let widthConstraint = cell.frontContainerView.getConstraint(.width) {
frontViewFrame.size.width = widthConstraint.constant
widthConstraint.constant = view.bounds.size.width
}
@@ -205,14 +213,14 @@ extension TransitionDriver {
cell.frontConstraintY.constant = -view.bounds.size.height / 2 + height / 2 + insets
}
private func openBackViewConfigureConstraints(cell: BasePageCollectionCell, height: CGFloat, insets: CGFloat) {
fileprivate func openBackViewConfigureConstraints(_ cell: BasePageCollectionCell, height: CGFloat, insets: CGFloat) {
if let heightConstraint = cell.backContainerView.getConstraint(.Height) {
if let heightConstraint = cell.backContainerView.getConstraint(.height) {
backViewFrame.size.height = heightConstraint.constant
heightConstraint.constant = view.bounds.size.height - height
}
if let widthConstraint = cell.backContainerView.getConstraint(.Width) {
if let widthConstraint = cell.backContainerView.getConstraint(.width) {
backViewFrame.size.width = widthConstraint.constant
widthConstraint.constant = view.bounds.size.width
}
@@ -221,36 +229,36 @@ extension TransitionDriver {
cell.backConstraintY.constant = view.bounds.size.height / 2 - (view.bounds.size.height - 236) / 2 + insets
}
private func closeBackViewConfigurationConstraints(cell: BasePageCollectionCell?) {
fileprivate func closeBackViewConfigurationConstraints(_ cell: BasePageCollectionCell?) {
guard let cell = cell else { return }
let heightConstraint = cell.backContainerView.getConstraint(.Height)
let heightConstraint = cell.backContainerView.getConstraint(.height)
heightConstraint?.constant = backViewFrame.size.height
let widthConstraint = cell.backContainerView.getConstraint(.Width)
let widthConstraint = cell.backContainerView.getConstraint(.width)
widthConstraint?.constant = backViewFrame.size.width
cell.backConstraintY.constant = backViewFrame.origin.y
}
private func closeFrontViewConfigurationConstraints(cell: BasePageCollectionCell?) {
fileprivate func closeFrontViewConfigurationConstraints(_ cell: BasePageCollectionCell?) {
guard let cell = cell else { return }
if let heightConstraint = cell.frontContainerView.getConstraint(.Height) {
if let heightConstraint = cell.frontContainerView.getConstraint(.height) {
heightConstraint.constant = frontViewFrame.size.height
}
if let widthConstraint = cell.frontContainerView.getConstraint(.Width) {
if let widthConstraint = cell.frontContainerView.getConstraint(.width) {
widthConstraint.constant = frontViewFrame.size.width
}
cell.frontConstraintY.constant = frontViewFrame.origin.y
}
private func configureCellBeforeClose(cell: BasePageCollectionCell, offset: CGFloat) {
fileprivate func configureCellBeforeClose(_ cell: BasePageCollectionCell, offset: CGFloat) {
cell.frontConstraintY.constant -= offset
cell.backConstraintY.constant -= offset / 2.0
if let heightConstraint = cell.backContainerView.getConstraint(.Height) {
if let heightConstraint = cell.backContainerView.getConstraint(.height) {
heightConstraint.constant += offset
}
cell.contentView.layoutIfNeeded()
+2 -3
View File
@@ -1,12 +1,11 @@
Pod::Spec.new do |s|
s.name = 'expanding-collection'
s.version = '0.3.0'
s.version = '1.1.0'
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'
s.requires_arc = true
end