EARestrictedScrollView.m 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. //
  2. // EARestrictedScrollView.m
  3. //
  4. // Copyright (c) 2015-2016 Evgeny Aleksandrov. License: MIT.
  5. #import "EARestrictedScrollView.h"
  6. @interface EARestrictedScrollView ()
  7. @property(nonatomic, strong) UIView *containerView;
  8. @end
  9. @implementation EARestrictedScrollView
  10. #pragma mark - Subviews override
  11. - (void)addSubview:(UIView *)view {
  12. if([self.subviews count] < 3 && [self checkIfScrollIndicator:view]) {
  13. [super addSubview:view];
  14. } else {
  15. [self.containerView addSubview:view];
  16. }
  17. }
  18. - (void)insertSubview:(UIView *)view aboveSubview:(UIView *)siblingSubview {
  19. [self.containerView insertSubview:view aboveSubview:siblingSubview];
  20. }
  21. - (void)insertSubview:(UIView *)view atIndex:(NSInteger)index {
  22. [self.containerView insertSubview:view atIndex:index];
  23. }
  24. - (void)insertSubview:(UIView *)view belowSubview:(UIView *)siblingSubview {
  25. [self.containerView insertSubview:view belowSubview:siblingSubview];
  26. }
  27. - (void)bringSubviewToFront:(UIView *)view {
  28. if(view.superview == self) {
  29. [super bringSubviewToFront:view];
  30. } else {
  31. [self.containerView bringSubviewToFront:view];
  32. }
  33. }
  34. - (void)sendSubviewToBack:(UIView *)view {
  35. if(view.superview == self) {
  36. [super sendSubviewToBack:view];
  37. } else {
  38. [self.containerView sendSubviewToBack:view];
  39. }
  40. }
  41. - (UIView *)viewWithTag:(NSInteger)tag {
  42. return [self.containerView viewWithTag:tag];
  43. }
  44. - (NSArray *)containedSubviews {
  45. return self.containerView.subviews;
  46. }
  47. #pragma mark - Private checks
  48. - (BOOL)checkIfScrollIndicator:(UIView *)view {
  49. return ((self.showsHorizontalScrollIndicator && view.frame.size.height == 2.5f) || (self.showsVerticalScrollIndicator && view.frame.size.width == 2.5f)) && [view isKindOfClass:[UIImageView class]];
  50. }
  51. #pragma mark - Lazy properties
  52. - (UIView *)containerView {
  53. if(!_containerView || ![_containerView superview]) {
  54. _containerView = [[UIView alloc] init];
  55. [super addSubview:_containerView];
  56. }
  57. return _containerView;
  58. }
  59. #pragma mark - Custom offset getters and setters
  60. - (CGPoint)alignedContentOffset {
  61. CGPoint originalOffset = [super contentOffset];
  62. CGPoint newOffset = CGPointMake(originalOffset.x + self.restrictionArea.origin.x, originalOffset.y + self.restrictionArea.origin.y);
  63. return newOffset;
  64. }
  65. - (void)setAlignedContentOffset:(CGPoint)contentOffset {
  66. CGPoint newOffset = CGPointMake(contentOffset.x - self.restrictionArea.origin.x, contentOffset.y - self.restrictionArea.origin.y);
  67. [super setContentOffset:newOffset];
  68. }
  69. - (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated {
  70. CGPoint newOffset = CGPointMake(contentOffset.x - self.restrictionArea.origin.x, contentOffset.y - self.restrictionArea.origin.y);
  71. [super setContentOffset:newOffset animated:animated];
  72. }
  73. - (void)setContentSize:(CGSize)contentSize {
  74. [self.containerView setFrame:CGRectMake(self.containerView.frame.origin.x, self.containerView.frame.origin.y, contentSize.width, contentSize.height)];
  75. [self setRestrictionArea:CGRectMake(self.restrictionArea.origin.x, self.restrictionArea.origin.y, contentSize.width, contentSize.height)];
  76. }
  77. - (void)setRestrictionArea:(CGRect)restrictionArea {
  78. _restrictionArea = restrictionArea;
  79. if(CGRectEqualToRect(restrictionArea, CGRectZero)) {
  80. [super setContentOffset:CGPointMake([super contentOffset].x - self.containerView.frame.origin.x, [super contentOffset].y - self.containerView.frame.origin.y)];
  81. [self.containerView setFrame:CGRectMake(0.f, 0.f, self.containerView.frame.size.width, self.containerView.frame.size.height)];
  82. [super setContentSize:self.containerView.frame.size];
  83. } else {
  84. [self.containerView setFrame:CGRectMake(-restrictionArea.origin.x, -restrictionArea.origin.y, self.containerView.frame.size.width, self.containerView.frame.size.height)];
  85. [super setContentOffset:CGPointMake([super contentOffset].x - restrictionArea.origin.x, [super contentOffset].y - restrictionArea.origin.y)];
  86. [super setContentSize:restrictionArea.size];
  87. }
  88. }
  89. @end