HBDNavigationBar icon indicating copy to clipboard operation
HBDNavigationBar copied to clipboard

iOS18适配,导航栏透底问题已修复

Open xygkevin opened this issue 1 year ago • 22 comments

xygkevin avatar Sep 18 '24 05:09 xygkevin

@listenzz 麻烦尽快适配一下iOS18

cuizhiyuan avatar Sep 18 '24 06:09 cuizhiyuan

iOS18 设置hbd_barAlpha=0.0 的页面 push 到下个页面会出现导航栏

Uploading ღ Monster .tu lin 2024-09-09 14.46.24.mp4…

透底情况,麻烦尽快适配 18 哦

ctl0809 avatar Sep 19 '24 06:09 ctl0809

BUG已定位并修复 @cuizhiyuan @ctl0809 @listenzz

问题定位:

UIView *back = self.navigationBar.subviews[0];

其本意应该是或取_UIBarBackground背景图层对象,但是更新iOS18之后,当我们使用导航控制进行push或者pop的时候会执行以下方法:

1、<_UIBarBackground: 0x10a2bf700> removeFromSuperview
2、UINavigationBar会执行-[insertSubview:<_UIBarBackground: 0x10a2bf700> atIndex:0]

问题方法正好在1和2之前执行,导致获取不到正确的_UIBarBackground对象,而是另外一个_UIPointerInteractionAssistantEffectContainerView对象,frame={0, 0, 0, 0};

问题截图: image

解决办法: image

xygkevin avatar Sep 19 '24 08:09 xygkevin

后面会更新版本吗?

ctl0809 avatar Sep 19 '24 08:09 ctl0809

不晓得作者是否还会继续维护,但我决定放弃使用它了,其实还有很多问题[捂脸],每次大更新都提心吊胆的。

xygkevin avatar Sep 19 '24 09:09 xygkevin

有好的替代框架吗?没有的话,我都改回原生算了

cuizhiyuan avatar Sep 19 '24 09:09 cuizhiyuan

同问,有好的替代框架吗?

ctl0809 avatar Sep 19 '24 09:09 ctl0809

木有

xygkevin avatar Sep 19 '24 09:09 xygkevin

改了 问题依然存在 😶

178408714 avatar Sep 20 '24 02:09 178408714

可以试试自己计算frame @178408714

xygkevin avatar Sep 20 '24 02:09 xygkevin

改成了 😄 [self.navigationBar setNeedsLayout]; [self.navigationBar layoutIfNeeded];

只能先这样了

178408714 avatar Sep 20 '24 02:09 178408714

image 最好是在这个地方进行判断,如果发现frame为0,自己配置为状态栏的frame(如图中frame代码只是为了做测试使用)。 使用以下两句代码是有问题的: [self.navigationBar setNeedsLayout]; [self.navigationBar layoutIfNeeded]; 具体表现为:当A页面导航栏透明,黑色状态栏,B页面白色navigationTitle时,白色状态栏时,手势侧滑过程中,就会把navigationTitle颜色改为黑色了。

Serakaterina avatar Sep 20 '24 10:09 Serakaterina

在ios18上,当前hbd_barAlpha = 0 push的时候下一个导航栏显示不正常 playGestureRecognizer 2.zip

todayismancheng avatar Sep 24 '24 09:09 todayismancheng

@listenzz

todayismancheng avatar Sep 25 '24 01:09 todayismancheng

暂且这么修改吧

- (CGRect)fakeBarFrameForViewController:(UIViewController *)vc {
    CGFloat x = 0;
    CGFloat y = 0;
    CGFloat w = 0;
    CGFloat h = 0;
    if (@available(iOS 13.0, *)) {
        UIWindowScene *windowScene = [UIApplication sharedApplication].connectedScenes.allObjects.firstObject;
        w = CGRectGetWidth(windowScene.statusBarManager.statusBarFrame);
        h = 44.0 + CGRectGetHeight(windowScene.statusBarManager.statusBarFrame);
    } else {
        w = CGRectGetWidth(UIApplication.sharedApplication.statusBarFrame);
        h = CGRectGetHeight(UIApplication.sharedApplication.statusBarFrame) + 44.0;
    }
    y = -h;
    return CGRectMake(x, y, w, h);
}

