什么是'UIView-Encapsulated-Layout-Width'约束?

时间:2014-01-16 12:27:22

标签: ios uicollectionview autolayout nslayoutconstraint uicollectionviewlayout

我一直得到'无法同时满足约束'的例外(Xcode 5,iOS 7,设备和模拟器),其中列表中的一个约束是这样的:

"<NSLayoutConstraint:0x165b23d0 'UIView-Encapsulated-Layout-Width'
H:[StoryPlayerCell:0x165affc0(0)]>"

我自己没有设置这个约束。它也不是NSAutoresizingMaskLayoutConstraint。 但是它来自哪里?我怎么能摆脱它?

我不知道。 我在Apple的文档中找不到关于'UIView-Encapsulated-Layout-Width'的任何内容。 即便是谷歌搜索也没有任何回报。

有什么建议吗?

PS:我在UICollectionView中使用此单元格,其自定义子类为UICollectionViewFlowLayout。也许'Encapsulated-Layout'部分与此有关?

6 个答案:

答案 0 :(得分:16)

快速而好的修复方法是将999优先级值分配给具有高优先级的自定义约束。封装的&amp;自动生成的约束应该优先于您的约束。

https://stackoverflow.com/a/25795758/590010

答案 1 :(得分:3)

我玩了样本,我认为这些代码导致了Autolayout异常。

CGFloat height = MAX(0, -y + maxY); CSStickyHeaderFlowLayout.m第79行。

如果您使用高度的静态值(如200),则不会再发生异常。我无法理解究竟什么是UIView-Encapsulated-Layout,但似乎动态更改UICollectionViewLayoutAttributes框架可能会导致该问题。在示例项目中,它是高度,在PO的问题中,我猜它是宽度。如果你认为这会有所帮助,也许我可以再深入研究一下

答案 2 :(得分:1)

我在iOS 10版本中发现了这一点,我使用UITableViewCell子类作为普通视图而不是表格行。单元格将其contentView约束为零宽度。

我使用的解决方法是将contentView添加到视图层次结构而不是tableview单元格。我还确保保留tableView单元格(因为它不再被视图层次结构本身保留)。

答案 3 :(得分:0)

我可以对这个问题的答案有所了解。在我的OS X应用程序中,我在NSTableView的单元格视图上发现了这样一个神秘的约束(也就是说,我之前在NSTableViewDelegate方法中返回的一个对象-tableView:viewForTableColumn:row)。我还向同一个表列发送了一个setWidth:0.0消息。将setWidth中的参数:从0.0更改为其他值反映在神秘约束的常量值中。

结论:使用“UIView-Encapsulated-Layout-Width”或“NSView-Encapsulated-Layout-Width”记录自身的约束是通过设置表列的宽度或类似内容引起的。

答案 4 :(得分:0)

我的情况

对于我来说,我(从逻辑上)知道我的程序限制应该有效。旋转设备后我正在更新它们。

我不更改约束的快速简便的解决方案是确保这一切都在主线程上完成。为什么?我不太确定,但是我认为轮换更新必须在异步线程中。

我如何解决

发件人:

topTitleLeadingAnchorLandscape.isActive = true

收件人:

DispatchQueue.main.async {
    self.topTitleLeadingAnchorLandscape.isActive = true
}

希望这可以为将来节省很多时间!

答案 5 :(得分:0)

我在添加到 df = pd.DataFrame(columns=[x['name'] for x in res['columnHeaders']]) df['datestamp'] = df.apply(lambda _: '', axis=1) # create an empty column for i in range(1,8): res_2 = execute_api_request( youtubeAnalytics.reports().query, ids='channel==MINE', startDate=(datetime.today()-timedelta(i)).strftime('%Y-%m-%d'), endDate=(datetime.today()-timedelta(i)).strftime('%Y-%m-%d'), dimensions='video', metrics='views,likes,dislikes,shares,estimatedMinutesWatched,subscribersGained,averageViewDuration,comments,cardImpressions,cardClicks,estimatedRevenue,adImpressions', maxResults=200, sort='-views' ) df_add = pd.DataFrame(res_2['rows'],columns=[x['name'] for x in res_2['columnHeaders']]) df_add['datestamp'] = datetime.today()-timedelta(i) print(df_add) df = df.append(df_add) 的基于 NSView 的表格单元格中遇到了这个问题。我在 NSTableView 上设置了固定宽度,因为它必须至少是该大小才能正确容纳内容。但是它可以更大。

将宽度约束从 NSView 更改为 NSLayoutRelationEqual 消除了警告。

从这里开始:

NSLayoutRelationGreaterThanOrEqual

对此,修复它:

[self addConstraint:[NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:panelWidth]];

这不是一个 100% 的解决方案,因为当 NSTableView 由于我仍然不清楚的原因决定它需要更小时,它仍然会抛出破坏约束警告。