美文网首页
IOS 一行代码扩大视图点击区域

IOS 一行代码扩大视图点击区域

作者: 大强哥 | 来源:发表于2018-05-25 23:33 被阅读61次
    self.button.touchExtendInset = UIEdgeInsetsMake(-10, -10, -10, -10)  
    

    实现代码如下:

    void Swizzle(Class c, SEL orig, SEL new) {  
      Method origMethod = class_getInstanceMethod(c, orig);
      Method newMethod = class_getInstanceMethod(c, new);
      if (class_addMethod(c, orig, method_getImplementation(newMethod), method_getTypeEncoding(newMethod))){
        class_replaceMethod(c, new, method_getImplementation(origMethod), method_getTypeEncoding(origMethod));
      } else {
        method_exchangeImplementations(origMethod, newMethod);
      }
    }
    
    @implementation UIView (ExtendTouchRect)
    
    + (void)load {
      Swizzle(self, @selector(pointInside:withEvent:), @selector(myPointInside:withEvent:));
    }
    
    - (BOOL)myPointInside:(CGPoint)point withEvent:(UIEvent *)event {
      if (UIEdgeInsetsEqualToEdgeInsets(self.touchExtendInset, UIEdgeInsetsZero) || self.hidden ||
          ([self isKindOfClass:UIControl.class] && !((UIControl *)self).enabled)) {
        return [self myPointInside:point withEvent:event]; // original implementation
      }
      CGRect hitFrame = UIEdgeInsetsInsetRect(self.bounds, self.touchExtendInset);
      hitFrame.size.width = MAX(hitFrame.size.width, 0); // don't allow negative sizes
      hitFrame.size.height = MAX(hitFrame.size.height, 0);
      return CGRectContainsPoint(hitFrame, point);
    }
    
    static char touchExtendInsetKey;  
    - (void)setTouchExtendInset:(UIEdgeInsets)touchExtendInset {
      objc_setAssociatedObject(self, &touchExtendInsetKey, [NSValue valueWithUIEdgeInsets:touchExtendInset],
                               OBJC_ASSOCIATION_RETAIN);
    }
    
    - (UIEdgeInsets)touchExtendInset {
      return [objc_getAssociatedObject(self, &touchExtendInsetKey) UIEdgeInsetsValue];
    }
    
    @end
    

    相关文章

      网友评论

          本文标题:IOS 一行代码扩大视图点击区域

          本文链接:https://www.haomeiwen.com/subject/lzdpjftx.html