【问题标题】:UICollectionView Cell + UiLabel with AutoLayoutUICollectionView Cell + UiLabel 与 AutoLayout
【发布时间】:2014-11-04 10:24:00
【问题描述】:

我正在尝试将 UILabel 固定到它的父单元格。我添加了四个约束(顶部、前导、尾随、底部)在 iOS 8.0 上运行良好,但在 iOS 7.X 上却不行。请看下图:

[Click here for full size]

我做错了什么?请指教!

编辑#1

它似乎是自 Xcode 6 GM 以来才被破坏的。我的方法在 Xcode 6 beta 7 中运行良好。

此外,如果我减小内部视图的宽度,它会引发以下警告:

2014-09-10 19:58:28.109 Test[57827:60b] 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. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
    "<NSLayoutConstraint:0x799573a0 H:|-(8)-[UIView:0x798a86e0]   (Names: '|':UIView:0x798ae5d0 )>",
    "<NSLayoutConstraint:0x799573d0 H:[UIView:0x798a86e0]-(43)-|   (Names: '|':UIView:0x798ae5d0 )>",
    "<NSAutoresizingMaskLayoutConstraint:0x798a8b00 h=--& v=--& H:[UIView:0x798ae5d0(50)]>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x799573d0 H:[UIView:0x798a86e0]-(43)-|   (Names: '|':UIView:0x798ae5d0 )>

Break on objc_exception_throw to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.

【问题讨论】:

  • 尝试将UILabel的宽高设置为容器。
  • 我该怎么做?它已禁用(灰显)
  • Ctrl + 从 UILabel 拖动到容器,然后选择等宽和等高。您必须分两步完成。
  • 我没有这个选项!只有这些...i.imgur.com/NTVwcOC.png
  • 我遇到了完全相同的问题。它曾经在 iOS7 的 Xcode 6 Beta 7 上工作,但现在在 iOS7 上的 XCode 6 GM 上工作,没有遵守限制。

标签: ios iphone uicollectionview autolayout uicollectionviewcell


【解决方案1】:

我希望你已经为集合添加了关于它的父视图(这将是 UIViewController 的视图)的约束,以便它的宽度和高度等于父视图。

【讨论】:

  • 这是一个 UICollectionViewController,所以我不必这样做!
  • 您是否也尝试设置水平居中和垂直居中?
【解决方案2】:

而不是给出四个约束(顶部、前导、尾随、底部)。尝试顶部、前导、宽度和高度。它应该可以工作。

【讨论】:

  • 这为我解决了这个问题,但这不是我需要的,因为 w&h 是可变的。
【解决方案3】:

覆盖自定义单元格的layoutSubviews 是一种可能的解决方法:

override func layoutSubviews() {
    contentView.frame = bounds
    super.layoutSubviews()
}

【讨论】:

  • 哇,这神奇地消除了我的幽灵约束:&lt;NSAutoresizingMaskLayoutConstraint:0x7fb942895a20 h=--&amp; v=--&amp; H:[UIView:0x7fb942891cf0(50)]&gt;。你能解释一下这是如何解决这个问题的吗?我是否正确假设这是因为单元格的 contentView 带有默认边距(从外观上看是 8px)?
【解决方案4】:

UIView:0x798ae5d0 是 CollectionViewCell 的 contentView。不知何故,它在某个时刻使用了 UICollectionViewCells defaultSize,即 (50.0, 50.0)。

<NSAutoresizingMaskLayoutConstraint:0x798a8b00 h=--& v=--& H:[UIView:0x798ae5d0(50)]>

由于您的水平边距 8 + 43 = 51 大于 contentView (50),因此无法满足布局。

<NSLayoutConstraint:0x799573a0 H:|-(8)-[UIView:0x798a86e0]   (Names: '|':UIView:0x798ae5d0 )>
<NSLayoutConstraint:0x799573d0 H:[UIView:0x798a86e0]-(43)-|  (Names: '|':UIView:0x798ae5d0 )>

可以使布局更加灵活,使其也适用于 (50.0, 50.0) 大小。在您的情况下,将 equal 43 更改为

【讨论】:

  • 这应该是公认的答案。除了更简洁之外,它还使用了预期的自动布局优先级。例如添加像H:|-8@750-[view]-43@750-| 这样的优先级,应该可以消除警告。涉及覆盖layoutSubviews 的答案设置了contentView 的框架,使用自动布局时应避免使用。
【解决方案5】:

问题是您的自定义视图 (UILabel) 有约束,这与单元格(或更好的单元格的 contentView)的约束冲突。单元格的 NSAutoresizingMaskLayoutConstraint 是根据您在 xib(或故事板)的 UICollectionView 属性中设置的单元格大小自动创建的。我已经通过显式设置解决了我的类似问题(*)

- (void)awakeFromNib {

    [super awakeFromNib];

    self.contentView.translatesAutoresizingMaskIntoConstraints = NO;
}

在我的自定义 UICollectionViewCell 子类中。这摆脱了 Storyboard 中设置的单元格大小限制。

(*) 免责声明:我的 collectionView 具有基于其内容视图的自调整单元格大小,该内容视图由自动布局定义。我收到了关于我的内容自动布局的冲突约束和 Storyboard 中的显式大小的警告。这帮助我摆脱了这些警告。

【讨论】:

  • - (void)awakeFromNib 方法应该调用[super awakeFromNib];
  • 这对我有用:Xcode 9.0 beta3 iOS 11 beta
【解决方案6】:

我在项目中发现的另一种可能性。

通常我复制/粘贴相似的对象,但这样做有时会持有相同的 ID。
所以我通过从头开始创建一个对象来解决我的约束问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-03
    • 1970-01-01
    • 1970-01-01
    • 2015-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-26
    相关资源
    最近更新 更多