swift - iOS10后的自定义导航条按钮的偏移距离问题

导航控制器是我们常用的控制器,在iOS10之前我们自定义的导航按钮在添加时会有为20个像素的间隙问题,通常的解决方式是创建一个类型为fixed..Space的item加入导航按钮组去解决间隙过大问题,但是但是在iOS10之后此方法就不在实用了!

如图:

之前的解决方式如下

lazy var leftButton:UIButton = {
        let button:UIButton = UIButton.init(frame: CGRect(x: 0, y: 0, width: 45, height: 45))
        button.setImage(UIImage(named: "left"), for: .normal)
//        /*向左进行偏移*/
        button.contentEdgeInsets = UIEdgeInsets(top: 0, left: -40, bottom: 0, right: 0)
        button.addTarget(self, action: #selector(actionLeft), for: .touchUpInside)
        return button
    }()

override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = UIColor.white

        let leftItem:UIBarButtonItem = UIBarButtonItem.init(customView: self.leftButton)
        let spaceItem:UIBarButtonItem = UIBarButtonItem.init(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
        spaceItem.width = -20
        self.navigationItem.leftBarButtonItems = [spaceItem,leftItem]
}

此方法在iOS10之后是无法使用的,为此解决的方法是为button设置一下内容偏移

lazy var leftButton:UIButton = {
        let button:UIButton = UIButton.init(frame: CGRect(x: 0, y: 0, width: 45, height: 45))
        button.setImage(UIImage(named: "left"), for: .normal)
//        /*向左进行偏移*/
        button.contentEdgeInsets = UIEdgeInsets(top: 0, left: -40, bottom: 0, right: 0)
        button.addTarget(self, action: #selector(actionLeft), for: .touchUpInside)
        return button
    }()

此方法会造成响应区域问题。可以通过为button类添加分类

#import <UIKit/UIKit.h>

@interface UIButton (EnlargeTouchArea)
- (void)setEnlargeEdgeWithTop:(CGFloat) top right:(CGFloat) right bottom:(CGFloat) bottom left:(CGFloat) left;
- (void)setEnlargeEdge:(CGFloat) size;
@end
#import "UIButton+EnlargeTouchArea.h"
#import <objc/runtime.h>
static char topNameKey;
static char rightNameKey;
static char bottomNameKey;
static char leftNameKey;
@implementation UIButton (EnlargeTouchArea)
- (void)setEnlargeEdgeWithTop:(CGFloat) top right:(CGFloat) right bottom:(CGFloat) bottom left:(CGFloat) left {
    objc_setAssociatedObject(self, &topNameKey, [NSNumber numberWithFloat:top], OBJC_ASSOCIATION_COPY_NONATOMIC);
    objc_setAssociatedObject(self, &rightNameKey, [NSNumber numberWithFloat:right], OBJC_ASSOCIATION_COPY_NONATOMIC);
    objc_setAssociatedObject(self, &bottomNameKey, [NSNumber numberWithFloat:bottom], OBJC_ASSOCIATION_COPY_NONATOMIC);
    objc_setAssociatedObject(self, &leftNameKey, [NSNumber numberWithFloat:left], OBJC_ASSOCIATION_COPY_NONATOMIC);
}

- (void)setEnlargeEdge:(CGFloat) size {
    objc_setAssociatedObject(self, &topNameKey, [NSNumber numberWithFloat:size], OBJC_ASSOCIATION_COPY_NONATOMIC);
    objc_setAssociatedObject(self, &rightNameKey, [NSNumber numberWithFloat:size], OBJC_ASSOCIATION_COPY_NONATOMIC);
    objc_setAssociatedObject(self, &bottomNameKey, [NSNumber numberWithFloat:size], OBJC_ASSOCIATION_COPY_NONATOMIC);
    objc_setAssociatedObject(self, &leftNameKey, [NSNumber numberWithFloat:size], OBJC_ASSOCIATION_COPY_NONATOMIC);

}
- (CGRect) enlargedRect
{
    NSNumber* topEdge = objc_getAssociatedObject(self, &topNameKey);
    NSNumber* rightEdge = objc_getAssociatedObject(self, &rightNameKey);
    NSNumber* bottomEdge = objc_getAssociatedObject(self, &bottomNameKey);
    NSNumber* leftEdge = objc_getAssociatedObject(self, &leftNameKey);
    if (topEdge && rightEdge && bottomEdge && leftEdge)
    {
        return CGRectMake(self.bounds.origin.x - leftEdge.floatValue,
                          self.bounds.origin.y - topEdge.floatValue,
                          self.bounds.size.width + leftEdge.floatValue + rightEdge.floatValue,
                          self.bounds.size.height + topEdge.floatValue + bottomEdge.floatValue);
    }
    else
    {
        return self.bounds;
    }
}

- (UIView*) hitTest:(CGPoint) point withEvent:(UIEvent*) event
{
    CGRect rect = [self enlargedRect];
    if (CGRectEqualToRect(rect, self.bounds))
    {
        return [super hitTest:point withEvent:event];
    }
    return CGRectContainsPoint(rect, point) ? self : nil;
}

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent*)event
{
    CGRect bounds =CGRectMake(0, 0, self.bounds.size.width, self.bounds.size.height);
    //宽高希望扩展的范围
    CGFloat widthDelta =self.bounds.size.width;
    CGFloat heightDelta =20;
    bounds =CGRectInset(bounds, -0.5*widthDelta, -0.5* heightDelta);//注意这里是负数,扩大了之前的bounds的范围
    return CGRectContainsPoint(bounds, point);
}

使用代码如下

/*根据方向进行扩展*/
self.leftButton.setEnlargeEdgeWithTop(20, right: 20, bottom: 20, left: 20)
// 全部扩展20个像素
self.leftButton.setEnlargeEdge(20)

结果图如下

猜你喜欢

转载自blog.csdn.net/die_word/article/details/81085827