mPaaS跳转到继承于H5WebViewController的离线包容器出现蓝色导航条的问题

通过查看页面结构可以看到是加载到DTBaseView上面的,重写UIView的addSubView方法可以查到这个imageView的tag值是10000。

通过H5CustomAnimator这个插件来展示的

查看源码

/* @class H5CustomAnimator */
-(void)animateTransition:(void *)arg2 {
    r31 = r31 - 0x190;
    stack[272] = d11;
    stack[280] = d10;
    stack[288] = d9;
    stack[296] = d8;
    stack[304] = r28;
    stack[312] = r27;
    stack[320] = r26;
    stack[328] = r25;
    stack[336] = r24;
    stack[344] = r23;
    stack[352] = r22;
    stack[360] = r21;
    stack[368] = r20;
    stack[376] = r19;
    stack[384] = r29;
    stack[392] = r30;
    stack[24] = self;
    r0 = [arg2 retain];
    r19 = r0;
    r21 = [[r0 viewControllerForKey:**_UITransitionContextToViewControllerKey] retain];
    [[r19 viewControllerForKey:**_UITransitionContextFromViewControllerKey] retain];
    r0 = [r21 view];
    r0 = [r0 retain];
    CGRectGetWidth([r0 frame]);
    [r24 release];
    r24 = [[r19 containerView] retain];
    r27 = [[r21 view] retain];
    [r24 addSubview:r27];
    [r27 release];
    r0 = [r24 release];
    v0 = v0;
    CGAffineTransformMakeTranslation(r0, @selector(addSubview:));
    r0 = [r21 view];
    r0 = [r0 retain];
    q2 = *(int128_t *)(&stack[160] + 0x40);
    q0 = *(int128_t *)(&stack[160] + 0x50);
    *(int128_t *)(&stack[160] + 0x10) = q2;
    *(int128_t *)(&stack[160] + 0x20) = q0;
    [r0 setTransform:&stack[160]];
    [r0 release];
    r0 = [r21 navigationController];
    r29 = &stack[384];
    r0 = [r0 retain];
    r27 = r0;
    r0 = [r0 isNavigationBarHidden];
    stack[32] = r22;
    if (((r0 & 0x1) == 0x0) && ([r21 isKindOfClass:[H5WebViewController class]] != 0x0)) {
            r20 = [r21 isFromNavigationBarHidden];
            [r27 release];
            if (r20 != 0x0) {
                    r0 = _H5CachableAUBundleImage(@"navigationbar7");
                    r0 = [r0 retain];
                    stack[16] = [[r0 stretchableImageWithLeftCapWidth:0x2 topCapHeight:0x0] retain];
                    [r0 release];
                    r0 = [UIApplication sharedApplication];
                    r0 = [r0 retain];
                    [r0 statusBarFrame];
                    [r0 release];
                    stack[8] = [UIImageView alloc];
                    r0 = [r19 containerView];
                    r0 = [r0 retain];
                    r28 = r0;
                    [r0 frame];
                    r0 = [r21 navigationController];
                    r0 = [r0 retain];
                    r27 = r0;
                    r0 = [r0 navigationBar];
                    r0 = [r0 retain];
                    [r0 frame];
                    r26 = [stack[8] initWithFrame:0x2];
                    [r0 release];
                    [r27 release];
                    [r28 release];
                    r0 = [r21 navigationController];
                    r0 = [r0 retain];
                    r22 = r0;
                    r0 = [r0 navigationBar];
                    r0 = [r0 retain];
                    r20 = r0;
                    r0 = [r0 backgroundImageForBarMetrics:0x0];
                    r29 = r29;
                    r0 = [r0 retain];
                    r27 = r0;
                    r28 = stack[16];
                    if (r0 == 0x0) {
                            if (!CPU_FLAGS & E) {
                                    r2 = r0;
                            }
                            else {
                                    r2 = r28;
                            }
                    }
                    [r26 setImage:r2];
                    [r27 release];
                    [r20 release];
                    [r22 release];
                    [r26 setAlpha:r2];
                    [r26 setTag:0x2710];
                    r0 = [r21 view];
                    r29 = r29;
                    r0 = [r0 retain];
                    [r0 addSubview:r26];
                    [r0 release];
                    [r28 release];
            }
            else {
                    r26 = 0x0;
            }
    }
    else {
            [r27 release];
            r26 = 0x0;
    }
    r25 = stack[24];
    r0 = [r21 navigationController];
    r29 = r29;
    r0 = [r0 retain];
    r22 = [r0 respondsToSelector:r2];
    [r0 release];
    if (r22 != 0x0) {
            r0 = [r21 navigationController];
            r0 = [r0 retain];
            r0 = [r0 interactivePopGestureRecognizer];
            r0 = [r0 retain];
            [r0 setEnabled:r2];
            [r22 release];
            [r20 release];
    }
    [r25 transitionDuration:r19];
    r0 = [stack[32] retain];
    r22 = r0;
    stack[136] = r0;
    r0 = [r21 retain];
    r20 = [r26 retain];
    stack[80] = r22;
    r21 = [r22 retain];
    r22 = [r0 retain];
    stack[96] = r19;
    r19 = [r19 retain];
    [UIView animateWithDuration:0x0 delay:&stack[104] options:&stack[40] animations:r5 completion:r6];
    [stack[96] release];
    [r0 release];
    [stack[80] release];
    [r26 release];
    [r0 release];
    [stack[136] release];
    [r19 release];
    [r22 release];
    [r21 release];
    [r20 release];
    return;
}

