iOS开发:如何在iPhone刘海/灵动岛下方放置App Logo
实现Telegram式Logo布局:刘海/灵动岛下方放置App Logo
现有代码分析
你提供的刘海检测代码在大部分带刘海的iOS设备上是可行的,但它只能判断设备是否存在顶部凹槽,无法区分普通刘海和灵动岛,也没法获取凹槽的具体位置与尺寸,没法满足精准布局Logo的需求。
完整解决方案
下面是改进后的代码,既能区分普通刘海和灵动岛,还能获取它们的位置尺寸,同时实现Logo自动布局到凹槽正下方:
1. 扩展UIWindow,添加凹槽检测与尺寸获取方法
import UIKit extension UIWindow { // 判断是否存在顶部凹槽(刘海/灵动岛) var hasTopGroove: Bool { guard #available(iOS 11.0, *) else { return false } return safeAreaInsets.top > 20 } // 判断是否为灵动岛设备 var hasDynamicIsland: Bool { guard #available(iOS 16.0, *), hasTopGroove else { return false } // 灵动岛设备顶部安全区高度大于普通刘海设备(普通刘海为44,灵动岛设备通常为59左右) return safeAreaInsets.top > 47 } // 获取顶部凹槽(刘海/灵动岛)的frame var topGrooveFrame: CGRect { guard hasTopGroove else { return .zero } let screenWidth = UIScreen.main.bounds.width // 根据设备类型设置凹槽宽高:灵动岛宽度随屏幕尺寸变化,普通刘海宽度固定 let grooveWidth: CGFloat = hasDynamicIsland ? (screenWidth == 2532 ? 136 : 129) : 278 let grooveHeight: CGFloat = hasDynamicIsland ? 37 : 30 // 计算居中X坐标,Y坐标为安全区顶部减去凹槽高度(安全区顶部是凹槽下方位置) let grooveX = (screenWidth - grooveWidth) / 2 let grooveY = safeAreaInsets.top - grooveHeight return CGRect(x: grooveX, y: grooveY, width: grooveWidth, height: grooveHeight) } }
2. 修改LogoWindow类,实现自动布局
class LogoWindow: UIWindow { private let logoImageView = UIImageView(image: UIImage(named: "AppLogo")) override init(frame: CGRect) { super.init(frame: frame) commonInit() } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) commonInit() } private func commonInit() { logoImageView.contentMode = .scaleAspectFit // 关闭自动布局转换,使用AutoLayout精准布局 logoImageView.translatesAutoresizingMaskIntoConstraints = false addSubview(logoImageView) // 将Logo布局在顶部凹槽正下方,水平居中,间距可自定义 NSLayoutConstraint.activate([ logoImageView.centerXAnchor.constraint(equalTo: centerXAnchor), logoImageView.topAnchor.constraint(equalTo: topAnchor, constant: safeAreaInsets.top + 8), logoImageView.widthAnchor.constraint(equalToConstant: 60), logoImageView.heightAnchor.constraint(equalToConstant: 30) ]) logoImageView.layer.zPosition = CGFloat(Float.greatestFiniteMagnitude) } }
关键说明
- 灵动岛检测逻辑:通过iOS16+系统版本判断,结合顶部安全区高度区分,避免硬编码设备型号,适配性更强。
- 凹槽尺寸计算:普通刘海和灵动岛的宽高是固定特征值,结合屏幕宽度适配不同灵动岛设备(如iPhone14 Pro与15 Pro的灵动岛宽度略有差异)。
- AutoLayout布局:替代固定frame,确保设备旋转或屏幕尺寸变化时,Logo始终保持在凹槽正下方居中位置。
内容的提问来源于stack exchange,提问作者Kyryl Nevedrov
相关产品推荐
相关产品推荐

