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

Xamarin iOS中通话状态栏出现时如何调整视图大小?

我之前在Xamarin iOS项目里也遇到过一模一样的问题——想用ObserveWillChangeStatusBarFrame监听通话状态栏的出现,结果完全没触发。折腾了好一阵,终于找到几个靠谱的替代方案,分享给你:

方案1:重写ViewWillLayoutSubviews回调

当状态栏高度变化时,系统会自动调用ViewController的ViewWillLayoutSubviews方法,这是最直接的监听方式。你可以在这里获取最新的状态栏高度,然后调整视图布局:

public override void ViewWillLayoutSubviews()
{
    base.ViewWillLayoutSubviews();
    
    // 获取当前状态栏高度(兼容iOS 13+)
    double statusBarHeight;
    if (UIDevice.CurrentDevice.CheckSystemVersion(13, 0))
    {
        var windowScene = UIApplication.SharedApplication.ConnectedScenes
            .OfType<UIWindowScene>()
            .FirstOrDefault();
        statusBarHeight = windowScene?.StatusBarManager?.StatusBarFrame.Height ?? 0;
    }
    else
    {
        statusBarHeight = UIApplication.SharedApplication.StatusBarFrame.Height;
    }

    // 调整你的视图约束或Frame,比如修改顶部约束的Constant值
    yourTopViewConstraint.Constant = statusBarHeight;
    View.LayoutIfNeeded();
}
方案2:监听DidChangeStatusBarFrameNotification通知

原来的WillChangeStatusBarFrameNotification确实存在触发不稳定的问题,换成DidChangeStatusBarFrameNotification会靠谱很多。记得在视图销毁时移除观察者,避免内存泄漏:

public override void ViewDidLoad()
{
    base.ViewDidLoad();
    
    // 添加状态栏变化监听
    NSNotificationCenter.DefaultCenter.AddObserver(
        UIApplication.DidChangeStatusBarFrameNotification, 
        OnStatusBarFrameChanged);
}

private void OnStatusBarFrameChanged(NSNotification notification)
{
    if (notification.UserInfo == null) return;
    
    // 从通知信息里获取新的状态栏Frame
    var statusBarFrame = (CGRect)notification.UserInfo[UIApplication.StatusBarFrameUserInfoKey];
    var newStatusBarHeight = statusBarFrame.Height;

    // 这里处理视图布局调整
    yourTopViewConstraint.Constant = newStatusBarHeight;
    View.LayoutIfNeeded();
}

public override void ViewWillDisappear(bool animated)
{
    base.ViewWillDisappear(animated);
    
    // 移除观察者
    NSNotificationCenter.DefaultCenter.RemoveObserver(
        this, 
        UIApplication.DidChangeStatusBarFrameNotification);
}
额外注意事项
  • 确保你的ViewController没有设置PrefersStatusBarHidden = true,否则状态栏相关的回调和通知都不会触发。
  • 如果你的页面嵌套在UINavigationController里,可能需要自定义导航控制器,或者确保子ViewController的布局回调能被正确触发(比如导航控制器的ViewWillLayoutSubviews会转发给子视图)。

内容的提问来源于stack exchange,提问作者DJB

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:12:14