gpt4 book ai didi

ios - 使用自动布局指定动态通知中心小部件高度

转载 作者:行者123 更新时间:2023-11-29 12:26:52 26 4
gpt4 key购买 nike

我的通知中心小部件需要根据其包含的内容具有动态高度。我有一个简单的界面 - 一个 UILabel,下面有一个 UICollectionView。 ( Collection View 将根据我为流布局中的单元格提供的大小增加高度。)

为了正确指定小部件的高度,需要哪些约束?

我认为在标签上提供顶部约束以将其固定到 View 的顶部就足够了,指定 Collection View 的顶部与标签的底部对齐,然后为 Collection View 提供固定的高度(当itemSize 更改),然后将 Collection View 的底部与 View 的底部对齐。但这会导致两个破坏约束 - Collection View 的高度和标签与 Collection View 之间的垂直约束。

let label = //...
label.setTranslatesAutoresizingMaskIntoConstraints(false)
self.view.addSubview(label)
self.view.addConstraint(NSLayoutConstraint(item: label, attribute: .Top, relatedBy: .Equal, toItem: self.view, attribute: .Top, multiplier: 1, constant: 10))
self.view.addConstraint(NSLayoutConstraint(item: label, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .Height, multiplier: 1, constant: 25))
self.view.addConstraint(NSLayoutConstraint(item: label, attribute: .Leading, relatedBy: .Equal, toItem: self.view, attribute: .LeadingMargin, multiplier: 1, constant: 0))
self.view.addConstraint(NSLayoutConstraint(item: label, attribute: .Trailing, relatedBy: .Equal, toItem: self.view, attribute: .TrailingMargin, multiplier: 1, constant: 0))

let collectionView = //...
collectionView.setTranslatesAutoresizingMaskIntoConstraints(false)
self.view.addSubview(collectionView)
self.view.addConstraint(NSLayoutConstraint(item: collectionView, attribute: .Leading, relatedBy: .Equal, toItem: label, attribute: .Leading, multiplier: 1, constant: 0))
self.view.addConstraint(NSLayoutConstraint(item: collectionView, attribute: .Trailing, relatedBy: .Equal, toItem: label, attribute: .Trailing, multiplier: 1, constant: 0))
self.view.addConstraint(NSLayoutConstraint(item: collectionView, attribute: .Top, relatedBy: .Equal, toItem: label, attribute: .Bottom, multiplier: 1, constant: 0))
self.view.addConstraint(NSLayoutConstraint(item: collectionView, attribute: .Bottom, relatedBy: .Equal, toItem: self.view, attribute: .Bottom, multiplier: 1, constant: 0))
self.collectionViewHeightConstraint = NSLayoutConstraint(item: collectionView, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .Height, multiplier: 1, constant: 100)
collectionView.addConstraint(self.collectionViewHeightConstraint)

//later on
let flowLayout = collectionView.collectionViewLayout as UICollectionViewFlowLayout
flowLayout.itemSize = //some new size
self.collectionViewHeightConstraint.constant = flowLayout.itemSize.height * numberOfRows

问题:

Unable to simultaneously satisfy constraints.
"<NSLayoutConstraint:0x6080000998c0 V:|-(10)-[UILabel:0x6000001db300] (Names: '|':UIView:0x60800018f700 )>",
"<NSLayoutConstraint:0x608000099e60 V:[UILabel:0x6000001db300(25)]>",
"<NSLayoutConstraint:0x60800009a2c0 V:[UILabel:0x6000001db300]-(0)-[UICollectionView:0x7ff94b02c200]>",
"<NSLayoutConstraint:0x60800009a310 UICollectionView:0x7ff94b02c200.bottom == UIView:0x60800018f700.bottom>",
"<NSLayoutConstraint:0x60800009a360 V:[UICollectionView:0x7ff94b02c200(100)]>",
"<NSLayoutConstraint:0x60800009a4f0 'UIView-Encapsulated-Layout-Height' V:[UIView:0x60800018f700(667)]>"
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x60800009a360 V:[UICollectionView:0x7ff94b02c200(100)]>

Unable to simultaneously satisfy constraints.
"<NSLayoutConstraint:0x6080000998c0 V:|-(10)-[UILabel:0x6000001db300] (Names: '|':UIView:0x60800018f700 )>",
"<NSLayoutConstraint:0x608000099e60 V:[UILabel:0x6000001db300(25)]>",
"<NSLayoutConstraint:0x60800009a2c0 V:[UILabel:0x6000001db300]-(0)-[UICollectionView:0x7ff94b02c200]>",
"<NSLayoutConstraint:0x60800009a310 UICollectionView:0x7ff94b02c200.bottom == UIView:0x60800018f700.bottom>",
"<NSLayoutConstraint:0x60800009a4f0 'UIView-Encapsulated-Layout-Height' V:[UIView:0x60800018f700(0)]>"
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x60800009a2c0 V:[UILabel:0x6000001db300]-(0)-[UICollectionView:0x7ff94b02c200]>

最佳答案

在第一组冲突约束中,问题实际上是您的 View 最终比通知中心似乎想要的要短。以下是约束条件,稍微重新排序以便从上到下阅读:

<NSLayoutConstraint:0x6080000998c0 V:|-(10)-[UILabel:0x6000001db300]   (Names: '|':UIView:0x60800018f700 )>
<NSLayoutConstraint:0x608000099e60 V:[UILabel:0x6000001db300(25)]>
<NSLayoutConstraint:0x60800009a2c0 V:[UILabel:0x6000001db300]-(0)-[UICollectionView:0x7ff94b02c200]>
<NSLayoutConstraint:0x60800009a360 V:[UICollectionView:0x7ff94b02c200(100)]>
<NSLayoutConstraint:0x60800009a310 UICollectionView:0x7ff94b02c200.bottom == UIView:0x60800018f700.bottom>

因此,容器 View (UIView:0x60800018f700) 需要 10 + 25 + 100 == 135 点高。这与通知中心强加的约束冲突:

<NSLayoutConstraint:0x60800009a4f0 'UIView-Encapsulated-Layout-Height' V:[UIView:0x60800018f700(667)]>

这决定了 667 点的高度。

通知中心希望容器 View 高于您的约束允许的高度。您可以将 Collection View 底部与其父 View 底部之间的约束更改为不等式——父 View 底部大于或等于 Collection View 底部。或者,您可以将 Collection View 的高度约束更改为不等式 — 高度大于或等于 100。

然而,第二种情况是相反的问题。在这种情况下,通知中心已将容器 View 的高度设置为 0。您的约束要求高度不为零,因此这是一个冲突。您的限制,稍微重新排序:

<NSLayoutConstraint:0x6080000998c0 V:|-(10)-[UILabel:0x6000001db300]   (Names: '|':UIView:0x60800018f700 )>
<NSLayoutConstraint:0x608000099e60 V:[UILabel:0x6000001db300(25)]>
<NSLayoutConstraint:0x60800009a2c0 V:[UILabel:0x6000001db300]-(0)-[UICollectionView:0x7ff94b02c200]>
<NSLayoutConstraint:0x60800009a310 UICollectionView:0x7ff94b02c200.bottom == UIView:0x60800018f700.bottom>

容器的高度必须为 10 + 25 + Collection View 的高度(隐式 >=0)>= 35 点高。通知中心的约束:

<NSLayoutConstraint:0x60800009a4f0 'UIView-Encapsulated-Layout-Height' V:[UIView:0x60800018f700(0)]>

我不清楚为什么通知中心会像这样改变强加的高度。这似乎是在通过忽略 Collection View 高度解决了第一个冲突之后发生的,因为此日志中忽略了这一点。

尝试修复第一个,看看第二个是否消失。如果没有,您可以将 Collection View 底部和 super View 底部之间的约束优先级降低到,比如说,900。这仍然几乎是必需的,因此应该尽可能保留您的布局,但它不是实际上需要更长的时间——它是可选的——所以它不会导致无法满足的约束。

关于ios - 使用自动布局指定动态通知中心小部件高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28804576/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com