保证能判断,呕心沥血,不行切JIJI

方法一


Objective-C

// iPhoneX、iPhoneXR、iPhoneXs、iPhoneXs Max等
// 判断刘海屏,返回YES表示是刘海屏
- (BOOL)isNotchScreen {
    
    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;
}

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中可精准识别,无须做代码修改
  • 方法一与方法二共同的缺点就是,如果在子线程中调用,都要先切回主线程,否则会导致崩溃
  • 两种方法任君选择

本文由 Harvey 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

2 条评论

  1. zhong
    zhong

    有用

  2. doudou
    doudou

    这个貌似没有起作用啊 ,我试了试 不行啊

添加新评论