2 o0olike o0olike 于 2016.01.19 15:28 提问

ios 用Method Swizzling修改字体出现问题了,求大神帮忙看一下,谢谢了,在线等

buttonWithType:创建的按钮的字体怎么都改不了,myButtonWithType:这个方法就进不去。
我是新手,求大神帮帮忙看一下

``@implementation UIButton (myFontBtn)
+(void)load{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
Class class = [self class];
// When swizzling a class method, use the following:
// Class class = object_getClass((id)self);
SEL originalSelector = @selector(init);
SEL originalSelector2 = @selector(initWithFrame:);
SEL originalSelector3 = @selector(awakeFromNib);
SEL originalSelector4 = @selector(buttonWithType:);
SEL swizzledSelector = @selector(YHBaseInit);
SEL swizzledSelector2 = @selector(YHBaseInitWithFrame:);
SEL swizzledSelector3 = @selector(YHBaseAwakeFromNib);
SEL swizzledSelector4 = @selector(myButtonWithType:);

    Method originalMethod = class_getInstanceMethod(class, originalSelector);
    Method originalMethod2 = class_getInstanceMethod(class, originalSelector2);
    Method originalMethod3 = class_getInstanceMethod(class, originalSelector3);
    Method originalMethod4 = class_getInstanceMethod(class, originalSelector4);
    Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);
    Method swizzledMethod2 = class_getInstanceMethod(class, swizzledSelector2);
    Method swizzledMethod3 = class_getInstanceMethod(class, swizzledSelector3);
    Method swizzledMethod4 = class_getInstanceMethod(class, swizzledSelector4);
    BOOL didAddMethod =
    class_addMethod(class,
                    originalSelector,
                    method_getImplementation(swizzledMethod),
                    method_getTypeEncoding(swizzledMethod));
    BOOL didAddMethod2 =
    class_addMethod(class,
                    originalSelector2,
                    method_getImplementation(swizzledMethod2),
                    method_getTypeEncoding(swizzledMethod2));
    BOOL didAddMethod3 =
    class_addMethod(class,
                    originalSelector3,
                    method_getImplementation(swizzledMethod3),
                    method_getTypeEncoding(swizzledMethod3));
    BOOL didAddMethod4 =
    class_addMethod(class,
                    originalSelector4,
                    method_getImplementation(swizzledMethod4),
                    method_getTypeEncoding(swizzledMethod4));

    if (didAddMethod) {
        class_replaceMethod(class,
                            swizzledSelector,
                            method_getImplementation(originalMethod),
                            method_getTypeEncoding(originalMethod));

    } else {
        method_exchangeImplementations(originalMethod, swizzledMethod);
    }
    if (didAddMethod2) {
        class_replaceMethod(class,
                            swizzledSelector2,
                            method_getImplementation(originalMethod2),
                            method_getTypeEncoding(originalMethod2));
    }else {
        method_exchangeImplementations(originalMethod2, swizzledMethod2);
    }
    if (didAddMethod3) {
        class_replaceMethod(class,
                            swizzledSelector3,
                            method_getImplementation(originalMethod3),
                            method_getTypeEncoding(originalMethod3));
    }else {
        method_exchangeImplementations(originalMethod3, swizzledMethod3);
    }
    if (didAddMethod4) {
        class_replaceMethod(class,
                            swizzledSelector4,
                            method_getImplementation(originalMethod4),
                            method_getTypeEncoding(originalMethod4));
    }else {
        method_exchangeImplementations(originalMethod4, swizzledMethod4);
    }
});

}

  • (instancetype)YHBaseInit { id __self = [self YHBaseInit]; UIFont * font = [UIFont fontWithName:@"SimHei" size:self.titleLabel.font.pointSize]; if (font) { self.titleLabel.font=font; } return __self; }

-(instancetype)YHBaseInitWithFrame:(CGRect)rect{
id __self = [self YHBaseInitWithFrame:rect];
UIFont * font = [UIFont fontWithName:@"SimHei" size:self.titleLabel.font.pointSize];
if (font) {
self.titleLabel.font=font;
}
return __self;
}

