You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS开发:如何在iPhone刘海/灵动岛下方放置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 06:13:13