|
保证能判断,呕心沥血,不行切JIJI
方法一
Objective-C
- // iPhoneX、iPhoneXR、iPhoneXs、iPhoneXs Max等
- // 判断刘海屏,返回YES表示是刘海屏
- [list][*](BOOL)isNotchScreen {[/list]
-
- if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad) {
- return NO;
- }
-
- CGSize size = [UIScreen mainScreen].bounds.size;
- NSInteger notchValue = size.width / size.height * 100;
-
- if (216 == notchValue || 46 == notchValue) {
- return YES;
- }
-
- return NO;
- }
复制代码
<!--text-ad-->
Swift
- extension UIViewController {
-
- /// iPhoneX、iPhoneXR、iPhoneXs、iPhoneXs Max等
- /// 判断刘海屏,返回true表示是刘海屏
- ///
- var isNotchScreen: Bool {
-
- if UIDevice.current.userInterfaceIdiom == .pad {
- return false
- }
-
- let size = UIScreen.main.bounds.size
- let notchValue: Int = Int(size.width/size.height * 100)
-
- if 216 == notchValue || 46 == notchValue {
-
- return true
- }
-
- return false
- }
- }
复制代码
方法二
Objective-C
- // 如果是刘海屏
- if (self.view.safeAreaInsets.bottom > 0) {
- // do something
- }
复制代码
Swift
- // 如果是刘海屏
- if self.view.safeAreaInsets.bottom > 0 {
- // do something
- }
复制代码
方法一与方法二比较
- 方法一很明显的优势是代码少,缺点是依赖UIView实例,在一些非UI场景的逻辑处理中如果要判断刘海屏,就不是很友好,当然你也可以先获得当前View实例然后再判断,还有一个问题就是在iPad上safeAreaInsets.bottom的值也是大于0,如果是通用APP就不适用了
- 方法二代码多,这是缺点;优点是通用,不依赖UIView实例,可以在任何场景自由使用,在iPad/iPhone中可精准识别,无须做代码修改
- 方法一与方法二共同的缺点就是,如果在子线程中调用,都要先切回主线程,否则会导致崩溃
- 两种方法任君选择
|
|