關於WRNavigationBar在XS、XS_Max、XR導航欄高度異常的修復方案
WRNavigationBar 1.2.0版本在iPhone XS Max、iPhone XR上會出現導航欄高度異常的問題。
導航欄異常的原因
以下程式碼只判斷了iPhone X裝置,所以在真機環境下iPhone XR、iPhone XS、iPhone XS Max會出現導航欄高度異常的問題,但作者在模擬器裝置時對裝置寬高做了判斷,因此模擬器下iPhone XS是正常的。
+ (BOOL)isIphoneX { struct utsname systemInfo; uname(&systemInfo); NSString *platform = [NSString stringWithCString:systemInfo.machine encoding:NSASCIIStringEncoding]; if ([platform isEqualToString:@"i386"] || [platform isEqualToString:@"x86_64"]) { // judgment by height when in simulators return (CGSizeEqualToSize([UIScreen mainScreen].bounds.size, CGSizeMake(375, 812)) || CGSizeEqualToSize([UIScreen mainScreen].bounds.size, CGSizeMake(812, 375))); } BOOL isIPhoneX = [platform isEqualToString:@"iPhone10,3"] || [platform isEqualToString:@"iPhone10,6"]; return isIPhoneX; }
解決辦法
1、找到WRNavigationBar.m檔案,開啟。
2、找到isIphoneX方法
+ (BOOL)isIphoneX { struct utsname systemInfo; uname(&systemInfo); NSString *platform = [NSString stringWithCString:systemInfo.machine encoding:NSASCIIStringEncoding]; if ([platform isEqualToString:@"i386"] || [platform isEqualToString:@"x86_64"]) { // judgment by height when in simulators return (CGSizeEqualToSize([UIScreen mainScreen].bounds.size, CGSizeMake(375, 812)) || CGSizeEqualToSize([UIScreen mainScreen].bounds.size, CGSizeMake(812, 375))); } BOOL isIPhoneX = [platform isEqualToString:@"iPhone10,3"] || [platform isEqualToString:@"iPhone10,6"]; return isIPhoneX; }
3、將其修改為以下內容,直接複製即可
+ (BOOL)isIphoneX { if ([UIApplication sharedApplication].statusBarFrame.size.height == 44) { return YES; } else { return NO; } }
這裡是將作者的根據裝置判斷改為根據狀態列高度判斷,目前劉海屏狀態列高度都是44。
4、這裡有個注意點
Q: 將isIphoneX方法的實現修改後,下面的判斷無法返回正確的數值
+ (CGFloat)navBarBottom { return [self isIphoneX] ? 88 : 64; } + (CGFloat)tabBarHeight { return [self isIphoneX] ? 83 : 49; }
A: 將判斷改寫即可
+ (CGFloat)navBarBottom { if ([self isIphoneX]) { return 88; } else { return 64; } } + (CGFloat)tabBarHeight { if ([self isIphoneX]) { return 83; } else { return 49; } }
如果沒出現問題,請無視,理論上也不應該出現問題的。
Q: 修改程式碼後,執行app導航欄高度還是錯誤的,且clean專案還是無效
A: 使用cleanmymac將Xcode裡的資料清除,重新編譯執行app,導航欄就正常了。