RuntimePlayer-干掉「辅助功能」-「按钮形状」开启后button产生下划线的功能

以后每用Runtime解决一个问题,就会记录在这个文集里。

我将以真实的使用场景为大家讲述Runtime的各种用法,让Runtime真正的投入到生产中。

合辑demo Github地址

正文

按照下面路径开启功能,会发几乎现所有的UIButton的文字下都被加上了下划线。

设置-通用-辅助功能-按钮形状

效果奇差,具体如下。


RuntimePlayer-干掉「辅助功能」-「按钮形状」开启后button产生下划线的功能_第1张图片
......

其实我不知道这个功能的本意到底是什么....

我只是觉得这个效果很难受,而不管用户是否选择开启这个功能,App里都不应该出现这个下滑线的效果。

于是我就把这个加下划线的功能干掉了。

干掉它的代码如下:

BOOL wel_buttonShapesUnderline(id self, SEL _cmd) {
    return NO;
}

@implementation UILabel (WELButtonShapesUnderline)

+(void)load {
    Method m = class_getInstanceMethod([UILabel class], NSSelectorFromString(@"_shouldShowAccessibilityButtonShapesUnderline"));
    method_setImplementation(m, (IMP)wel_buttonShapesUnderline);
}

@end

做这个前后花了不到十分钟,算是这一堆里最好搞的一个。

我用Aspects钩了Button的所有方法「返回值类型为结构体的方法不能钩,Aspects触发消息转发的方法有问题,只在i386和arm64上跑的通。可以用JSPatch的思路魔改。不过少钩几个方法在这个需求上也是没问题的,这里就不展开说了」

去设置那里开启「按钮形状」这个功能,回到App,发现Button的几个方法被调用,跟堆栈,很轻松的就能找到这个方法。

你可能感兴趣的:(RuntimePlayer-干掉「辅助功能」-「按钮形状」开启后button产生下划线的功能)