xygkevin avatar Sep 25 '24 11:09 xygkevin

暂且这么修改吧

- (CGRect)fakeBarFrameForViewController:(UIViewController *)vc {
    CGFloat x = 0;
    CGFloat y = 0;
    CGFloat w = 0;
    CGFloat h = 0;
    if (@available(iOS 13.0, *)) {
        UIWindowScene *windowScene = [UIApplication sharedApplication].connectedScenes.allObjects.firstObject;
        w = CGRectGetWidth(windowScene.statusBarManager.statusBarFrame);
        h = 44.0 + CGRectGetHeight(windowScene.statusBarManager.statusBarFrame);
    } else {
        w = CGRectGetWidth(UIApplication.sharedApplication.statusBarFrame);
        h = CGRectGetHeight(UIApplication.sharedApplication.statusBarFrame) + 44.0;
    }
    y = -h;
    return CGRectMake(x, y, w, h);
}

@todayismancheng 试下这个方案

listenzz avatar Sep 25 '24 13:09 listenzz

暂且这么修改吧

- (CGRect)fakeBarFrameForViewController:(UIViewController *)vc {
    CGFloat x = 0;
    CGFloat y = 0;
    CGFloat w = 0;
    CGFloat h = 0;
    if (@available(iOS 13.0, *)) {
        UIWindowScene *windowScene = [UIApplication sharedApplication].connectedScenes.allObjects.firstObject;
        w = CGRectGetWidth(windowScene.statusBarManager.statusBarFrame);
        h = 44.0 + CGRectGetHeight(windowScene.statusBarManager.statusBarFrame);
    } else {
        w = CGRectGetWidth(UIApplication.sharedApplication.statusBarFrame);
        h = CGRectGetHeight(UIApplication.sharedApplication.statusBarFrame) + 44.0;
    }
    y = -h;
    return CGRectMake(x, y, w, h);
}

@todayismancheng 试下这个方案

现在导航栏能正常显示了。 还有个问题是 导航栏的push pop 的时候 里面的内容会跳一下

todayismancheng avatar Sep 26 '24 01:09 todayismancheng

@todayismancheng 我这里没发现闪动的问题,可以发个DEMO,录个屏看下问题原因

xygkevin avatar Sep 26 '24 02:09 xygkevin

https://github.com/user-attachments/assets/c72e365a-2f5c-4405-bba3-4f3d1ef3cb8f

我在demo上没复现,但是在app上是这个样子 @xygkevin

todayismancheng avatar Sep 26 '24 03:09 todayismancheng

嗯嗯,那目前这个只能自己先慢慢排查问题原因了。

xygkevin avatar Sep 26 '24 03:09 xygkevin

暂且这么修改吧

- (CGRect)fakeBarFrameForViewController:(UIViewController *)vc {
    CGFloat x = 0;
    CGFloat y = 0;
    CGFloat w = 0;
    CGFloat h = 0;
    if (@available(iOS 13.0, *)) {
        UIWindowScene *windowScene = [UIApplication sharedApplication].connectedScenes.allObjects.firstObject;
        w = CGRectGetWidth(windowScene.statusBarManager.statusBarFrame);
        h = 44.0 + CGRectGetHeight(windowScene.statusBarManager.statusBarFrame);
    } else {
        w = CGRectGetWidth(UIApplication.sharedApplication.statusBarFrame);
        h = CGRectGetHeight(UIApplication.sharedApplication.statusBarFrame) + 44.0;
    }
    y = -h;
    return CGRectMake(x, y, w, h);
}

@todayismancheng 试下这个方案

对我有用

htyo avatar Sep 27 '24 08:09 htyo

@listenzz @ctl0809 @cuizhiyuan @todayismancheng 最终修复版本可以试下这个PR

xygkevin avatar Nov 14 '24 09:11 xygkevin