以Swift编程方式为navigationBar添加约束条件

8
我试图为导航栏添加约束条件,我有一个UIImageView,它具有宽度、高度并且水平居中。我想在UIImagenavigationBar之间添加垂直间距为0,我已经尝试了1个小时还是无法解决问题。我尝试将约束添加到UIView上,并添加navbarHeight + statusBarHeight的常量,这样可以工作,但我想让imageviewnavbar建立关系。
let verticalSpace = NSLayoutConstraint(item: image, attribute: .Top, relatedBy: .Equal, toItem: self.view, attribute: .Top, multiplier: 1, constant: 0)
view.addConstraint(verticalSpace) // this works
5个回答

15

尝试使用topLayoutGuide

let verticalSpace = NSLayoutConstraint(item: image,  
                                       attribute: .Top,  
                                       relatedBy: .Equal,  
                                       toItem: self.topLayoutGuide,  
                                       attribute: .Bottom,  
                                       multiplier: 1, constant: 0)  

上述约束说明:

简单地说,它被称为:图像顶部与self.topLayoutGuide底部之间的垂直间距=0

这意味着image view的Top约束与topLayoutGuide的Bottom属性连接,且常数为0。

您也可以使用anchors来实现此目的,适用于iOS 10+

if #available(iOS 11.0, *) {
   image.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor).isActive = true
} else {
   image.topAnchor.constraint(equalTo: topLayoutGuide.bottomAnchor).isActive = true
}

1
是的,这个可以用,但您能否解释一下这两个“attributes”之间的区别?一个是.Top,一个是.Bottom,为什么会这样? - nikagar4
我刚意识到在使用 outlet UIImageView 时这个不起作用,你能告诉我为什么吗? - nikagar4
让我们在聊天中继续这个讨论。点击此处进入聊天室 - Bhavin Bhadani
当我创建“let imageView”并添加此verticalSpace时,它可以完美地工作,但是当我尝试在@IBOutlet imageView上执行此操作时,它不起作用。我在storyboard中创建了imageview,以便可以看到发生了什么,并且约束不再起作用,除了我不再通过编程方式添加imageview,而是在storyboard中添加它。 - nikagar4
@EICaptainv2.0,您能否更新您的答案以反映出Andy Novak的答案所说的iOS 10之后的情况:https://dev59.com/S5Tfa4cB1Zd3GeqPSpJN#51219283 - Bruno Bieri

9

iOS 11.0+下llkenny的答案是:

image.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor).isActive = true

3

使用锚点:

image.topAnchor.constraint(equalTo: topLayoutGuide.bottomAnchor).isActive = true

0
在故事板中。两个约束条件:

第一件事:

enter image description here

第二个:

enter image description here

结果:

enter image description here


-1

UICollectionViewExample 代码:

func mainCollectionViewConstraint() {
        NSLayoutConstraint.activate([
            mainCollectionView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 10),
        mainCollectionView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
        mainCollectionView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
        mainCollectionView.trailingAnchor.constraint(equalTo: view.trailingAnchor)
    ])
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接