以编程方式将约束添加到导航栏 Swift

Posted

技术标签:

【中文标题】以编程方式将约束添加到导航栏 Swift【英文标题】:Add Constraint to navigationBar Programmatically Swift 【发布时间】:2016-02-29 08:16:10 【问题描述】:

我正在尝试向导航栏添加约束,我有UIImageView,它有宽度、高度并且水平居中,我想在UIImagenavigationBar 之间添加垂直空间为0,我是尝试了大约 1 小时,但不知道怎么做,我尝试向 UIView 添加约束,并添加 navbarHeight + statusBarHeight 的常量,它起作用了,但我想在 imageview 和导航栏之间建立关系

let verticalSpace = NSLayoutConstraint(item: image, attribute: .Top, relatedBy: .Equal, toItem: self.view, attribute: .Top, multiplier: 1, constant: 0)
view.addConstraint(verticalSpace) // this works

【问题讨论】:

【参考方案1】:

试试topLayoutGuide

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

上述约束说明:

简称:image.Top & self.topLayoutGuide.Bottom = 0

这意味着图像视图的顶部约束附加了 topLayoutGuide 的底部属性,常量为 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

【讨论】:

是的,这行得通,但是您能否解释一下这两个“属性”之间的区别,一个说 .Top 一个说 .Bottom,这是为什么呢? 我刚刚意识到这在使用插座 UIImageView 时不起作用,你能告诉我为什么吗? 让我们continue this discussion in chat。 当我创建“let imageView”并添加这个verticalSpace时,它工作得很好,但是当我尝试在@IBOutlet imageView上这样做时它没有,我在故事板中创建了imageview,所以我可以看到发生了什么on 和约束不再起作用,没有更改代码,除了以编程方式添加 imageview 我将其添加到情节提要中 @EICaptainv2.0 能否更新您的答案以反映 iOS 10 的发布,就像 Andy Novak 的回答说:***.com/a/51219283【参考方案2】:

llkenny 对 iOS 11.0+ 的回答: image.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor).isActive = true

【讨论】:

【参考方案3】:

使用锚点:

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

【讨论】:

【参考方案4】:

在故事板中。两个约束:

第一个:

第二个:

结果:

【讨论】:

【参考方案5】:

代码:

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)
    ])

【讨论】:

以上是关于以编程方式将约束添加到导航栏 Swift的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式在导航栏正下方添加视图?

swift Swift - 以编程方式添加导航栏标题和按钮

如何以编程方式创建标签栏控制器后添加导航界面(Swift)

Swift:以编程方式嵌入标签栏控制器后,导航栏消失

以编程方式将按钮添加到导航栏

以编程方式将系统图像添加到导航栏