ASNavigationController.m 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. //
  2. // ASNavigationController.m
  3. // AsyncDisplayKit
  4. //
  5. // Created by Garrett Moon on 4/27/16.
  6. //
  7. // Copyright (c) 2014-present, Facebook, Inc. All rights reserved.
  8. // This source code is licensed under the BSD-style license found in the
  9. // LICENSE file in the root directory of this source tree. An additional grant
  10. // of patent rights can be found in the PATENTS file in the same directory.
  11. //
  12. #import "ASNavigationController.h"
  13. @implementation ASNavigationController
  14. {
  15. BOOL _parentManagesVisibilityDepth;
  16. NSInteger _visibilityDepth;
  17. }
  18. ASVisibilityDidMoveToParentViewController;
  19. ASVisibilityViewWillAppear;
  20. ASVisibilityViewDidDisappearImplementation;
  21. ASVisibilitySetVisibilityDepth;
  22. ASVisibilityDepthImplementation;
  23. - (void)visibilityDepthDidChange
  24. {
  25. for (UIViewController *viewController in self.viewControllers) {
  26. if ([viewController conformsToProtocol:@protocol(ASVisibilityDepth)]) {
  27. [(id <ASVisibilityDepth>)viewController visibilityDepthDidChange];
  28. }
  29. }
  30. }
  31. - (NSInteger)visibilityDepthOfChildViewController:(UIViewController *)childViewController
  32. {
  33. NSUInteger viewControllerIndex = [self.viewControllers indexOfObjectIdenticalTo:childViewController];
  34. if (viewControllerIndex == NSNotFound) {
  35. //If childViewController is not actually a child, return NSNotFound which is also a really large number.
  36. return NSNotFound;
  37. }
  38. if (viewControllerIndex == self.viewControllers.count - 1) {
  39. //view controller is at the top, just return our own visibility depth.
  40. return [self visibilityDepth];
  41. } else if (viewControllerIndex == 0) {
  42. //view controller is the root view controller. Can be accessed by holding the back button.
  43. return [self visibilityDepth] + 1;
  44. }
  45. return [self visibilityDepth] + self.viewControllers.count - 1 - viewControllerIndex;
  46. }
  47. #pragma mark - UIKit overrides
  48. - (NSArray *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated
  49. {
  50. NSArray *viewControllers = [super popToViewController:viewController animated:animated];
  51. [self visibilityDepthDidChange];
  52. return viewControllers;
  53. }
  54. - (NSArray *)popToRootViewControllerAnimated:(BOOL)animated
  55. {
  56. NSArray *viewControllers = [super popToRootViewControllerAnimated:animated];
  57. [self visibilityDepthDidChange];
  58. return viewControllers;
  59. }
  60. - (void)setViewControllers:(NSArray *)viewControllers
  61. {
  62. [super setViewControllers:viewControllers];
  63. [self visibilityDepthDidChange];
  64. }
  65. - (void)setViewControllers:(NSArray *)viewControllers animated:(BOOL)animated
  66. {
  67. [super setViewControllers:viewControllers animated:animated];
  68. [self visibilityDepthDidChange];
  69. }
  70. - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
  71. {
  72. [super pushViewController:viewController animated:animated];
  73. [self visibilityDepthDidChange];
  74. }
  75. - (UIViewController *)popViewControllerAnimated:(BOOL)animated
  76. {
  77. UIViewController *viewController = [super popViewControllerAnimated:animated];
  78. [self visibilityDepthDidChange];
  79. return viewController;
  80. }
  81. @end