UIControl+HitRect.m 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. //
  2. // UIControl+HitRect.m
  3. // FornoWorld
  4. //
  5. // Created by RD on 2021/9/8.
  6. //
  7. #import "UIControl+HitRect.h"
  8. #import <objc/runtime.h>
  9. static const char * kHitEdgeInsets = "hitEdgeInsets";
  10. static const char * kHitScale = "hitScale";
  11. static const char * kHitWidthScale = "hitWidthScale";
  12. static const char * kHitHeightScale = "hitHeightScale";
  13. @implementation UIControl (HitRect)
  14. #pragma mark - set Method
  15. -(void)setHitEdgeInsets:(UIEdgeInsets)hitEdgeInsets{
  16. NSValue *value = [NSValue value:&hitEdgeInsets withObjCType:@encode(UIEdgeInsets)];
  17. objc_setAssociatedObject(self,kHitEdgeInsets, value, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  18. }
  19. -(void)setHitScale:(CGFloat)hitScale{
  20. CGFloat width = self.bounds.size.width * hitScale;
  21. CGFloat height = self.bounds.size.height * hitScale;
  22. self.hitEdgeInsets = UIEdgeInsetsMake(-height, -width,-height, -width);
  23. objc_setAssociatedObject(self, kHitScale, @(hitScale), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  24. }
  25. -(void)setHitWidthScale:(CGFloat)hitWidthScale{
  26. CGFloat width = self.bounds.size.width * hitWidthScale;
  27. CGFloat height = self.bounds.size.height ;
  28. self.hitEdgeInsets = UIEdgeInsetsMake(-height, -width,-height, -width);
  29. objc_setAssociatedObject(self, kHitWidthScale, @(hitWidthScale), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  30. }
  31. -(void)setHitHeightScale:(CGFloat)hitHeightScale{
  32. CGFloat width = self.bounds.size.width;
  33. CGFloat height = self.bounds.size.height * hitHeightScale ;
  34. self.hitEdgeInsets = UIEdgeInsetsMake(-height, -width,-height, -width);
  35. objc_setAssociatedObject(self, kHitHeightScale, @(hitHeightScale), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  36. }
  37. #pragma mark - get Method
  38. -(UIEdgeInsets)hitEdgeInsets{
  39. NSValue *value = objc_getAssociatedObject(self, kHitEdgeInsets);
  40. UIEdgeInsets edgeInsets;
  41. [value getValue:&edgeInsets];
  42. return value ? edgeInsets:UIEdgeInsetsZero;
  43. }
  44. -(CGFloat)hitScale{
  45. return [objc_getAssociatedObject(self, kHitScale) floatValue];
  46. }
  47. -(CGFloat)hitWidthScale{
  48. return [objc_getAssociatedObject(self, kHitWidthScale) floatValue];
  49. }
  50. -(CGFloat)hitHeightScale{
  51. return [objc_getAssociatedObject(self, kHitHeightScale) floatValue];
  52. }
  53. #pragma mark - override super method
  54. -(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event{
  55. //如果 button 边界值无变化 失效 隐藏 或者透明 直接返回
  56. if(UIEdgeInsetsEqualToEdgeInsets(self.hitEdgeInsets, UIEdgeInsetsZero) || !self.enabled || self.hidden || self.alpha == 0 ) {
  57. return [super pointInside:point withEvent:event];
  58. }else{
  59. CGRect relativeFrame = self.bounds;
  60. CGRect hitFrame = UIEdgeInsetsInsetRect(relativeFrame, self.hitEdgeInsets);
  61. return CGRectContainsPoint(hitFrame, point);
  62. }
  63. }
  64. @end