这个里面有不少的if else

关键代码是

r0 = [r0 backgroundImageForBarMetrics:0x0];

if (r0 == 0x0) {

        if (!CPU_FLAGS & E) {

                r2 = r0;

        }

        else {

                r2 = r28;

        }

}

[r26 setImage:r2];

分析

r0 = [r0 backgroundImageForBarMetrics:0x0];

这行代码正常写法是                

UIImage *image = [self.navigationController.navigationBar backgroundImageForBarMetrics:UIBarMetricsDefault];

然后对取值进行判空

空的话,进行r2赋值

hopper反编译出来的代码好像不太准

把hopper更新到4.7.7版本

/* @class H5CustomAnimator */
-(void)animateTransition:(void *)arg2 {
    rbx = [arg2 retain];
    r12 = [[rbx viewControllerForKey:**_UITransitionContextToViewControllerKey] retain];
    stack[-88] = rbx;
    r14 = [[rbx viewControllerForKey:**_UITransitionContextFromViewControllerKey] retain];
    rdi = [r12 view];
    rax = [rdi retain];
    rbx = rax;
    stack[-96] = self;
    stack[-120] = r14;
    if (rax != 0x0) {
            rdi = &stack[-184];
            [rdi frame];
    }
    else {
            xmm0 = 0x0;
            stack[-168] = intrinsic_movaps(stack[-168], xmm0);
            stack[-184] = intrinsic_movaps(stack[-184], xmm0);
    }
    CGRectGetWidth(rdi);
    stack[-80] = intrinsic_movsd(stack[-80], xmm0);
    [rbx release];
    r14 = [[stack[-88] containerView] retain];
    r15 = r12;
    rax = [r12 view];
    rax = [rax retain];
    [r14 addSubview:rax];
    [rax release];
    [r14 release];
    xmm1 = intrinsic_xorpd(xmm1, xmm1);
    xmm0 = intrinsic_movsd(xmm0, stack[-80]);
    CGAffineTransformMakeTranslation(&stack[-384], @selector(addSubview:));
    r12 = r15;
    r14 = [[r15 view] retain];
    rcx = *(&stack[-384] + 0x20);
    rdx = *(&stack[-384] + 0x18);
    r8 = *(&stack[-384] + 0x10);
    r9 = stack[-384];
    [r14 setTransform:rdx, rcx, r8, r9];
    rsp = ((rsp - 0x20) + 0x20 - 0x30) + 0x30;
    [r14 release];
    rax = [r15 navigationController];
    rax = [rax retain];
    rbx = rax;
    if ([rax isNavigationBarHidden] == 0x0) {
            rdx = [H5WebViewController class];
            if ([r12 isKindOfClass:rdx, rcx, r8] != 0x0) {
                    r14 = [r12 isFromNavigationBarHidden];
                    [rbx release];
                    if (r14 != 0x0) {
                            rax = _H5CachableAUBundleImage(@"navigationbar7");
                            rax = [rax retain];
                            r14 = [[rax stretchableImageWithLeftCapWidth:0x2 topCapHeight:0x0] retain];
                            [rax release];
                            rax = [UIApplication sharedApplication];
                            rax = [rax retain];
                            rbx = rax;
                            stack[-64] = r14;
                            if (rax != 0x0) {
                                    rdx = @selector(statusBarFrame);
                                    objc_msgSend_stret(&stack[-280], rbx, rdx);
                                    xmm0 = intrinsic_movsd(xmm0, *(&stack[-280] + 0x18));
                            }
                            else {
                                    rdx = 0x2;
                                    intrinsic_movaps(stack[-264], 0x0);
                                    intrinsic_movaps(stack[-280], 0x0);
                                    xmm0 = 0x0;
                            }
                            stack[-56] = intrinsic_movsd(stack[-56], xmm0);
                            [rbx release];
                            stack[-104] = [UIImageView alloc];
                            rax = [stack[-88] containerView];
                            rax = [rax retain];
                            stack[-72] = rax;
                            if (rax != 0x0) {
                                    rdx = @selector(frame);
                                    objc_msgSend_stret(&stack[-248], rax, rdx);
                                    r15 = *(&stack[-248] + 0x10);
                            }
                            else {
                                    xmm0 = 0x0;
                                    intrinsic_movaps(stack[-232], xmm0);
                                    intrinsic_movaps(stack[-248], xmm0);
                                    r15 = 0x0;
                            }
                            xmm0 = intrinsic_movsd(xmm0, *double_value_40);
                            xmm1 = intrinsic_movsd(xmm1, stack[-56]);
                            xmm0 = intrinsic_subsd(xmm0, xmm1);
                            stack[-56] = intrinsic_movsd(stack[-56], xmm0);
                            rax = [r12 navigationController];
                            rax = [rax retain];
                            rbx = rax;
                            rax = [rax navigationBar];
                            rax = [rax retain];
                            r14 = rax;
                            stack[-112] = rbx;
                            if (rax != 0x0) {
                                    [&stack[-216] frame];
                                    xmm0 = intrinsic_movsd(xmm0, *(&stack[-216] + 0x18));
                            }
                            else {
                                    intrinsic_movapd(stack[-200], intrinsic_xorpd(xmm0, xmm0));
                                    intrinsic_movapd(stack[-216], xmm0);
                                    xmm0 = intrinsic_xorpd(xmm0, xmm0);
                            }
                            xmm1 = intrinsic_movsd(xmm1, stack[-56]);
                            xmm1 = intrinsic_addsd(xmm1, xmm0);
                            xmm0 = intrinsic_xorpd(xmm0, xmm0);
                            stack[-152] = intrinsic_movapd(stack[-152], xmm0);
                            intrinsic_movsd(stack[-128], xmm1);
                            rax = [stack[-104] initWithFrame:stack[-152]];
                            rsp = (rsp - 0x20) + 0x20;
                            r15 = rax;
                            stack[-56] = rax;
                            [r14 release];
                            [stack[-112] release];
                            [stack[-72] release];
                            rax = [r12 navigationController];
                            rax = [rax retain];
                            stack[-72] = rax;
                            rax = [rax navigationBar];
                            rax = [rax retain];
                            r14 = rax;
                            rax = [rax backgroundImageForBarMetrics:0x0];
                            rax = [rax retain];
                            r13 = rax;
                            rdx = stack[-64];
                            if (rax != 0x0) {
                                    rdx = rax;
                            }
                            [r15 setImage:rdx];
                            [r13 release];
                            [r14 release];
                            [stack[-72] release];
                            xmm0 = intrinsic_movsd(xmm0, *0x1025e6e88);
                            [stack[-56] setAlpha:rdx];
                            [stack[-56] setTag:0x2710];
                            rax = [r12 view];
                            rax = [rax retain];
                            rdx = stack[-56];
                            [rax addSubview:rdx];
                            [rax release];
                            [stack[-64] release];
                    }
                    else {
                            stack[-56] = 0x0;
                    }
            }
            else {
                    [rbx release];
                    stack[-56] = 0x0;
            }
    }
    else {
            [rbx release];
            stack[-56] = 0x0;
    }
    r13 = *_objc_msgSend;
    rax = [r12 navigationController];
    rax = [rax retain];
    rbx = rax;
    rax = [rax respondsToSelector:@selector(interactivePopGestureRecognizer)];
    stack[-64] = r12;
    r12 = r13;
    [rbx release];
    if (rax != 0x0) {
            (r12)([(r12)([(r12)(stack[-64], @selector(navigationController), @selector(interactivePopGestureRecognizer)) retain], @selector(interactivePopGestureRecognizer), @selector(interactivePopGestureRecognizer)) retain], @selector(setEnabled:), 0x0);
            [rax release];
            [rax release];
    }
    (r12)(stack[-96], @selector(transitionDuration:), stack[-88]);
    stack[-96] = intrinsic_movsd(stack[-96], xmm0);
    stack[-336] = *__NSConcreteStackBlock;
    *(&stack[-336] + 0x8) = 0xffffffffc2000000;
    *(&stack[-336] + 0x10) = ___38-[H5CustomAnimator animateTransition:]_block_invoke;
    *(&stack[-336] + 0x18) = ___block_descriptor_56_e8_32s40s_e5_v8?0l;
    rax = [stack[-120] retain];
    r14 = rax;
    *(&stack[-336] + 0x20) = rax;
    *(&stack[-336] + 0x30) = intrinsic_movsd(*(&stack[-336] + 0x30), intrinsic_movsd(xmm0, stack[-80]));
    rax = [stack[-64] retain];
    *(&stack[-336] + 0x28) = rax;
    stack[-448] = *__NSConcreteStackBlock;
    *(&stack[-448] + 0x8) = 0xffffffffc2000000;
    *(&stack[-448] + 0x10) = ___38-[H5CustomAnimator animateTransition:]_block_invoke.473;
    *(&stack[-448] + 0x18) = ___block_descriptor_64_e8_32s40s48s56s_e8_v12?0B8l;
    *(&stack[-448] + 0x20) = stack[-56];
    stack[-80] = [stack[-56] retain];
    *(&stack[-448] + 0x28) = r14;
    stack[-64] = [r14 retain];
    *(&stack[-448] + 0x30) = rax;
    r13 = [rax retain];
    *(&stack[-448] + 0x38) = stack[-88];
    r14 = [stack[-88] retain];
    intrinsic_xorpd(xmm1, xmm1);
    intrinsic_movsd(xmm0, stack[-96]);
    [UIView animateWithDuration:0x0 delay:&stack[-336] options:&stack[-448] animations:r9 completion:stack[0]];
    [*(&stack[-448] + 0x38) release];
    [*(&stack[-448] + 0x30) release];
    [*(&stack[-448] + 0x28) release];
    [*(&stack[-448] + 0x20) release];
    [*(&stack[-336] + 0x28) release];
    [*(&stack[-336] + 0x20) release];
    [r14 release];
    [r13 release];
    [stack[-64] release];
    [stack[-80] release];
    return;
}

这下清楚多了

 rax = [rax backgroundImageForBarMetrics:0x0];
 rax = [rax retain];
 r13 = rax;
 rdx = stack[-64];
 if (rax != 0x0) {
         rdx = rax;
 }
 [r15 setImage:rdx];

image有值的话,就把image作为r15 UIImageView 的图片,没有值则取默认的stack[-64]也就是

r14 = [[rax stretchableImageWithLeftCapWidth:0x2 topCapHeight:0x0] retain]这应该就是那张深蓝色图片了

所以解决办法是:

在跳入离线包容器前

    [self.navigationController.navigationBar setBackgroundImage:[[UIImage alloc] init] forBarMetrics:UIBarMetricsDefault];

或 弄一张透明图片

    [self.navigationController.navigationBar setBackgroundImage:[ UIImage imageNamed:@"clear.png"] forBarMetrics:UIBarMetricsDefault];

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值