UIScrollView+NTESDirection.m 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. //
  2. // UIScrollView+NTESDirection.m
  3. // NIM
  4. //
  5. // Created by chris on 16/1/24.
  6. // Copyright © 2016年 Netease. All rights reserved.
  7. //
  8. #import "UIScrollView+NTESDirection.h"
  9. #import <objc/runtime.h>
  10. @interface UIScrollView ()
  11. @property (assign, nonatomic) NTESScrollViewDirection horizontalScrollingDirection;
  12. @property (assign, nonatomic) NTESScrollViewDirection verticalScrollingDirection;
  13. @end
  14. static const char horizontalScrollingDirectionKey;
  15. static const char verticalScrollingDirectionKey;
  16. @implementation UIScrollView (NTESDirection)
  17. - (void)startObservingDirection
  18. {
  19. [self addObserver:self forKeyPath:@"contentOffset" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];
  20. }
  21. - (void)stopObservingDirection
  22. {
  23. [self removeObserver:self forKeyPath:@"contentOffset"];
  24. }
  25. - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
  26. {
  27. if (![keyPath isEqualToString:@"contentOffset"]) return;
  28. CGPoint newContentOffset = [[change valueForKey:NSKeyValueChangeNewKey] CGPointValue];
  29. CGPoint oldContentOffset = [[change valueForKey:NSKeyValueChangeOldKey] CGPointValue];
  30. if (oldContentOffset.x < newContentOffset.x) {
  31. self.horizontalScrollingDirection = NTESScrollViewDirectionRight;
  32. } else if (oldContentOffset.x > newContentOffset.x) {
  33. self.horizontalScrollingDirection = NTESScrollViewDirectionLeft;
  34. } else {
  35. self.horizontalScrollingDirection = NTESScrollViewDirectionNone;
  36. }
  37. if (oldContentOffset.y < newContentOffset.y) {
  38. self.verticalScrollingDirection = NTESScrollViewDirectionDown;
  39. } else if (oldContentOffset.y > newContentOffset.y) {
  40. self.verticalScrollingDirection = NTESScrollViewDirectionUp;
  41. } else {
  42. self.verticalScrollingDirection = NTESScrollViewDirectionNone;
  43. }
  44. }
  45. #pragma mark - Properties
  46. - (NTESScrollViewDirection)horizontalScrollingDirection
  47. {
  48. return [objc_getAssociatedObject(self, (void *)&horizontalScrollingDirectionKey) intValue];
  49. }
  50. - (void)setHorizontalScrollingDirection:(NTESScrollViewDirection)horizontalScrollingDirection
  51. {
  52. objc_setAssociatedObject(self, (void *)&horizontalScrollingDirectionKey, [NSNumber numberWithInt:horizontalScrollingDirection], OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  53. }
  54. - (NTESScrollViewDirection)verticalScrollingDirection
  55. {
  56. return [objc_getAssociatedObject(self, (void *)&verticalScrollingDirectionKey) intValue];
  57. }
  58. - (void)setVerticalScrollingDirection:(NTESScrollViewDirection)verticalScrollingDirection
  59. {
  60. objc_setAssociatedObject(self, (void *)&verticalScrollingDirectionKey, [NSNumber numberWithInt:verticalScrollingDirection], OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  61. }
  62. @end