【问题标题】:Xcode 11: Safe Area code implementation using Objective-C not workingXcode 11:使用 Objective-C 的安全区域代码实现不起作用
【发布时间】:2020-04-10 23:40:57
【问题描述】:

我是 iOS 应用程序开发的新手,目前正在开发使用 Objective-C 编写的现有 iOS 应用程序。我遇到了一个需要以编程方式实现安全区域的要求。所以我在“viewDidLoad”方法中实现了以下代码。

if(@available(iOS 11, *)){
    UILayoutGuide * guide = self.view.safeAreaLayoutGuide;
    [self.view.leadingAnchor constraintEqualToAnchor:guide.leadingAnchor].active = YES;
    [self.view.trailingAnchor constraintEqualToAnchor:guide.trailingAnchor].active = YES;
    [self.view.topAnchor constraintEqualToAnchor:guide.topAnchor].active = YES;
    [self.view.bottomAnchor constraintEqualToAnchor:guide.bottomAnchor].active = YES;
}else{
    UILayoutGuide * margins = self.view.layoutMarginsGuide;
    [self.view.leadingAnchor constraintEqualToAnchor:margins.leadingAnchor].active = YES;
    [self.view.trailingAnchor constraintEqualToAnchor:margins.trailingAnchor].active = YES;
    [self.view.topAnchor constraintEqualToAnchor:self.topLayoutGuide.bottomAnchor].active = YES;
    [self.view.bottomAnchor constraintEqualToAnchor:self.bottomLayoutGuide.topAnchor].active = YES;
}

但是,当我尝试运行连接到 iPhone XR iOS 模拟器设备的应用程序时,上面的代码不起作用。在横向模式下的安全区域之后视图没有开始,而是从安全区域本身开始,因此文本被截断

我错过了什么吗?您能否建议需要做什么才能实施安全区域?

【问题讨论】:

  • 尝试在 viewDidLayoutSubviews 中应用约束
  • 在您的代码中,没有文本的约束。请添加。
  • 之前我尝试为 UILabel 设置约束,但由于控件从显示区域移动,标签宽度正在增加。只有标签内容会显示在整个屏幕中。所以我已经将约束应用于视图。

标签: ios objective-c xcode11 safearealayoutguide


【解决方案1】:

您要在视图中布局什么 UI 元素?你提到文字被切断了。您提供的代码将视图中的锚点设置为自身不设置为 UI 元素。更新您的代码以将 UI 元素的锚点设置为视图。

UITextField *textField; // Your text UI element
UILayoutGuide * guide = self.view.safeAreaLayoutGuide;
[textField.leadingAnchor constraintEqualToAnchor:guide.leadingAnchor].active = YES;
[textField.trailingAnchor constraintEqualToAnchor:guide.trailingAnchor].active = YES;
[textField.topAnchor constraintEqualToAnchor:guide.topAnchor].active = YES;
[textField.bottomAnchor constraintEqualToAnchor:guide.bottomAnchor].active = YES;

【讨论】:

  • 是的,我也尝试将锚点设置为 UI 元素,但 UI 元素的大小会自动增加,使其适合屏幕并移动其他内容(在 UIElement 之后存在)向右,使它们不会显示在屏幕上。如何控制设置anchor的UIElement的宽度?
  • 根据您的锚点,我希望 textField 完全填满视图。可以使用widthAnchor 设置宽度,但是您不需要前导锚或尾锚。我建议您查看有关自动布局基础的教程。
【解决方案2】:

我建议你使用

constraintEqualToSystemSpacingAfterAnchor: multiplier:

constraintEqualToSystemSpacingBelowAnchor: multiplier:

而不是

constraintEqualToAnchor:

另外我建议您尝试手动将 translatesAutoresizingMaskIntoConstraints 设置为 NO:

textField.translatesAutoresizingMaskIntoConstraints = NO;

完整代码:

UITextField *textField = [[UITextField alloc] init];

textField.translatesAutoresizingMaskIntoConstraints = NO;

[self.view addSubview:textField];

if (@available(iOS 11, *)) {
    UILayoutGuide * guide = self.view.safeAreaLayoutGuide;

    [textField.leadingAnchor constraintEqualToSystemSpacingAfterAnchor:guide.leadingAnchor
                                                            multiplier:1.0].active = YES;

    [textField.trailingAnchor constraintEqualToSystemSpacingAfterAnchor:guide.trailingAnchor
                                                             multiplier:-1.0].active = YES;

    [textField.topAnchor constraintEqualToSystemSpacingBelowAnchor:guide.topAnchor
                                                        multiplier:1.0].active = YES;

    [textField.bottomAnchor constraintEqualToSystemSpacingBelowAnchor:guide.bottomAnchor
                                                           multiplier:1.0].active = YES;
} else {
    // ...
}

【讨论】:

  • 我之前已经尝试过这种情况,但是没有用。UI 元素的大小会自动增加,从而将其他内容从位于它旁边的屏幕上移开。尝试设置这些约束时,标签的宽度会增加。
  • 您能否提供一个简单的示例项目来重现问题?这样我就可以调试它并尝试找到问题原因。
猜你喜欢
  • 1970-01-01
  • 2017-06-05
  • 2017-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-29
相关资源
最近更新 更多