-(void)YHBaseAwakeFromNib{
[self YHBaseAwakeFromNib];
UIFont * font = [UIFont fontWithName:@"SimHei" size:self.titleLabel.font.pointSize];
if (font) {
self.titleLabel.font=font;
}

}

-(instancetype)myButtonWithType:(UIButtonType)buttonType{
id __self = [self myButtonWithType:buttonType];
UIFont * font = [UIFont fontWithName:@"SimHei" size:self.titleLabel.font.pointSize];
if (font) {
self.titleLabel.font=font;
}
return __self;
}


1个回答

devmiao
devmiao   Ds   Rxr 2016.01.19 22:17
o0olike
o0olike buttonWithType:这个方法初始化button的时候依然不起做用、用init、initwithframe、xib里面的button都生效。
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
求助各位高手,帮忙做下,谢谢了
由计算机“想”一个四位数,请人猜出这个四位数是多少。人输入四位数字后,计算机首先判断这四位数字有几位是猜对了,并且在对的数字中又有几位位置也是对的,将结果显示出来,给人以提示,请人再猜,直到人猜出计算机所想的四位数是多少时为止。 
iOS Runtime应用实例(二)method swizzling(方法交叉)
原创Blog,转载请注明出处 http://blog.csdn.net/hello_hwc?viewmode=list 我的stackoverflow本博客关于Runtime的博客链接 iOS Runtime应用实例(一)类别添加属性 iOS Runtime详解(消息机制,类元对象,缓存机制,消息转发) iOS Runtime详解之SEL,Class,id,IMP,_cmd,isa,m
Method Swizzling中的陷阱
这篇文章不是介绍什么是方法交换,这类文章很多,如果你不知道什么是方法交换可以看这篇文章:Method Swizzling
iOS之运行时机制及方法混写method swizzling
runtime method swizzling
iOS之方法变换(Method Swizzling)
C语言是静态语言,它的工作方式是通过函数调用,这样在编译时我们就已经确定程序如何运行的。而Objective-C是动态语言,它并非通过调用类的方法来执行功能,而是给对象发送消息,对象在接收到消息之后会去找匹配的方法来运行。这种做法就把c语言在编译时的工作挪到了运行时来做,可以获得额外的灵活性。       在objective-c中有个@selector,在很多地方被翻译成“选择子”。实际上,对
Method Swizzling(iOS的hook机制)
为了安全,要为NSUserDefaults加密。但是为NSUserDefaults的每个读写的地方加入加密解密方法也太麻烦。所以想重写NSUserDefaults的读写方法,把加密解密方法内嵌其中,这样修改代码量大大减少。 先贴上代码 #import @interface NSUserDefaults (Swizzle) -(void)swizzleSetObject:(nullable
method_swizzling
Method Swizzling最近在研究学习runtime,其中有一个特性叫method swizzling,即方法替换。它能够让你在合适的地方更改一下方法的实现。它功能很强大,如果用好了能够带你飞,但是用不好那就是坑啊。下面就开始讲解。Swizzling 原理在Objective-C中调用一个方法,其实就是向一个对象发消息,查找消息的依据就是selector的名字。我们可以利用runtime的机
LISTVIEW问题
一个小问题,新手,为什么不显示图标,请大家帮忙看一下。谢谢了。。。。。。。。。。。。。。。。。。。。。。。。。。。。
求大神帮忙,在线等
简单的c++题,求教
iOS method swizzling详解3
一.Method Swizzling介绍 objective-c 方法分为方法名(selector)和方法实现(IMP)两部分,当调用方法时,Objective-C运行时根据selecotr去找匹配的实现代码。见”关于Objective-C方法的IMP“的介绍。MethodSwizzling是一种在运行时修改方法名与方法实现映射关系的技术,常用于在系统内部方法的基础上增加新的处理流程。 假