From 0de42863214dfc0c9dd63ae3ba2bd323006d0b97 Mon Sep 17 00:00:00 2001 From: wsr1949 <921903719@qq.com> Date: Tue, 11 Nov 2025 18:31:40 +0800 Subject: [PATCH] Implement qmui_contentView method for UINavigationBar Add method to retrieve contentView for UINavigationBar in iOS 26 and later. --- .../UIKitExtensions/UINavigationBar+QMUI.m | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/QMUIKit/UIKitExtensions/UINavigationBar+QMUI.m b/QMUIKit/UIKitExtensions/UINavigationBar+QMUI.m index 8d82a777..cb596c4f 100644 --- a/QMUIKit/UIKitExtensions/UINavigationBar+QMUI.m +++ b/QMUIKit/UIKitExtensions/UINavigationBar+QMUI.m @@ -359,6 +359,25 @@ + (void)load { } - (UIView *)qmui_contentView { + if (@available(iOS 26.0, *)) { + // 如果 contentView 已经被构造出来,则通过遍历 view 层级树的方式获取 + UIView *contentView = [self.subviews qmui_firstMatchWithBlock:^BOOL(__kindof UIView * _Nonnull item) { + return [NSStringFromClass(item.class) containsString:@"ContentView"]; + }]; + if (contentView) return contentView; + + // Xcode 26 编译在 iOS 26 上时,无法用以前的 KVC 方式获取 contentView,所以改为通过 Ivar 获取 + NSObject *provider = [self valueForKey:@"visualProvider"]; + __block UIView *result = nil; + [provider qmui_enumrateIvarsUsingBlock:^(Ivar _Nonnull ivar, NSString * _Nonnull ivarDescription) { + if (!result && [ivarDescription containsString:@"contentView"]) { + result = getObjectIvarValue(provider, ivar); + } + }]; + return result; + } + + // 在 bar init 完即可获取到 contentView,虽然此时尚未被添加到 view 上 return [self valueForKeyPath:@"visualProvider.contentView"]; }