iOS11 完美解决导航栏按钮偏移问题

iOS11出来以后导航栏自定义按钮会出现偏移问题,如下图:

解决方案: 1.修改偏移量; 2.调整响应范围;

我的导航栏是storyboard 拖UIButton进去的, 所以我在控制器下拖拉了属性:

1.解决偏移问题:

[objc] view plain copy

// 我的设备  

[letButton setImage:[UIImage imageNamed:@"health_leftBtn"] forState:UIControlStateNormal];  

[letButton setTitle:@"我的设备" forState:UIControlStateNormal];  

letButton.titleLabel.font = [UIFont systemFontOfSize:10.0];  

[letButton JQ_verticalCenterImageAndTitle:0];  

letButton.contentEdgeInsets = UIEdgeInsetsMake(0, -40,0, 0);  

letButton.imageEdgeInsets = UIEdgeInsetsMake(0, -20,0, 0);  

[letButton JQ_verticalCenterImageAndTitle:3];  

2.解决响应事件的触发范围:

[objc] view plain copy

// 解决扩大响应范围  

[letButton setEnlargeEdgeWithTop:0 right:10 bottom:10 left:40];  

最终效果如下:


有一句话叫做三人行必有我师,其实做为一个开发者,有一个学习的氛围跟一个交流圈子特别重要这是一个我的iOS交流群681503716,请备注编号《晨》,大牛欢迎入驻,正在求职的也可以加入,大家一起交流学习,话糙理不糙,互相学习,共同进步,一起加油吧。)

其中解决触发范围使用了Runtime,代码如下:

// .h

[objc] view plain copy

#import   


@interface UIButton (EnlargeTouchArea)  


- (void)setEnlargeEdgeWithTop:(CGFloat)top right:(CGFloat)right bottom:(CGFloat)bottom left:(CGFloat)left;  


@end  

// .m

[objc] view plain copy

#import "UIButton+EnlargeTouchArea.h"  

#import   


@implementation UIButton (EnlargeTouchArea)  


static char topNameKey;  

static char rightNameKey;  

static char bottomNameKey;  

static char leftNameKey;  


- (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);  

}  


- (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;  

}  


@end  

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容