iOS 10,swift 4.1,将视图的顶部锚点设置为 topLayoutGuide 底部锚点导致冲突

Posted

技术标签:

【中文标题】iOS 10,swift 4.1,将视图的顶部锚点设置为 topLayoutGuide 底部锚点导致冲突【英文标题】:iOS 10, swift 4.1, setting view's top anchor to topLayoutGuide bottom anchor causing conflicts 【发布时间】:2018-09-19 20:37:51 【问题描述】:

我正在尝试将视图的位置设置在状态栏下方。它适用于 ios 11+ 中的 safeAreaLayoutGuide,但我正在尝试使用我在网上找到的

这是我正在尝试的。

if #available(iOS 11.0, *) 
    let guide = parentController.view.safeAreaLayoutGuide
    NSLayoutConstraint.activate([view.topAnchor.constraintEqualToSystemSpacingBelow(guide.topAnchor, multiplier: 1.0),
                                 view.centerXAnchor.constraint(equalTo: parentController.view.centerXAnchor)])
 else 
    NSLayoutConstraint.activate([view.topAnchor.constraint(equalTo: topLayoutGuide.bottomAnchor),
                                 view.centerXAnchor.constraint(equalTo: parentController.view.centerXAnchor)])

在 iOS 10 的情况下,我遇到了这个问题(如下),不确定这个冲突来自哪里。

2018-09-19 13:31:20.097129 iOSTestAppSingleWorkspace[70650:12307124] [LayoutConstraints] Unable to simultaneously satisfy constraints.
    Probably at least one of the constraints in the following list is one you don't want. 
    Try this: 
        (1) look at each constraint and try to figure out which you don't expect; 
        (2) find the code that added the unwanted constraint or constraints and fix it. 
(
    "<_UILayoutSupportConstraint:0x60000028d020 _UILayoutSpacer:0x6000001ba4e0'UIVC-topLayoutGuide'.height == 20   (active)>",
    "<_UILayoutSupportConstraint:0x60000028ce40 V:|-(0)-[_UILayoutSpacer:0x6000001ba4e0'UIVC-topLayoutGuide']   (active, names: '|':UIView:0x7f92864249c0 )>",
    "<NSLayoutConstraint:0x60000028d0c0 V:[_UILayoutSpacer:0x6000001ba4e0'UIVC-topLayoutGuide']-(0)-[UIView:0x7f92864249c0]   (active)>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x60000028d0c0 V:[_UILayoutSpacer:0x6000001ba4e0'UIVC-topLayoutGuide']-(0)-[UIView:0x7f92864249c0]   (active)>

层次结构是一个带有子视图控制器的 UIViewController(parentController)(运行此代码,并引用父控制器)

子视图是在代码中添加的,并且可以放置在屏幕上的不同位置,在这种情况下它位于顶部中心。

【问题讨论】:

子视图控制器视图的顶部布局指南不会引用父视图控制器的顶部布局指南。就像您使用安全区域插图的布局指南一样,如果您参考父视图控制器的视图布局指南,您应该没问题。我想冲突的产生是因为您添加了第二个约束,即“我的视图低于我的顶部布局指南”,默认情况下已经是这种情况 啊,我明白了。这行得通,谢谢!如果您希望我标记它,请继续添加答案。 【参考方案1】:

您的子视图控制器视图的顶部布局指南不会引用您的父视图控制器的顶部布局指南。就像您使用安全区域插图的布局指南一样,如果您参考父视图控制器的视图布局指南,您应该没问题。我猜想冲突的产生是因为你添加了第二个约束,上面写着“我的视图低于我的顶部布局指南”,默认情况下已经是这种情况

【讨论】:

以上是关于iOS 10,swift 4.1,将视图的顶部锚点设置为 topLayoutGuide 底部锚点导致冲突的主要内容,如果未能解决你的问题,请参考以下文章

iOS横屏定位问题Swift SpriteKit

ViewController ios swift中的顶部栏显示上一个顶部栏

将 imageview 限制为 10% 的区域,顶部和前锚之间有空间

导航栏可以锚定到特定位置吗?

Swift iOS - 如何使 CollectionView 的单元格大小

更改约束以在 swift iOS 中扩展视图