From 3e1b979a03c35007a0964b50ac67e26e3513caeb Mon Sep 17 00:00:00 2001 From: saiedkia Date: Fri, 17 May 2019 21:47:26 +0430 Subject: [PATCH 1/4] migrated to swift 4.2 --- NavigationStackDemo.xcodeproj/project.pbxproj | 5 +- .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../UserInterfaceState.xcuserstate | Bin 0 -> 32121 bytes NavigationStackDemo/AppDelegate.swift | 6 +- .../Base.lproj/Main.storyboard | 366 ++++++++---------- .../FifthViewController.swift | 2 +- .../FirstTableViewController.swift | 9 +- .../SecondViewController.swift | 11 +- .../ThirdViewController.swift | 12 +- .../Cell/CollectionViewStackCell.swift | 14 +- .../CollectionStackViewController.swift | 76 ++-- .../CollectionViewStackFlowLayout.swift | 24 +- Source/NavigationStack.swift | 174 ++++----- 13 files changed, 349 insertions(+), 358 deletions(-) create mode 100644 NavigationStackDemo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 NavigationStackDemo.xcodeproj/project.xcworkspace/xcuserdata/hoseinmotlagh.xcuserdatad/UserInterfaceState.xcuserstate diff --git a/NavigationStackDemo.xcodeproj/project.pbxproj b/NavigationStackDemo.xcodeproj/project.pbxproj index fc6121e..ebb53ed 100755 --- a/NavigationStackDemo.xcodeproj/project.pbxproj +++ b/NavigationStackDemo.xcodeproj/project.pbxproj @@ -267,7 +267,6 @@ TargetAttributes = { 8444B0EB1C80238500B53B4E = { CreatedOnToolsVersion = 7.2.1; - DevelopmentTeam = 34MUF9YXTA; }; 8444B0FF1C80238500B53B4E = { CreatedOnToolsVersion = 7.2.1; @@ -423,6 +422,7 @@ ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.2; }; name = Debug; }; @@ -459,6 +459,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 9.2; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; + SWIFT_VERSION = 4.2; VALIDATE_PRODUCT = YES; }; name = Release; @@ -468,6 +469,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_IDENTITY = "iPhone Developer"; + DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = NavigationStackDemo/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; @@ -481,6 +483,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_IDENTITY = "iPhone Developer"; + DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = NavigationStackDemo/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; diff --git a/NavigationStackDemo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/NavigationStackDemo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/NavigationStackDemo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/NavigationStackDemo.xcodeproj/project.xcworkspace/xcuserdata/hoseinmotlagh.xcuserdatad/UserInterfaceState.xcuserstate b/NavigationStackDemo.xcodeproj/project.xcworkspace/xcuserdata/hoseinmotlagh.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..d19aa5a6e76bfc037d062daf6431ac1ef396b97a GIT binary patch literal 32121 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 Bool { // Override point for customization after application launch. - UIApplication.sharedApplication().statusBarStyle = .LightContent + UIApplication.shared.statusBarStyle = .lightContent UINavigationBar.appearance().titleTextAttributes = [ - NSForegroundColorAttributeName : UIColor.whiteColor(), - NSFontAttributeName : UIFont(name: "OpenSans-Semibold", size: 16)! + NSAttributedString.Key.foregroundColor : UIColor.white, + NSAttributedString.Key.font : UIFont(name: "OpenSans-Semibold", size: 16)! ] return true diff --git a/NavigationStackDemo/Base.lproj/Main.storyboard b/NavigationStackDemo/Base.lproj/Main.storyboard index 5e76211..e2105e1 100755 --- a/NavigationStackDemo/Base.lproj/Main.storyboard +++ b/NavigationStackDemo/Base.lproj/Main.storyboard @@ -1,85 +1,59 @@ - - + + + + + - - + + - + OpenSans-Light - OpenSans-Light - OpenSans-Light - OpenSans-Light - OpenSans-Light - OpenSans-Light - OpenSans-Light - OpenSans-Light - OpenSans-Light - OpenSans-Light - OpenSans-Light - OpenSans-Light - OpenSans-Light - OpenSans-Light - OpenSans-Light - - - OpenSans - OpenSans - OpenSans - OpenSans + + OpenSans - OpenSans - OpenSans - OpenSans - OpenSans - OpenSans - OpenSans - OpenSans - OpenSans - OpenSans - OpenSans - OpenSans - + - - + + - - + + - + - + - + - + @@ -97,30 +71,30 @@ - + - + - + - + @@ -138,30 +112,30 @@ - + - + - + - + @@ -179,30 +153,30 @@ - + - + - + - + @@ -220,30 +194,30 @@ - + - + - + - + @@ -292,48 +266,48 @@ - - + + - + - + - + - + - + @@ -348,37 +322,37 @@ - + - + - + @@ -393,37 +367,37 @@ - + - + - + @@ -438,37 +412,37 @@ - + - + - + @@ -493,7 +467,7 @@ - + @@ -508,30 +482,30 @@ - - + + - - + + - + - + - + - + - + @@ -540,7 +514,7 @@ @@ -565,15 +539,15 @@ - + @@ -603,10 +577,10 @@ USA - + - + @@ -617,16 +591,16 @@ USA @@ -645,10 +619,10 @@ USA - + - + @@ -659,16 +633,16 @@ USA @@ -687,10 +661,10 @@ USA - + - + @@ -703,14 +677,14 @@ USA @@ -738,7 +712,7 @@ USA - + @@ -761,13 +735,13 @@ USA - + - + @@ -785,20 +759,20 @@ USA - + - - + + - + - + @@ -809,20 +783,20 @@ USA @@ -841,10 +815,10 @@ The only moment, the only life we have is in the NOW. What happened a few moment - + - + @@ -864,13 +838,13 @@ The only moment, the only life we have is in the NOW. What happened a few moment @@ -899,7 +873,7 @@ The only moment, the only life we have is in the NOW. What happened a few moment - + @@ -909,7 +883,7 @@ The only moment, the only life we have is in the NOW. What happened a few moment - + @@ -924,40 +898,40 @@ The only moment, the only life we have is in the NOW. What happened a few moment - - + + - - + + - + - + - + - + @@ -982,14 +956,14 @@ USA - + - + @@ -1019,10 +993,10 @@ USA - + - + @@ -1033,16 +1007,16 @@ USA @@ -1061,10 +1035,10 @@ USA - + - + @@ -1075,16 +1049,16 @@ USA @@ -1112,7 +1086,7 @@ USA - + @@ -1120,7 +1094,7 @@ USA - + @@ -1135,26 +1109,26 @@ USA - + - - - - - - - + + + + + + + - - - - - - - - + + + + + + + + diff --git a/NavigationStackDemo/ViewControllers/FifthViewController/FifthViewController.swift b/NavigationStackDemo/ViewControllers/FifthViewController/FifthViewController.swift index 42632cb..24d35e5 100755 --- a/NavigationStackDemo/ViewControllers/FifthViewController/FifthViewController.swift +++ b/NavigationStackDemo/ViewControllers/FifthViewController/FifthViewController.swift @@ -11,6 +11,6 @@ import UIKit class FifthViewController: UITableViewController { @IBAction func backHandler(sender: AnyObject) { - navigationController?.popViewControllerAnimated(true) + navigationController?.popViewController(animated: true) } } diff --git a/NavigationStackDemo/ViewControllers/FirstViewController/FirstTableViewController.swift b/NavigationStackDemo/ViewControllers/FirstViewController/FirstTableViewController.swift index 9220ffc..c434edb 100755 --- a/NavigationStackDemo/ViewControllers/FirstViewController/FirstTableViewController.swift +++ b/NavigationStackDemo/ViewControllers/FirstViewController/FirstTableViewController.swift @@ -21,7 +21,7 @@ class FirstTableViewController: UITableViewController { navigationItem.titleView = search } - override func viewWillAppear(animated: Bool) { + override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) if let navigationController = navigationController { @@ -29,10 +29,9 @@ class FirstTableViewController: UITableViewController { } } - override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { - performSegueWithIdentifier("push", sender: nil) - } - + override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + performSegue(withIdentifier: "push", sender: nil) + } } // MARK: UIGestureRecognizerDelegate diff --git a/NavigationStackDemo/ViewControllers/SecondViewController/SecondViewController.swift b/NavigationStackDemo/ViewControllers/SecondViewController/SecondViewController.swift index 0e33c82..92a88b3 100755 --- a/NavigationStackDemo/ViewControllers/SecondViewController/SecondViewController.swift +++ b/NavigationStackDemo/ViewControllers/SecondViewController/SecondViewController.swift @@ -10,7 +10,7 @@ import UIKit class SecondViewController: UITableViewController { - override func viewWillAppear(animated: Bool) { + override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) // if let navigationController = navigationController { @@ -22,11 +22,12 @@ class SecondViewController: UITableViewController { @IBAction func backHandler(sender: AnyObject) { - navigationController?.popViewControllerAnimated(true) + navigationController?.popViewController(animated: true) } - override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { - performSegueWithIdentifier("push", sender: nil) - } + override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + performSegue(withIdentifier: "push", sender: nil) + } + } diff --git a/NavigationStackDemo/ViewControllers/ThirdViewController/ThirdViewController.swift b/NavigationStackDemo/ViewControllers/ThirdViewController/ThirdViewController.swift index 6347b34..c0f8dc2 100755 --- a/NavigationStackDemo/ViewControllers/ThirdViewController/ThirdViewController.swift +++ b/NavigationStackDemo/ViewControllers/ThirdViewController/ThirdViewController.swift @@ -10,19 +10,19 @@ import UIKit class ThirdViewController: UITableViewController { - @IBInspectable var navbarColor: UIColor = .blackColor() + @IBInspectable var navbarColor: UIColor = .black - override func viewWillAppear(animated: Bool) { + override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) } @IBAction func backHandler(sender: AnyObject) { - navigationController?.popViewControllerAnimated(true) + navigationController?.popViewController(animated: true) } - override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { - performSegueWithIdentifier("push", sender: nil) - } + override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + performSegue(withIdentifier: "push", sender: nil) + } } diff --git a/Source/CollectionView/Cell/CollectionViewStackCell.swift b/Source/CollectionView/Cell/CollectionViewStackCell.swift index 14abe30..b051c08 100755 --- a/Source/CollectionView/Cell/CollectionViewStackCell.swift +++ b/Source/CollectionView/Cell/CollectionViewStackCell.swift @@ -58,19 +58,19 @@ extension CollectionViewStackCell { contentView.addSubview(imageView) contentView.addConstraints([ - createConstraint(imageView, toItem: contentView, attribute: .Top), - createConstraint(imageView, toItem: contentView, attribute: .Bottom), - createConstraint(imageView, toItem: contentView, attribute: .Left), - createConstraint(imageView, toItem: contentView, attribute: .Right), + createConstraint(imageView, toItem: contentView, attribute: .top), + createConstraint(imageView, toItem: contentView, attribute: .bottom), + createConstraint(imageView, toItem: contentView, attribute: .left), + createConstraint(imageView, toItem: contentView, attribute: .right), ]) return imageView } - private func createConstraint(item: UIImageView, toItem: UIView, attribute: NSLayoutAttribute) -> NSLayoutConstraint { + private func createConstraint(_ item: UIImageView, toItem: UIView, attribute: NSLayoutConstraint.Attribute) -> NSLayoutConstraint { return NSLayoutConstraint(item: item, attribute: attribute, - relatedBy: .Equal, + relatedBy: .equal, toItem: toItem, attribute: attribute, multiplier: 1, @@ -82,7 +82,7 @@ extension CollectionViewStackCell { layer.shadowOpacity = 0.30; layer.shadowRadius = 10.0; layer.shadowOffset = CGSize.zero; - layer.shadowPath = UIBezierPath(rect: bounds).CGPath + layer.shadowPath = UIBezierPath(rect: bounds).cgPath layer.shouldRasterize = true; } diff --git a/Source/CollectionView/CollectionStackViewController.swift b/Source/CollectionView/CollectionStackViewController.swift index 13438ea..36c389e 100755 --- a/Source/CollectionView/CollectionStackViewController.swift +++ b/Source/CollectionView/CollectionStackViewController.swift @@ -28,7 +28,7 @@ import UIKit // MARK: CollectionStackViewController protocol CollectionStackViewControllerDelegate: class { - func controllerDidSelected(index index: Int) + func controllerDidSelected(index: Int) } @@ -55,7 +55,7 @@ class CollectionStackViewController: UICollectionViewController { if let collectionView = self.collectionView { collectionView.backgroundColor = bgColor - collectionView.decelerationRate = decelerationRate + collectionView.decelerationRate = UIScrollView.DecelerationRate(rawValue: decelerationRate) } } @@ -65,17 +65,17 @@ class CollectionStackViewController: UICollectionViewController { override func viewDidLoad() { configureCollectionView() - scrolltoIndex(screens.count - 1, animated: false, position: .Left) // move to end + collectionView.scrollToItem(at: IndexPath(item: (screens.count - 1), section: 0), at: .left, animated: true)// move to end } - override func viewDidAppear(animated: Bool) { + override func viewDidAppear(_ animated: Bool) { guard let collectionViewLayout = self.collectionViewLayout as? CollectionViewStackFlowLayout else { fatalError("wrong collection layout") } collectionViewLayout.openAnimating = true - scrolltoIndex(0, animated: true, position: .Left) // open animation + collectionView.scrollToItem(at: IndexPath(item: 0, section: 0), at: .left, animated: true) // open animation } } @@ -88,9 +88,9 @@ extension CollectionStackViewController { fatalError("wrong collection layout") } - collectionViewLayout.scrollDirection = .Horizontal + collectionViewLayout.scrollDirection = .horizontal collectionView?.showsHorizontalScrollIndicator = false - collectionView?.registerClass(CollectionViewStackCell.self, forCellWithReuseIdentifier: String(CollectionViewStackCell)) + collectionView?.register(CollectionViewStackCell.self, forCellWithReuseIdentifier: "CollectionViewStackCell") } } @@ -99,38 +99,44 @@ extension CollectionStackViewController { extension CollectionStackViewController { - override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return screens.count } - override func collectionView(collectionView: UICollectionView, - willDisplayCell cell: UICollectionViewCell, - forItemAtIndexPath indexPath: NSIndexPath) { +// override func collectionView(collectionView: UICollectionView, +// willDisplayCell cell: UICollectionViewCell, +// forItemAtIndexPath indexPath: NSIndexPath) { +// +// +// } +// } - if let cell = cell as? CollectionViewStackCell { - cell.imageView?.image = screens[indexPath.row] + + override func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) { + if let cell = cell as? CollectionViewStackCell { + cell.imageView?.image = screens[indexPath.row] + } + } + + override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionViewStackCell", + for: indexPath) + return cell } - } - - override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { - let cell = collectionView.dequeueReusableCellWithReuseIdentifier(String(CollectionViewStackCell), - forIndexPath: indexPath) - return cell - } - override func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) { + override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { delegate?.controllerDidSelected(index: indexPath.row) - guard let currentCell = collectionView.cellForItemAtIndexPath(indexPath) else { + guard let currentCell = collectionView.cellForItem(at: indexPath as IndexPath) else { return } // move cells - UIView.animateWithDuration(0.3, delay: 0, options:.CurveEaseIn, + UIView.animate(withDuration: 0.3, delay: 0, options:.curveEaseIn, animations: { () -> Void in - for cell in self.collectionView!.visibleCells() where cell != currentCell { - let row = self.collectionView?.indexPathForCell(cell)?.row - let xPosition = row < indexPath.row ? cell.center.x - self.view.bounds.size.width * 2 + for cell in self.collectionView!.visibleCells where cell != currentCell { + let row = self.collectionView?.indexPath(for: cell)?.row + let xPosition = row! < indexPath.row ? cell.center.x - self.view.bounds.size.width * 2 : cell.center.x + self.view.bounds.size.width * 2 cell.center = CGPoint(x: xPosition, y: cell.center.y) @@ -138,22 +144,22 @@ extension CollectionStackViewController { }, completion: nil) // move to center current cell - UIView.animateWithDuration(0.2, delay: 0.2, options:.CurveEaseOut, + UIView.animate(withDuration: 0.2, delay: 0.2, options:.curveEaseOut, animations: { () -> Void in let offset = collectionView.contentOffset.x - (self.view.bounds.size.width - collectionView.bounds.size.width * CGFloat(self.overlay)) * CGFloat(indexPath.row) currentCell.center = CGPoint(x: (currentCell.center.x + offset), y: currentCell.center.y) }, completion: nil) // scale current cell - UIView.animateWithDuration(0.2, delay: 0.6, options:.CurveEaseOut, animations: { () -> Void in - let scale = CGAffineTransformMakeScale(1, 1) + UIView.animate(withDuration: 0.2, delay: 0.6, options:.curveEaseOut, animations: { () -> Void in + let scale = CGAffineTransform(scaleX: 1, y: 1) currentCell.transform = scale currentCell.alpha = 1 }) { (success) -> Void in - dispatch_async(dispatch_get_main_queue(), { () -> Void in - self.dismissViewControllerAnimated(false, completion: nil) - }) + DispatchQueue.main.async { + self.dismiss(animated: false, completion: nil) + } } } } @@ -176,8 +182,8 @@ extension CollectionStackViewController: UICollectionViewDelegateFlowLayout { extension CollectionStackViewController { - private func scrolltoIndex(index: Int, animated: Bool , position: UICollectionViewScrollPosition) { - let indexPath = NSIndexPath(forItem: index, inSection: 0) - collectionView?.scrollToItemAtIndexPath(indexPath, atScrollPosition: position, animated: animated) + private func scrolltoIndex(index: Int, animated: Bool , position: UICollectionView.ScrollPosition) { + let indexPath = NSIndexPath(item: index, section: 0) + collectionView?.scrollToItem(at: indexPath as IndexPath, at: position, animated: animated) } } diff --git a/Source/CollectionView/FlowLayout/CollectionViewStackFlowLayout.swift b/Source/CollectionView/FlowLayout/CollectionViewStackFlowLayout.swift index cb5131e..741fcdc 100755 --- a/Source/CollectionView/FlowLayout/CollectionViewStackFlowLayout.swift +++ b/Source/CollectionView/FlowLayout/CollectionViewStackFlowLayout.swift @@ -56,18 +56,18 @@ class CollectionViewStackFlowLayout: UICollectionViewFlowLayout { extension CollectionViewStackFlowLayout { - override func layoutAttributesForElementsInRect(rect: CGRect) -> [UICollectionViewLayoutAttributes]? { - let items = NSArray (array: super.layoutAttributesForElementsInRect(rect)!, copyItems: true) + override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? { + let items = NSArray (array: super.layoutAttributesForElements(in: rect)!, copyItems: true) var headerAttributes: UICollectionViewLayoutAttributes? - items.enumerateObjectsUsingBlock { (object, idex, stop) -> Void in + items.enumerateObjects { (object, idex, stop) -> Void in let attributes = object as! UICollectionViewLayoutAttributes - if attributes.representedElementKind == UICollectionElementKindSectionHeader { + if attributes.representedElementKind == UICollectionView.elementKindSectionHeader { headerAttributes = attributes } else { - self.updateCellAttributes(attributes, headerAttributes: headerAttributes) + self.updateCellAttributes(attributes: attributes, headerAttributes: headerAttributes) } } return items as? [UICollectionViewLayoutAttributes] @@ -84,10 +84,10 @@ extension CollectionViewStackFlowLayout { // set contentOffset range let contentOffsetX = min(max(0, collectionView.contentOffset.x), allWidth) - let scale = transformScale(attributes, allWidth: allWidth, offset: contentOffsetX) - let move = transformMove(attributes, itemWidth: itemWidth, offset: contentOffsetX) - attributes.transform = CGAffineTransformConcat(scale, move) - attributes.alpha = calculateAlpha(attributes, itemWidth: itemWidth, offset: contentOffsetX) + let scale = transformScale(attributes: attributes, allWidth: allWidth, offset: contentOffsetX) + let move = transformMove(attributes: attributes, itemWidth: itemWidth, offset: contentOffsetX) + attributes.transform = scale.concatenating(move) + attributes.alpha = calculateAlpha(attributes: attributes, itemWidth: itemWidth, offset: contentOffsetX) if additionScale > 0 && openAnimating { additionScale -= 0.02 @@ -96,7 +96,7 @@ extension CollectionViewStackFlowLayout { attributes.zIndex = attributes.indexPath.row } - override func shouldInvalidateLayoutForBoundsChange(newBounds: CGRect) -> Bool { + override func shouldInvalidateLayout(forBoundsChange newBounds: CGRect) -> Bool { return true } } @@ -116,7 +116,7 @@ extension CollectionViewStackFlowLayout { var currentScale = (maximum + minimum) - (minimum + offset / (allWidth / (maximum - minimum))) currentScale = max(min(maximum, currentScale), minimum) - return CGAffineTransformMakeScale(currentScale, currentScale) + return CGAffineTransform(scaleX: currentScale, y: currentScale) } private func transformMove(attributes: UICollectionViewLayoutAttributes, @@ -131,7 +131,7 @@ extension CollectionViewStackFlowLayout { } dx = currentContentOffsetX - dx - return CGAffineTransformMakeTranslation(dx, 0) + return CGAffineTransform(translationX: dx, y: 0) } private func calculateAlpha(attributes: UICollectionViewLayoutAttributes, itemWidth: CGFloat, offset: CGFloat) -> CGFloat { diff --git a/Source/NavigationStack.swift b/Source/NavigationStack.swift index 5319951..a4ca3c2 100755 --- a/Source/NavigationStack.swift +++ b/Source/NavigationStack.swift @@ -28,119 +28,119 @@ import UIKit // MARK: NavigationStack public class NavigationStack: UINavigationController { - - @IBInspectable var overlay: Float = 0.8 - @IBInspectable var scaleRatio: Float = 14.0 - @IBInspectable var scaleValue: Float = 0.99 - @IBInspectable var decelerationRate: CGFloat = UIScrollViewDecelerationRateNormal - - @IBInspectable var bgColor: UIColor = .blackColor() - - private var screens = [UIImage]() - - weak public var stackDelegate: UINavigationControllerDelegate? // use this instead delegate - - public required init?(coder aDecoder: NSCoder) { - super.init(coder: aDecoder) - delegate = self - } + @IBInspectable var overlay: Float = 0.8 + @IBInspectable var scaleRatio: Float = 14.0 + @IBInspectable var scaleValue: Float = 0.99 + @IBInspectable var decelerationRate: CGFloat = UIScrollView.DecelerationRate.normal.rawValue + + @IBInspectable var bgColor: UIColor = .black + + private var screens = [UIImage]() + + weak public var stackDelegate: UINavigationControllerDelegate? // use this instead delegate + + public required init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + + delegate = self + } } // MARK: pulbic methods extension NavigationStack { - public func showControllers() { - if screens.count == 0 { - return - } - - var allScreens = screens - allScreens.append(view.takeScreenshot()) - let collectioView = CollectionStackViewController(images: allScreens, - delegate: self, - overlay: overlay, - scaleRatio: scaleRatio, - scaleValue: scaleValue, - bgColor: bgColor, - decelerationRate: decelerationRate) + public func showControllers() { + if screens.count == 0 { + return + } + + var allScreens = screens + allScreens.append(view.takeScreenshot()) + let collectioView = CollectionStackViewController(images: allScreens, + delegate: self, + overlay: overlay, + scaleRatio: scaleRatio, + scaleValue: scaleValue, + bgColor: bgColor, + decelerationRate: decelerationRate) - presentViewController(collectioView, animated: false, completion: nil) - } + present(collectioView, animated: false, completion: nil) + } } // MARK: Additional helpers extension NavigationStack { - - private func popToIndex(index: Int, animated: Bool) { - let viewController = viewControllers[index] - popToViewController(viewController, animated: animated) - } + + private func popToIndex(index: Int, animated: Bool) { + let viewController = viewControllers[index] + popToViewController(viewController, animated: animated) + } } // MARK: UINavigationControllerDelegate extension NavigationStack: UINavigationControllerDelegate { - - public func navigationController(navigationController: UINavigationController, - willShowViewController viewController: UIViewController, - animated: Bool) { - - stackDelegate?.navigationController?(navigationController, willShowViewController: viewController, animated: animated) - - if navigationController.viewControllers.count > screens.count + 1 { - screens.append(view.takeScreenshot()) - } else - if navigationController.viewControllers.count == screens.count && screens.count > 0 { - screens.removeLast() - } - } - - public func navigationController(navigationController: UINavigationController, didShowViewController viewController: UIViewController, animated: Bool) { - stackDelegate?.navigationController?(navigationController, didShowViewController: viewController, animated: animated) - } - -// ??? -// public func navigationControllerSupportedInterfaceOrientations(navigationController: UINavigationController) -> UIInterfaceOrientationMask { -// return stackDelegate?.navigationControllerSupportedInterfaceOrientations?(navigationController) -// } - -// ??? -// optional public func navigationControllerPreferredInterfaceOrientationForPresentation(navigationController: UINavigationController) -> UIInterfaceOrientation -// - - public func navigationController(navigationController: UINavigationController, interactionControllerForAnimationController animationController: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning? { - return stackDelegate?.navigationController?(navigationController, interactionControllerForAnimationController: animationController) - } - - public func navigationController(navigationController: UINavigationController, animationControllerForOperation operation: UINavigationControllerOperation, fromViewController fromVC: UIViewController, toViewController toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? { - return stackDelegate?.navigationController?(navigationController, animationControllerForOperation: operation, fromViewController: fromVC, toViewController: toVC) - } - + + public func navigationController(_ navigationController: UINavigationController, + willShow viewController: UIViewController, + animated: Bool) { + stackDelegate?.navigationController?(navigationController, willShow: viewController, animated: animated) + // stackDelegate?.navigationController?(navigationController, willShowViewController: viewController, animated: animated) + + if navigationController.viewControllers.count > screens.count + 1 { + screens.append(view.takeScreenshot()) + } else + if navigationController.viewControllers.count == screens.count && screens.count > 0 { + screens.removeLast() + } + } + + public func navigationController(_ navigationController: UINavigationController, didShow viewController: UIViewController, animated: Bool) { + stackDelegate?.navigationController?(navigationController, didShow: navigationController, animated: animated) + } + + // ??? + // public func navigationControllerSupportedInterfaceOrientations(navigationController: UINavigationController) -> UIInterfaceOrientationMask { + // return stackDelegate?.navigationControllerSupportedInterfaceOrientations?(navigationController) + // } + + // ??? + // optional public func navigationControllerPreferredInterfaceOrientationForPresentation(navigationController: UINavigationController) -> UIInterfaceOrientation + // + +// public func navigationController(navigationController: UINavigationController, interactionControllerForAnimationController animationController: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning? { +// return stackDelegate?.intersa +// } + + public func navigationController(_ navigationController: UINavigationController, animationControllerFor operation: UINavigationController.Operation, from fromVC: UIViewController, to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? { + return stackDelegate?.navigationController?(navigationController, animationControllerFor: operation, from: fromVC, to: toVC) + } + } extension NavigationStack: CollectionStackViewControllerDelegate { - func controllerDidSelected(index index: Int) { - popToIndex(index, animated: false) - screens.removeRange(index.. UIImage { - - UIGraphicsBeginImageContextWithOptions(self.bounds.size, false, UIScreen.mainScreen().scale) - drawViewHierarchyInRect(self.bounds, afterScreenUpdates: true) - - let image = UIGraphicsGetImageFromCurrentImageContext() - UIGraphicsEndImageContext() - return image - } + func takeScreenshot() -> UIImage { + + UIGraphicsBeginImageContextWithOptions(self.bounds.size, false, UIScreen.main.scale) + drawHierarchy(in: self.bounds, afterScreenUpdates: true) + + let image = UIGraphicsGetImageFromCurrentImageContext() + UIGraphicsEndImageContext() + + return image! + } } From 38932d75e5396d41fa1942374a4bd99290181ce0 Mon Sep 17 00:00:00 2001 From: saiedkia Date: Sat, 18 May 2019 15:11:06 +0430 Subject: [PATCH 2/4] update ios,xcode min version --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 91ea5ac..f29fa90 100755 --- a/README.md +++ b/README.md @@ -14,8 +14,9 @@ The [iPhone mockup](https://store.ramotion.com/product/iphone-6-mockups?utm_sour ## Requirements -- iOS 9.0+ -- Xcode 7.2 +- iOS 10.0+ +- Xcode 10 +- swift 4.2 ## Installation From d4ff709da614abc8a7f2f8af5ae3e2a1475b2b22 Mon Sep 17 00:00:00 2001 From: saiedkia Date: Sat, 18 May 2019 22:53:06 +0430 Subject: [PATCH 3/4] bugfix: crash on back button press --- .../UserInterfaceState.xcuserstate | Bin 32121 -> 44838 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 87 ++++++++ NavigationStackDemo/AppDelegate.swift | 14 +- .../Base.lproj/Main.storyboard | 18 +- .../FirstTableViewController.swift | 2 +- .../NavigationStackDemoTests.swift | 2 +- .../CollectionViewStackFlowLayout.swift | 189 +++++++++--------- Source/NavigationStack.swift | 5 +- 8 files changed, 200 insertions(+), 117 deletions(-) create mode 100644 NavigationStackDemo.xcodeproj/xcuserdata/hoseinmotlagh.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist diff --git a/NavigationStackDemo.xcodeproj/project.xcworkspace/xcuserdata/hoseinmotlagh.xcuserdatad/UserInterfaceState.xcuserstate b/NavigationStackDemo.xcodeproj/project.xcworkspace/xcuserdata/hoseinmotlagh.xcuserdatad/UserInterfaceState.xcuserstate index d19aa5a6e76bfc037d062daf6431ac1ef396b97a..1d6a61ac3ed55f2917d1901727df463cb2e089d4 100644 GIT binary patch delta 23134 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 delta 14232 zcmaKy2V7Iv`|$5McL8C9KnM^5Xc)l+WF+jp!b(`dt%!<>ECt*n=eSpg#yaX`sC8BA z)@rr3TI;G?Yt>q3-K*Mat-j|HvG(6zU-{f??s?Amp7A{AInTW-F2ffu!N*dDzsujV zbPNfkouP47T9`SXDxi8$J*i$)Db<@AObwyxsCue_8cGeL#!zFa3DiXDL+T^yV`>&P zpZb(qNHtQ+sTI^(Y9qCe`iAiWRL<ez378A!fyH16*bKIStzaA24t9W@;7hOz z>;~U}Z^0pO7@PrT!8vdqTm%omL+}VZ22X(bDfkUM1J5CZG-MzPIcNu+p#-`>IrM@G z=nLDyK&XNtFdRleEsTcoFaf5)beILRVGb;S#jrE%0{g*o*dGpn17QOk3Wvera0DC; zF&q!4!Vlm)I3G5_X1EG|4!6S{a3}m0?uQ59Au~J)FT$(vS9lLTg1^CM@CAHLLz<)Q zXh&K?tLPxQ1FfbtbTA!4cceq7rHCmjqXnOp!?8$>3(zr zJ(M0s52r`aBk57}XnG7iiJnYPp{LT*=;`zf`Xl;ddM^Dby^vlPBjdz~8D~bqxG=7alyPHZj637OcrtRvi%~G%j1S|> zv}4*cO2&`zX9Ac&M#Y3M9T^=H$D}ZN#=sOaU71p*oT+4nFvFR#%mii{^AYn2vyf>t zGb@>O%qC_BvxnKw9ALg<4l^g1lgvft5_6gPnYqGTXMSUzG0&ObnLn5p%uCjZbzx*dT6P2b1-qO5irvHRWxr@oHS_BeZ< z{gJ)E-ehmFzp}U4JM07Y8T*`l&A#C%&YpAN962XW%(-%M&WlrU-kc8?$f>v>PRB)Z zQCu_^!zFO(Tn3lP8M%C}fa}5a%gjVLmzvkZSe#zb zx1pl8rmSvc7h`dLpFsrHT6!+Eph?JM(?-3BTJny1DGEa&ZGtAMnF?68taV^Uj}F!N zhK|+vjt-9s)A&Y(>Bf$2%eRtR)mDL-T8*@S*RYOS|E}jkmx9}hY@&7wbF`V-LT#nC zkvZCdB2g5IMlocLVpmXKQgPI7%8%MZwL@`aS;dou)kRoxWF&;aZz$_qnO0jpxUQV6 zt=gJSWmQAVOU1Hu%i;ioWpsddoS12A>U-)3DquNvh&oIip^j3=Py$LsNhlemET@iB zCrBfwC_j{nGD#D9as^w`1NTa(i`36e)FtXNN<--=LzsXs99=9Lm7-Xff@{=uGRB6X z4P|6e6qh$Nlaw3Oyb@zEdFT<zbdkW>CPAD6dl#0VFAKSZGzESxaso$wrEz}>>3+g5HC(1?n zs1Ow)(<$mT^@b7w3IG7RW%nzuX{hL5QC?S)O_uHml!pw+*f}iRx4NvNMr_|Y@qh!o zrMH6*+XQT=dBU&Mwp#3{F9AdaWTcH3b?|EE`ra zK$zHiOaBf&mcDD@%APZzKL*=a!b@W~zf!plfTkwoE-hDHYHJdV*f48r3uj zU1v^tFbvhB1~jypilF?!C?qBee;Bb>KYNFmmB~Y>)_-lqFqrhOVlkxHROCjAjX)vF zf zvWjr7AvzvM*6ez)0ek^AlG>({OGf^7qNC^xIxCnJaq+;~;pydlh7K4|UMKL72_=Zu z&B;*Pue`Llfg>A3SzSNNPP?&w-Ktu5vG>eB_zLV5nD?M*jo@oEoiGoQsw~IEd@|S% zz7s?T(2PcK5Y0rvCIivTw(cAO$A#fK3XXvv&0v3C57D8O4w%7|;eSL#EcH4MoI4L3@&uT&R)c6fTokuH5sebx{!e+DZ#up^TC= zK`C@YEogZYbcY^j1zJh!9qZy51ih(Oq)umt{P#>GY!8*x6X;KB{sOHg=5ZC0Sw66j z>H~wQSIw{kR6`9~gFZ*=|F(&DU?{OzYtcGnEEPMa3?7_Lw(0?84do&A!z=nXh+&&) zo6>5>)P%Opw85Cxqzyunu<<&af{By}Cc$KwLOrq=9A)fAv|rjcDvx>ujWF4=*HvcThBjL3D1=31=O`)4 zYl4N;JnN{Mgi$U*JCLbVEd6`;4GW8m7PjB;ciS)Q3VRV(33h|sVGr07eTjCV-RP?p zSPFZCNZ1GMLHmi(`wj(n$t&;Q(5a$)c-Nwe0RtPl2tT`7ow3#hE^ak~gNaHCl2%<1 z6rpYUDqxM!&LCI`t6(+Si@rwt&^Il_D#gJeL`gf6QTw)4RUa#co2|VV**d3fHH?Ad zh!()H=s+WxP??~1&S|wZ^|e*ynH5zH<#hr^TjmLHlAtnzb%T@9K@@DQaT;}}2~LMI z(D&%@JIe+?gtPx?aLhxSVK>STenQ5>9UT&E)c7v%+bFmIF8*f`QldL4v5btLJ37)@ z!uKB~THuOzL@Uv;Hlo!6(HgiG{eVusBQnGFaMQo)-%RS?ijI@|PoR*l@63xbd5Y>E zEqw|1{HyF&@?%Qd27#@K~$?7{sR^M@W z!qQ!o>-#gJ&^dJVEIb8I6VVxX7M>&GWAFkffIm@2%K?$m{4@Fmoqt~+FTu-i_3<+L z(W;NudATO&<8^og-b5GBPw3+R)W`pi<~?rJyi0=Sm5N=gTX2IVPGw*44;@6U`u7iL z_>y2>pp3+wGNLP_SHB?2%JfFiq2r{N#8MHjjiza)R2*nY5-VqmS)OKvUHk1LV^wFG zr)@0p;y{MBCE6S>4v?OtMU;rPryYoM6Vk7&p)B8-`QG9kVu?!=qw? zwJE7F!KqQvsljPcp(!yDVQJABp(!P$#^TuMf1069k3#}zXj5tN2$!2rkO0hU5_E9@ z?!X7MBXJgg;_3u}P>>6HgFYmh(jR;P7LcgPDzFiJO`;@6!D;Y_1V3D%8?m5aB*0;W zJz;MW+NdKzjfrqB+)d{D6ud?HBB9%n*hDBDL+6nQL>)bjo<%|lJLzxelk{m4JUH(~ zU!Z@YFVdIjpXn>~Rr)%8lfF&grSH)X=tq_x!hOt7(RJ(KInm;t?>x11G7!zQ6YWgR z>qO2P_Mv?V zVtZOi`_cY%09o7*F_dBGiJ=O^Yz%F4FwDcyK(;Cz@gSHEr=y4wq9bT6tpj(_BlH+O zL0ekrXwt`6Iu1R>z?t|f7zo>Mg)Y`|thcvCsmtux#+O2;5hbQm(Ql1(I(klyB!Amw zI-9JXZRlC4c$nqu_%KU;eWt~yf$Km@je_z!8}&#$nkR^i28#t07P(9d9)eZ96hq4Hf}(HU^SLdJYDz z{~V45!f;^VQYtQQ9gn1_4wn8soD1khbPMr2=*9FBdMUk(Zls&&W(=elxM3i}z#Rh* z3_LNAucVjLE9jND}~K82Dh&{+*enzoz&9UrR|JAPegt2EK@Jv?JcdhF)4f`Y3(k zUl~u5jHfYB3K{)KMp0>S98rkhsDSlikGFbpxm7cMA-ZvmXvYnrAGhdViH_W9)sp)} zPae{b=*RRE`l$tUkeV?F!Js1sp%{c=5RO3v23ibs7(`+ag+Vk1F&M;R5QjlL1_>A> zVvr=X_l$l{|4#owzo1{zf6}k$zv$QW8-`*40~wlO7?$A}p0QzU89PSA*fV5`lQBre zAPs|b3^FjtBz5aC$ig5SgB%QUG04NffPoQ%d<+UOD8!%$gJKL!7?fbp34_iUbiqIf zq$Kw~1mZ0xdPmr2m6ugD49u+{p^i8qVbip-dyK_WrnMxNN!y%oCWuj!sbV@{kkZ(C zFbVFSU7uc2-?yr^zP#UCePcqI@c)ymO%lmO|A!==N&F8dy!VviC=%t-30P_)h;*QpYs>hhzjZ>VHYhl!zI} z2oa_K)zCy{@_$ICGc*4~@-Z{}KO}RR`TvrbTb+4k5wql9BCDi{A;#frNsVWFhQB}wLYnR;*>*eGkS_S zM08^+GI~&~ zHIl&mB7j`Qp#Qrw9dm=ZM|KJ3CUcAVmATE_VeVou0E2-TRA4X&gGvmlRxtOO2f~?_ zI8DT?RAYdN<0SkIB#OMfQe`Qutgu|E^tN=U^tZa=%%9Yq^pX->LJwmBqd_StTQX=N?fJ-hPsLx!d+Wxc~ljnBkmXL%1Vjf`p$Hyo;D#^A{Yw1&+YJDPGK&@q6b)xmDz3}u=joRW<<8DnM+e@t_ zxhB*4q_WD>>|1M6lc!Q~s-*-FN|&x zTWkS!zI-!lVoQkg3hEMK*v@Ph>(>8v*|Oc)oXc@-njJv}tY&N2T6Qoygso%i*#>qfxW|(9F$04S zF!%_ASr}L__ymJ_n1pe*Vz6*EJCYs6j%LTOW7%=6nMEvS$78S`W{6hZdh0ttBZc&f=63>h_*|mR0_7sd&j- zN2ca|@m#BTcBy!#)$fb%@xFMWRXnFuyx?u=ILl#=VA*?~BfHF+XKtyu-`gs@Ejwe~ z-iKUn%`)F|B4*YV6YT}Wf(NJu-n-k>`wMe44N=lfx${lqGZ8BAjiz^BgTg%*0K3*B!@jf zB021L>_Oqepap~F);o#jj1lXV$?dJ)qj*HyYC6H5ZjI=$rx3}#iiC97vxu~^8in-g zSKD`JHHk~-mDdbt80hSu&{pUt_KHBOy2xH)FS9>muoi=L7<`Vw`WE&VA?Czh$6$jH zbi!a$8|+;H_8tabw81_UU>}jp3NeLG^BH=y&#|mF|T=w^^WjCD3j8Hyw@M z7UBTM5jqZXG{`d@D2?o2~ z;&D=f$GLGb;lf}y247k41khI;qfEAcJC;6e4f}G+R$8vTK)a97a{dDCH~*$(v)c-F z;5rJl>L5&|+MzbuM1eMm z`ck+sIE;vl+z4wQ@u0T0^jwY=Fk1jTCIIFMfIs{jQ2J$Cp+Zi0kH-~p#hi&F9_I-R zPGV1R3WL)vTxVgjxo#Mou}=2+w|Hd&ULOq3w&9fvc>Q6haA9x`k>x^e1kbIlooa5d z6|Po*`%!?a6W}iV8xDTZR%kdkMt~c^jpRmgqcOOM!6ghXyJPTk3pchE4qB146RmiJ!D9@bSP^@EE+DSQ;C>t8 zMgegXw^_I_c!0q}>zyEGi2anwes33JUR%SvxxH4}Jp%1hfp(uj`x`kW6=r*eea9UU zzz%ZXbBDOY7(B<|cMSf(;6)2}lsm@#z!6LS5`)(myul=d+^Qr!&k0=TF^Mr-L&w}t z0@p?El5k=03WL9_cfvJI9H~rJzU5lk#&wgsZRPrva6uq&-6dQQ60UW*o*f@?&jhZ= z+!O98_Zx-`hAf60hI|Y6ymdlfU=q6)ObfIlRAD7EvnfKw0}^U@OT{yU>fZtFw+Ot5 zcWg!A9RvgsL3kI&4$GHybmct=0Wam7nZs9!z0$zckvz34xw*>;D zpFrS`p`?vKMF{vHl9yZx6-DBLi_P!^4%2<>Sdq zS)LSkZ{!m&VGOb4jtuO~r}DX!HcALpFUsQU+9fUw#1biurzgIo}_{ zAPhTTsBY#5@)i6b3^f>LVHibvZ8N&6h#ySdS-c)Ufgg%tFos$TqcM!fF!|jP zpC7>!Ep6sU@}v0C7=~a-8V_ye$MWNNGlpRphGW?J_CCP!aJ0AO`shAlWwMQR<@BX| z{UPPs_QKuFPvyxe=--unz<($J>M)FK1ym+m%TtBEC8F^ogO%4D&%f}&Vo!RKv#qu5Z9Ut81q>bh+fn|KmY{x{7^{xg0RhGf7Hqy7O!8ay0Jk+XE4lt8|mTCx8*dG0|jw>`HPhB>eTxCXX@2z;%C;gLy7k}gm|5U ziT632trh%B;%Y8v^*@Q{Ij_|PCI06^;*JWhP{^?(w|r!Izm&SZ11pA=*PY<+^AAeM zWHgi`K-o|pRC`KI>8MyLiG0y?gL%TdG?SB&Jvq*}uu}3VlNakvK4#Lhy~t-uqlgPT zj<~Pm$>&Ow$p=gG*ahrDb}_q@e5cgRE+^k9ZDoJwe7Rh%nwv)K^loA#FL6JU4}Y$a zkA7}(x4FCI)1QYt)NzPCFCH^w` zCh#}@IsXU$l7D5x+VD2EHX<7b8z-A^n?jp%n@KjaZI;?J+BDlNw^?bk%4UttcAK3x zyKKI)*=w`U=3AQsHkWLHZK!R&Z7o`M|Mx`p4t5_Vnog& z7m-vX6M2Z_B88}fNFxdng^I#OT2Z7ZT2w5m7EKW~iS~)U6`4*W}*dMe%WPil|mi=E2oP&#lr-QFUutTIn zj64c8*dsajA#q2oTaiZg7$El9f9W9Q_9Ge_l99KAQa@^v$&2fk0HOG67zd62e zf=(i*NT)cb{!X<{2P z^wjB@)9+3%oc?tB%ju06h-on^_7TU5i^N03NIXaUnRu7@y!gJ@{9OFI_=Pic=AC_= zgPc1!Yn(%zqI7?h4Qi)9BCs9j+B^@PUl4wb+BwmszNtPHT-6b`W;gX4x z8IlhqA4z6O=1V>`OBP9%NR~-fNw!LMOZG^GOmHH;jT%psjlg+de>~%T-SP6vY$duCrX1xGr~H z>AK2wjq66&&8}Nrx4Z6iz3KW|>L&G(wwL-z1EdksRB5_2Q<^2sk>*K_(gJCzv`pGp zS}q+Rt&mnqtEIKlG195hX6ZKRDd}VBUv4gLzHUKoYPVpwj&5OYv2O8hiEhbmscz|R zWo}d4*0>!qyPa}7>vrDlg4;E>du|Wh9=Sbn`_1jS+aEF@bCkKrq%xVzOXe-}m9>|t zWKptYS&A%8mMQBl>nSUhmC5?b%4PFp%VaBMt7L0r>tyR?yJTO<_R99j&dScqZpd!Q zZp-e<{*b+ty^_6lcXe;)9_$|F9^)S8p5VUDeXG0qi2DimTkcOilpdiT(H`j@nI2gl zIUdCxT|Ihv4DcA_QRPwNG1Gu^>gnd`?&<02<>~Di@7dLJjOQnwOFWl)HhO;U`Gw~u&#j)@J$HH@ z^Zd#4vgZ}E=QYn8p0_+7c|P;}-SdU#pK=?yliXSEBA3d&P4X7`3i&$udifXf zP4X@BJ@SL{GxCe_%knGotMc3OyYl<;hw{f>X4=c%%frjlOYWuc3h_$w>ghGYYn0a* zuW??;Yk^mj*D9|qUgy28d)@T<)$5MeJq1wE3Rb}@Y!xDft3s|&D0~#{6iP*?B3z+W zL@Lr084A53ThU3;MbS;sLs6$NE3jgMVv=HsVws{z(V|$PSg+Wq*sR#9*rT{@Ry^=_ z_ipE{_s;XK^B(OzL0O-FDHkXgDiH~8E4S@xL#etmy zy9V|TtO%?MtPQLS92z)0aAe@bz>fo02c8JL8~9qqtHM=rsw`Em%BU(-nN*$4s&1+t zssXAx)mYV3l|{8gwMMm8wNABOwOzGebx?I!bxd_abxL(bbyam;bt@=8s7Fv`P)*Q~ zpoXB~L8F4k2BDyjf@TMO5;Q+(VbGGG#-Ns<6+ve^fDWM@N;`bi;j0d})U;Zxc2P^! z?rOPOp$<^1)gkIIb%Z)utyi0~)wybe+NAER?yByg?xh~Do}r$vUaD?XH>;Pc*Q(d6 zzff;hZ&hzo?^Rz^-`03*+G+eWftn7QU`?ndLKCTp(Zp+#G^v^lO_nBCW7HICOq$M` zZknE&-kQFe{+bHS5>2C~MYB?~TC+~GL9Hek3~o#dPWS2sE!yMQ6DihVtB-ah>s&I5pyFJL@bP09I-lLUBrfnO%Yon zwncm!@m<8Bh@%ldM4X5)Uyk@C;(Elbh}#i&BmRi^Gvc)tXlX60m1w0}cdcBj(E4aK z+K$?Atxg-IjnQUmv$c8Jd~Kn&Sle6MSKD7(p{>+bYe#9vYLRw=c9M3Ac8+$Q_EYU* z?NV){_H*qQ+RfT++8x?2wFk9_wa2t4w5POZv{$t^w7+Wanzi?}54EqfZ*)+{>Uf>4 z&Q0f`^V0d~+Ub#Xai8=xDctJc-(hUmuWux_Gm zif)>2hHk!Yp>Bz;QP-?nuG^^FqT8TM|VW`gYKm6jP9K7N8L@`ZQVWHL)~ND z(?}}POh@Ge`G}9uPe!x;lDrbba)&=#kN5qRr9c zqbEgAjh+$xLG;|{Wzo&iKSf`Uejfc-3>V`RBZ<+)B*vt~pqObfGh@DsIUaK=)+N>} z)+e@4Y-Mas?B}uDVt2;AiL;3l#U;k+<8tCq+_bovao@xpiTfemK3*E{9$ymQE50m# zar}yS^Q!pM@t5MSBuEpy6WS$|CJaodOxTdHBVkveNj#N!CGlF~&BWV@cN6a?*(SLqsgpvI z!jiN}QAx2$2}#LGX-OGLSxG&UdMEWw>Yr4RRFza~PO3{9nlvJ5bkf+Q=}9w_K1`aG z+$p(la(VKAr-5Ax)g7Nb^Z+m*$r? zBW-@#r)i7QmZrB)@0cEz9+4iIzBB#1^zYLTryt80lrcO5WlYGJoG~q9X2vHO^D`D^ zEXiohXwKN1VZNDZml>29o~g@>&Wz1W%goEn&n(I;$?THZEwe{vugn3N6`8{_M`w=B zM46K^r({mgoSC^Wb4li!%*~nGGIwU~&fJ^%eddwOW0}V@Pi3CTe4=;P$LqW6`{@Vh z2kEQyL-phISU*8OSwB@jT|ZO5K)*!4Oy8{kOut&cPQTu)|4RS0{+Rxp{(}CJ{)+yZ z{+|A!{)zsX{tx}jELm1UR#_IxnwB*)>!Yk$S)XP#XRXLum9;i&ebyIQo3gfKeU-I0 z>uA==tkYTNvMy#_&iWmyuVvrJzLou3_KWO4vtQ@XIc$zij$MvNj#o}l zPI!(kCpsrCCoxB#larH|W6UYcDb5+3GdE{v&W|})b8h7PnsX=TY0j&hH@P5}$>nlw za_w?uxn8;6x$SZTa#gwN+~C~!+@##R+>+cbx!rSn<(B0RGUrz3*5(e$ZO9##YsuY_ zdnxx-9-C*AC(3ikbIbF|YoF(zr^-|31?P3l3(HH)OUuj1%gQt4<>wXUnezJP_0Ox% z8R1uqM2 z3+)R%3cU)=K85WI{R;yNb%pvuQ(<}Gz{1MHn!+K44TZxCM-`4O{IGCVp{4MX!uf>@ z3zrl&7B&|yFI-=^v+z{mox(Rou0@)njH2#Ei;9|yRu^q4+E?^_(UGDbicS{&Sah-I z=c21c*NbJv;l;VdrsC4#KE>t51B)w*Yl;UKk1d{9Jf(QLx%h+PImPpeKP_HdytMdW z@pDsqliCz+$}*LhdYDR0eN5%1DpReg&NS3C+=NWyO;b&um=>9qnwm_@O>0f-O&d*H zOxsL*P2ZT#n68>`o9>w&nx2?mm|mIQl)w_E#G%BsL{a%! i=jv|NJ*sP}>#Ijv12qs@|K}gRjr@?HK + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/NavigationStackDemo/AppDelegate.swift b/NavigationStackDemo/AppDelegate.swift index f21c684..d446b8a 100755 --- a/NavigationStackDemo/AppDelegate.swift +++ b/NavigationStackDemo/AppDelegate.swift @@ -30,9 +30,9 @@ class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? - func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { + private func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { // Override point for customization after application launch. - UIApplication.shared.statusBarStyle = .lightContent + // UIApplication.shared.statusBarStyle = .lightContent UINavigationBar.appearance().titleTextAttributes = [ NSAttributedString.Key.foregroundColor : UIColor.white, @@ -42,25 +42,25 @@ class AppDelegate: UIResponder, UIApplicationDelegate { return true } - func applicationWillResignActive(application: UIApplication) { + func applicationWillResignActive(_ application: UIApplication) { // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. } - func applicationDidEnterBackground(application: UIApplication) { + func applicationDidEnterBackground(_ application: UIApplication) { // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. } - func applicationWillEnterForeground(application: UIApplication) { + func applicationWillEnterForeground(_ application: UIApplication) { // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. } - func applicationDidBecomeActive(application: UIApplication) { + func applicationDidBecomeActive(_ application: UIApplication) { // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. } - func applicationWillTerminate(application: UIApplication) { + func applicationWillTerminate(_ application: UIApplication) { // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. } diff --git a/NavigationStackDemo/Base.lproj/Main.storyboard b/NavigationStackDemo/Base.lproj/Main.storyboard index e2105e1..87abbee 100755 --- a/NavigationStackDemo/Base.lproj/Main.storyboard +++ b/NavigationStackDemo/Base.lproj/Main.storyboard @@ -469,14 +469,14 @@ - + - + @@ -675,13 +675,13 @@ USA @@ -1088,7 +1088,7 @@ USA - + @@ -1103,7 +1103,7 @@ USA - + diff --git a/NavigationStackDemo/ViewControllers/FirstViewController/FirstTableViewController.swift b/NavigationStackDemo/ViewControllers/FirstViewController/FirstTableViewController.swift index c434edb..715686d 100755 --- a/NavigationStackDemo/ViewControllers/FirstViewController/FirstTableViewController.swift +++ b/NavigationStackDemo/ViewControllers/FirstViewController/FirstTableViewController.swift @@ -37,7 +37,7 @@ class FirstTableViewController: UITableViewController { // MARK: UIGestureRecognizerDelegate extension FirstTableViewController: UIGestureRecognizerDelegate { - func gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer) -> Bool { + func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool { if navigationController?.viewControllers.count == 2 { return true diff --git a/NavigationStackDemoTests/NavigationStackDemoTests.swift b/NavigationStackDemoTests/NavigationStackDemoTests.swift index b7bb2e5..c1cbb46 100755 --- a/NavigationStackDemoTests/NavigationStackDemoTests.swift +++ b/NavigationStackDemoTests/NavigationStackDemoTests.swift @@ -28,7 +28,7 @@ class NavigationStackDemoTests: XCTestCase { func testPerformanceExample() { // This is an example of a performance test case. - self.measureBlock { + self.measure { // Put the code you want to measure the time of here. } } diff --git a/Source/CollectionView/FlowLayout/CollectionViewStackFlowLayout.swift b/Source/CollectionView/FlowLayout/CollectionViewStackFlowLayout.swift index 741fcdc..2a072e2 100755 --- a/Source/CollectionView/FlowLayout/CollectionViewStackFlowLayout.swift +++ b/Source/CollectionView/FlowLayout/CollectionViewStackFlowLayout.swift @@ -28,119 +28,118 @@ import UIKit // MARK: CollectionViewStackFlowLayout class CollectionViewStackFlowLayout: UICollectionViewFlowLayout { - - let itemsCount: Int - let overlay: Float // from 0 to 1 - - let maxScale: Float - let scaleRatio: Float - - var additionScale = 1.0 - var openAnimating = false - - var dxOffset: Float = 0 - - init(itemsCount: Int, overlay: Float, scaleRatio: Float, scale: Float) { - self.itemsCount = itemsCount - self.overlay = overlay - self.scaleRatio = scaleRatio - self.maxScale = scale - super.init() - } - - required init?(coder aDecoder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - + + let itemsCount: Int + let overlay: Float // from 0 to 1 + + let maxScale: Float + let scaleRatio: Float + + var additionScale = 1.0 + var openAnimating = false + + var dxOffset: Float = 0 + + init(itemsCount: Int, overlay: Float, scaleRatio: Float, scale: Float) { + self.itemsCount = itemsCount + self.overlay = overlay + self.scaleRatio = scaleRatio + self.maxScale = scale + super.init() + } + + required init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + } extension CollectionViewStackFlowLayout { - + override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? { let items = NSArray (array: super.layoutAttributesForElements(in: rect)!, copyItems: true) - var headerAttributes: UICollectionViewLayoutAttributes? - + var headerAttributes: UICollectionViewLayoutAttributes? + items.enumerateObjects { (object, idex, stop) -> Void in - let attributes = object as! UICollectionViewLayoutAttributes - + let attributes = object as! UICollectionViewLayoutAttributes + if attributes.representedElementKind == UICollectionView.elementKindSectionHeader { - headerAttributes = attributes - } - else { + headerAttributes = attributes + } else { self.updateCellAttributes(attributes: attributes, headerAttributes: headerAttributes) - } + } + } + return items as? [UICollectionViewLayoutAttributes] } - return items as? [UICollectionViewLayoutAttributes] - } - - func updateCellAttributes(attributes: UICollectionViewLayoutAttributes, headerAttributes: UICollectionViewLayoutAttributes?) { - guard let collectionView = self.collectionView else { - return; + func updateCellAttributes(attributes: UICollectionViewLayoutAttributes, headerAttributes: UICollectionViewLayoutAttributes?) { + + guard let collectionView = self.collectionView else { + return; + } + let itemWidth = collectionView.bounds.size.width - collectionView.bounds.size.width * CGFloat(overlay) + let allWidth = itemWidth * CGFloat(itemsCount - 1) + + // set contentOffset range + let contentOffsetX = min(max(0, collectionView.contentOffset.x), allWidth) + + let scale = transformScale(attributes: attributes, allWidth: allWidth, offset: contentOffsetX) + let move = transformMove(attributes: attributes, itemWidth: itemWidth, offset: contentOffsetX) + attributes.transform = scale.concatenating(move) + attributes.alpha = calculateAlpha(attributes: attributes, itemWidth: itemWidth, offset: contentOffsetX) + + if additionScale > 0 && openAnimating { + additionScale -= 0.02 + additionScale = additionScale < 0 ? 0 : additionScale + } + attributes.zIndex = attributes.indexPath.row } - let itemWidth = collectionView.bounds.size.width - collectionView.bounds.size.width * CGFloat(overlay) - let allWidth = itemWidth * CGFloat(itemsCount - 1) - // set contentOffset range - let contentOffsetX = min(max(0, collectionView.contentOffset.x), allWidth) - - let scale = transformScale(attributes: attributes, allWidth: allWidth, offset: contentOffsetX) - let move = transformMove(attributes: attributes, itemWidth: itemWidth, offset: contentOffsetX) - attributes.transform = scale.concatenating(move) - attributes.alpha = calculateAlpha(attributes: attributes, itemWidth: itemWidth, offset: contentOffsetX) - - if additionScale > 0 && openAnimating { - additionScale -= 0.02 - additionScale = additionScale < 0 ? 0 : additionScale - } - attributes.zIndex = attributes.indexPath.row - } - override func shouldInvalidateLayout(forBoundsChange newBounds: CGRect) -> Bool { - return true - } + return true + } } // MARK: helpers extension CollectionViewStackFlowLayout { - - private func transformScale(attributes: UICollectionViewLayoutAttributes, - allWidth: CGFloat, - offset: CGFloat) -> CGAffineTransform { - var maximum = CGFloat(maxScale) - CGFloat(itemsCount - attributes.indexPath.row) / CGFloat(scaleRatio) - maximum += CGFloat(1.0 - maximum) * CGFloat(additionScale) - - var minimum = CGFloat(maxScale - 0.1) - CGFloat(itemsCount - attributes.indexPath.row) / CGFloat(scaleRatio) - minimum += CGFloat(1.0 - minimum) * CGFloat(additionScale) - - var currentScale = (maximum + minimum) - (minimum + offset / (allWidth / (maximum - minimum))) - currentScale = max(min(maximum, currentScale), minimum) - return CGAffineTransform(scaleX: currentScale, y: currentScale) - } - - private func transformMove(attributes: UICollectionViewLayoutAttributes, - itemWidth: CGFloat, - offset: CGFloat) -> CGAffineTransform { - var currentContentOffsetX = offset - itemWidth * CGFloat(attributes.indexPath.row) - currentContentOffsetX = min(max(currentContentOffsetX, 0),itemWidth) - - var dx = (currentContentOffsetX / itemWidth) - if let collectionView = self.collectionView { - dx *= collectionView.bounds.size.width / 8.0 - } - dx = currentContentOffsetX - dx - - return CGAffineTransform(translationX: dx, y: 0) - } - - private func calculateAlpha(attributes: UICollectionViewLayoutAttributes, itemWidth: CGFloat, offset: CGFloat) -> CGFloat { - var currentContentOffsetX = offset - itemWidth * CGFloat(attributes.indexPath.row) - currentContentOffsetX = min(max(currentContentOffsetX, 0),itemWidth) - let dx = (currentContentOffsetX / itemWidth) + private func transformScale(attributes: UICollectionViewLayoutAttributes, + allWidth: CGFloat, + offset: CGFloat) -> CGAffineTransform { + var maximum = CGFloat(maxScale) - CGFloat(itemsCount - attributes.indexPath.row) / CGFloat(scaleRatio) + maximum += CGFloat(1.0 - maximum) * CGFloat(additionScale) + + var minimum = CGFloat(maxScale - 0.1) - CGFloat(itemsCount - attributes.indexPath.row) / CGFloat(scaleRatio) + minimum += CGFloat(1.0 - minimum) * CGFloat(additionScale) + + var currentScale = (maximum + minimum) - (minimum + offset / (allWidth / (maximum - minimum))) + currentScale = max(min(maximum, currentScale), minimum) + return CGAffineTransform(scaleX: currentScale, y: currentScale) + } + + private func transformMove(attributes: UICollectionViewLayoutAttributes, + itemWidth: CGFloat, + offset: CGFloat) -> CGAffineTransform { + var currentContentOffsetX = offset - itemWidth * CGFloat(attributes.indexPath.row) + currentContentOffsetX = min(max(currentContentOffsetX, 0),itemWidth) + + var dx = (currentContentOffsetX / itemWidth) + if let collectionView = self.collectionView { + dx *= collectionView.bounds.size.width / 8.0 + } + dx = currentContentOffsetX - dx + + return CGAffineTransform(translationX: dx, y: 0) + } + + private func calculateAlpha(attributes: UICollectionViewLayoutAttributes, itemWidth: CGFloat, offset: CGFloat) -> CGFloat { + var currentContentOffsetX = offset - itemWidth * CGFloat(attributes.indexPath.row) + currentContentOffsetX = min(max(currentContentOffsetX, 0),itemWidth) + + let dx = (currentContentOffsetX / itemWidth) + + return 1.0 - dx + } - return 1.0 - dx - } - } diff --git a/Source/NavigationStack.swift b/Source/NavigationStack.swift index a4ca3c2..3643147 100755 --- a/Source/NavigationStack.swift +++ b/Source/NavigationStack.swift @@ -85,11 +85,8 @@ extension NavigationStack { extension NavigationStack: UINavigationControllerDelegate { - public func navigationController(_ navigationController: UINavigationController, - willShow viewController: UIViewController, - animated: Bool) { + public func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) { stackDelegate?.navigationController?(navigationController, willShow: viewController, animated: animated) - // stackDelegate?.navigationController?(navigationController, willShowViewController: viewController, animated: animated) if navigationController.viewControllers.count > screens.count + 1 { screens.append(view.takeScreenshot()) From 73671fc83862650cd416f5ec206aa752378eea7e Mon Sep 17 00:00:00 2001 From: saiedkia Date: Sun, 19 May 2019 13:06:22 +0430 Subject: [PATCH 4/4] bugfix: screenshot doesnt work as expected --- .DS_Store | Bin 0 -> 6148 bytes .../UserInterfaceState.xcuserstate | Bin 44838 -> 44573 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 66 +----------------- .../Cell/CollectionViewStackCell.swift | 4 +- .../CollectionStackViewController.swift | 4 +- Source/NavigationStack.swift | 17 +---- 6 files changed, 7 insertions(+), 84 deletions(-) create mode 100644 .DS_Store diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..7cad1c8425b480d0caaf83631f8ff9c2d622dd4c GIT binary patch literal 6148 zcmeHKO-lqZ41Li(EO^am97Na@~jP z@3@mSHn>NNYwWqF3%t?qv86xYiPqi2uIV=Yez2`cbN0Pz!_8r}l@$#Y3Lx zN_}F8r!$`FxLmO~dOE~rW}Q0o$Kyq8cE*zphh)dl!9XxDX5iS}h2H;{{A4B{`Qw!E zf`MS*pD`e_wriK%RJ~ijY)|jn#I|Bn(Q!o$3hmKP03AI?POa1XliD1YD;7tsqH#+n P#*csz5-J$@1qR*$LLDmG literal 0 HcmV?d00001 diff --git a/NavigationStackDemo.xcodeproj/project.xcworkspace/xcuserdata/hoseinmotlagh.xcuserdatad/UserInterfaceState.xcuserstate b/NavigationStackDemo.xcodeproj/project.xcworkspace/xcuserdata/hoseinmotlagh.xcuserdatad/UserInterfaceState.xcuserstate index 1d6a61ac3ed55f2917d1901727df463cb2e089d4..c08552135693ad81a5385fc60c181f2fbcfcac65 100644 GIT binary patch delta 19664 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 O{;Te-o9?egW&a=Jto)P! diff --git a/NavigationStackDemo.xcodeproj/xcuserdata/hoseinmotlagh.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/NavigationStackDemo.xcodeproj/xcuserdata/hoseinmotlagh.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist index 4544c02..bc8c5c8 100644 --- a/NavigationStackDemo.xcodeproj/xcuserdata/hoseinmotlagh.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ b/NavigationStackDemo.xcodeproj/xcuserdata/hoseinmotlagh.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -3,70 +3,6 @@ type = "1" version = "2.0"> - - - - - - - - - - - - - - - - CGSize { + func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { return view.bounds.size } - func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAtIndex section: NSInteger) -> CGFloat { + func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: NSInteger) -> CGFloat { return -collectionView.bounds.size.width * CGFloat(overlay) } } diff --git a/Source/NavigationStack.swift b/Source/NavigationStack.swift index 3643147..b173249 100755 --- a/Source/NavigationStack.swift +++ b/Source/NavigationStack.swift @@ -100,19 +100,6 @@ extension NavigationStack: UINavigationControllerDelegate { stackDelegate?.navigationController?(navigationController, didShow: navigationController, animated: animated) } - // ??? - // public func navigationControllerSupportedInterfaceOrientations(navigationController: UINavigationController) -> UIInterfaceOrientationMask { - // return stackDelegate?.navigationControllerSupportedInterfaceOrientations?(navigationController) - // } - - // ??? - // optional public func navigationControllerPreferredInterfaceOrientationForPresentation(navigationController: UINavigationController) -> UIInterfaceOrientation - // - -// public func navigationController(navigationController: UINavigationController, interactionControllerForAnimationController animationController: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning? { -// return stackDelegate?.intersa -// } - public func navigationController(_ navigationController: UINavigationController, animationControllerFor operation: UINavigationController.Operation, from fromVC: UIViewController, to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? { return stackDelegate?.navigationController?(navigationController, animationControllerFor: operation, from: fromVC, to: toVC) } @@ -132,8 +119,8 @@ extension UIView { func takeScreenshot() -> UIImage { - UIGraphicsBeginImageContextWithOptions(self.bounds.size, false, UIScreen.main.scale) - drawHierarchy(in: self.bounds, afterScreenUpdates: true) + UIGraphicsBeginImageContextWithOptions(self.bounds.size, true, UIScreen.main.scale) + drawHierarchy(in: self.bounds, afterScreenUpdates: false) let image = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext()