导航控制器是我们常用的控制器,在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)
结果图如下