【问题标题】:Auto Layout and in-call status bar自动布局和通话状态栏
【发布时间】:2023-03-11 11:34:02
【问题描述】:

我想问一下自动布局和通话状态栏。这是一个演示我的问题的简单场景:

  1. 创建启用“使用情节提要”的项目
  2. 添加“视图控制器”并启用其“是初始视图控制器”
  3. 将控制器视图的背景颜色设置为红色
  4. 将“表格视图”添加到控制器视图中

表格视图应该有 4 个布局约束(前导、顶部、尾随、底部)到 Superview,常量设置为 0。

现在,当我在模拟器中运行此应用程序并按 + T 时,我可以看到红色背景,同时通话状态栏动画化。是否有可能获得摆脱这个故障?

【问题讨论】:

  • 在通话状态栏中会以动画形式显示这是一种行为,即使在退出应用后也可以进行检查。它是“切换通话状态栏按钮”。不知道红色背景。
  • 看起来类似的问题:stackoverflow.com/questions/25882609/…

标签: ios uiviewcontroller autolayout uistatusbar


【解决方案1】:

(由于缺乏声誉而使用答案而不是评论,对不起。)

我也遇到了这个问题,正在尝试例如上面指出的解决方案:它对我不起作用。

所以我created a repository 用示例代码来揭露原始海报的问题。这些场景有一些示例应用程序:

  1. 自定义视图控制器是窗口的根视图控制器,
  2. 自定义视图控制器是 UINavigationController 的子级,它是窗口的根视图控制器,
  3. 自定义视图控制器是 UITabBarController 的子级,它是窗口的根视图控制器,并且
  4. 自定义视图控制器是 UINavigationController 的子级,它是作为窗口根视图控制器的 UITabBarController 的子级。

事实证明solution from CEarwood 确实有效……当自定义视图控制器是 UINavigationController 的子级时(案例 2 和 4)。但是,它在情况 1 和 3 中不起作用。

我希望这些信息有用。

【讨论】:

    【解决方案2】:

    对于纯粹的自动布局答案,您可以获得对底部约束的引用并在收到 UIApplicationWillChangeStatusBarFrameNotification 时调整其常量,并在收到 DidChange 通知时调整回 0。这是我使用的测试 VC:

    @interface CEViewController ()
    
    @property (nonatomic, strong) IBOutlet NSLayoutConstraint *bottomConstraint;
    
    @end
    
    @implementation CEViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];        
    
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(statusBarFrameWillChange:) name:UIApplicationWillChangeStatusBarFrameNotification object:nil];
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(statusBarFrameDidChange:) name:UIApplicationDidChangeStatusBarFrameNotification object:nil];
    }
    
    - (void)statusBarFrameWillChange:(NSNotification *)note {
        NSValue *newFrameValue = [note userInfo][UIApplicationStatusBarFrameUserInfoKey];
    
        self.bottomConstraint.constant = newFrameValue.CGRectValue.size.height;
        [self.view setNeedsLayout];
    }
    
    - (void)statusBarFrameDidChange:(NSNotification *)note {
        self.bottomConstraint.constant = 0;
        [self.view setNeedsLayout];
    }
    
    @end
    

    【讨论】:

      【解决方案3】:

      这是屏幕大小调整的效果。

      当通话中状态栏出现时,视图会调整到通话中状态栏处于活动状态时应具有的大小,然后随着状态栏大小的变化而向下移动。

      在短时间内,表格视图下的视图是可见的。您可以做的是在表格视图下添加一个视图,该视图向下延伸到屏幕之外以掩盖背景颜色。

      另一种方法是使用您的AppDelegate,实现:

      -application:willChangeStatusBarFrame:
      

      并调整表格视图的大小以覆盖暴露的位。然后当 -application:didChangeStatusBarFrame: 被调用时,将其调整回原始大小。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多