RATableView.m 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. //
  2. // RATableView.m
  3. // Pods
  4. //
  5. // Created by Rafal Augustyniak on 15/11/15.
  6. //
  7. //
  8. #import "RATableView.h"
  9. #import <objc/runtime.h>
  10. @interface RATableView () <UITableViewDelegate>
  11. @end
  12. @implementation RATableView
  13. - (instancetype)initWithFrame:(CGRect)frame style:(UITableViewStyle)style
  14. {
  15. self = [super initWithFrame:frame style:style];
  16. if (self) {
  17. [self commonInit];
  18. }
  19. return self;
  20. }
  21. - (instancetype)initWithCoder:(NSCoder *)aDecoder
  22. {
  23. self = [super initWithCoder:aDecoder];
  24. if (self) {
  25. [self commonInit];
  26. }
  27. return self;
  28. }
  29. - (void)commonInit
  30. {
  31. [super setDelegate:self];
  32. }
  33. - (void)setTableViewDelegate:(id<UITableViewDelegate>)tableViewDelegate
  34. {
  35. if (_tableViewDelegate == tableViewDelegate) {
  36. return;
  37. }
  38. [super setDelegate:nil];
  39. _tableViewDelegate = tableViewDelegate;
  40. [super setDelegate:self];
  41. }
  42. - (void)setDelegate:(id<UITableViewDelegate>)delegate
  43. {
  44. if (self.scrollViewDelegate == delegate) {
  45. return;
  46. }
  47. [super setDelegate:nil];
  48. self.scrollViewDelegate = delegate;
  49. [super setDelegate:self];
  50. }
  51. - (BOOL)respondsToSelector:(SEL)aSelector
  52. {
  53. return [super respondsToSelector:aSelector]
  54. || (SelectorBelongsToProtocol(@protocol(UIScrollViewDelegate), aSelector) && [self.scrollViewDelegate respondsToSelector:aSelector])
  55. || (SelectorBelongsToProtocol(@protocol(UITableViewDelegate), aSelector) && [self.tableViewDelegate respondsToSelector:aSelector]);
  56. }
  57. - (id)forwardingTargetForSelector:(SEL)aSelector
  58. {
  59. if (SelectorBelongsToProtocol(@protocol(UIScrollViewDelegate), aSelector)) {
  60. return self.scrollViewDelegate;
  61. } else if (SelectorBelongsToProtocol(@protocol(UITableViewDelegate), aSelector)) {
  62. return self.tableViewDelegate;
  63. } else {
  64. return nil;
  65. }
  66. }
  67. #pragma mark - ScrollView delegate
  68. - (void)scrollViewDidScroll:(UIScrollView *)scrollView
  69. {
  70. if ([self.scrollViewDelegate respondsToSelector:@selector(scrollViewDidScroll:)]) {
  71. [self.scrollViewDelegate scrollViewDidScroll:scrollView];
  72. }
  73. }
  74. - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
  75. {
  76. if ([self.scrollViewDelegate respondsToSelector:@selector(scrollViewWillBeginDragging:)]) {
  77. [self.scrollViewDelegate scrollViewWillBeginDragging:scrollView];
  78. }
  79. }
  80. - (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset
  81. {
  82. if ([self.scrollViewDelegate respondsToSelector:@selector(scrollViewWillEndDragging:withVelocity:targetContentOffset:)]) {
  83. [self.scrollViewDelegate scrollViewWillEndDragging:scrollView withVelocity:velocity targetContentOffset:targetContentOffset];
  84. }
  85. }
  86. - (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView
  87. {
  88. if ([self.scrollViewDelegate respondsToSelector:@selector(scrollViewShouldScrollToTop:)]) {
  89. return [self.scrollViewDelegate scrollViewShouldScrollToTop:scrollView];
  90. }
  91. return YES;
  92. }
  93. - (void)scrollViewDidScrollToTop:(UIScrollView *)scrollView
  94. {
  95. if ([self.scrollViewDelegate respondsToSelector:@selector(scrollViewDidScroll:)]) {
  96. [self.scrollViewDelegate scrollViewDidScroll:scrollView];
  97. }
  98. }
  99. - (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView
  100. {
  101. if ([self.scrollViewDelegate respondsToSelector:@selector(scrollViewWillBeginDecelerating:)]) {
  102. [self.scrollViewDelegate scrollViewWillBeginDecelerating:scrollView];
  103. }
  104. }
  105. - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
  106. {
  107. if ([self.scrollViewDelegate respondsToSelector:@selector(scrollViewDidEndDecelerating:)]) {
  108. [self.scrollViewDelegate scrollViewDidEndDecelerating:scrollView];
  109. }
  110. }
  111. - (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
  112. {
  113. if ([self.scrollViewDelegate respondsToSelector:@selector(viewForZoomingInScrollView:)]) {
  114. return [self.scrollViewDelegate viewForZoomingInScrollView:scrollView];
  115. }
  116. return nil;
  117. }
  118. - (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view
  119. {
  120. if ([self.scrollViewDelegate respondsToSelector:@selector(scrollViewWillBeginZooming:withView:)]) {
  121. [self.scrollViewDelegate scrollViewWillBeginZooming:scrollView withView:view];
  122. }
  123. }
  124. - (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(CGFloat)scale
  125. {
  126. if ([self.scrollViewDelegate respondsToSelector:@selector(scrollViewDidEndZooming:withView:atScale:)]) {
  127. [self.scrollViewDelegate scrollViewDidEndZooming:scrollView withView:view atScale:scale];
  128. }
  129. }
  130. - (void)scrollViewDidZoom:(UIScrollView *)scrollView
  131. {
  132. if ([self.scrollViewDelegate respondsToSelector:@selector(scrollViewDidZoom:)]) {
  133. [self.scrollViewDelegate scrollViewDidZoom:scrollView];
  134. }
  135. }
  136. - (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView
  137. {
  138. if ([self.scrollViewDelegate respondsToSelector:@selector(scrollViewDidEndScrollingAnimation:)]) {
  139. [self.scrollViewDelegate scrollViewDidEndScrollingAnimation:scrollView];
  140. }
  141. }
  142. #pragma mark -
  143. static BOOL SelectorBelongsToProtocol(Protocol *protocol, SEL selector)
  144. {
  145. struct objc_method_description methodDescription = protocol_getMethodDescription(protocol, selector, NO, YES);
  146. return NULL != methodDescription.name;
  147. }
  148. @end