交换某个类里面的方法

#import "objc/runtime.h"

void Swizzle(Class c, SEL orig, SEL new) {
    Method origMethod = class_getInstanceMethod(c, orig);
    Method newMethod = class_getInstanceMethod(c, new);
    if(class_addMethod(c, orig, method_getImplementation(newMethod), method_getTypeEncoding(newMethod))){
        class_replaceMethod(c, new, method_getImplementation(origMethod), method_getTypeEncoding(origMethod));
    } else {
        method_exchangeImplementations(origMethod, newMethod);
    }
}

运用场景,运用实例

int main(int argc, char *argv[])
{
    @autoreleasepool {
        Swizzle([UINavigationBar class], @selector(drawRect:), @selector(SP_drawRect:));
        Swizzle([UITabBar class], @selector(drawRect:), @selector(SP_drawRect:));
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([SNAppDelegate class]));
    }
}

分类里重写些方法

@interface UINavigationBar (SPExtension)

- (void)SP_drawRect:(CGRect)rect;

@end

实现

@implementation UINavigationBar (SPExtension)

+ (Class)class {
    return NSClassFromString(@"SPNavigationBar");
}

- (void)SP_drawRect:(CGRect)rect {
    if (self.tag == SPCommonNavigationBar) {
        if ([self viewWithTag:kSPNaviBarShadowTag] == nil) {
            CGRect rf = CGRectMake(0, 0, 320, 44);
            [[UIImage imageNamed:@"title_bar_background.png"] drawInRect:rf];
            
//            [[UIImage imageNamed:@""] drawInRect:rf];//sp_navigation_bar_bg
//            self.backgroundColor = [UIColor clearColor];
            
//            UIView *shadowLayer = [[UIView alloc] initWithFrame:CGRectMake(0, rect.size.height - 0, rect.size.width, 0)];
//            shadowLayer.alpha =  1.0;
//            shadowLayer.tag = kSPNaviBarShadowTag;
//            
//            CAGradientLayer *grad2 = [CAGradientLayer layer];
//            grad2.frame = CGRectMake(0, 0, rect.size.width, 3);
//            grad2.colors = [NSArray arrayWithObjects:(id)[[UIColor colorWithHue:0 saturation:0 brightness:0 alpha:.0] CGColor],  (id)[[UIColor colorWithHue:0 saturation:0 brightness:0 alpha:.5] CGColor], nil];
//            
//            [shadowLayer.layer insertSublayer:grad2 atIndex:0];
//            [self insertSubview:shadowLayer atIndex:10];
//            [shadowLayer release];
        } 
        else {
            UIView *shadowLayer = [self viewWithTag:kSPNaviBarShadowTag];
            shadowLayer.alpha = 1.0;
            shadowLayer.frame = CGRectMake(0, rect.size.height - 3, rect.size.width, 3);
            CALayer *grad2 = [shadowLayer.layer.sublayers objectAtIndex:0];
            grad2.frame = CGRectMake(0, 0, rect.size.width, 3);
        }
    } else {
        UIView *shadowLayer = [self viewWithTag:kSPNaviBarShadowTag];
        if (shadowLayer) {
            shadowLayer.alpha = 0.0;
        }
        [self SP_drawRect:rect];
    }
}

@end

好像就处理了一下背景还是什么的,然而并不怎么高级的感觉

转载于:https://www.cnblogs.com/songxing10000/p/4946337.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值