我试图做一些相当简单的事情,但我一直都会遇到错误。
我有一个包含多个部分的UITableView。每个部分都有一个标题和一个UITableViewCell。每个单元格内都有一个UICollectionView。所有这些视图都必须以编程方式创建(无论如何都不需要故事板解决方案)。
问题是当我尝试调整UICollectionView的大小和位置时。我希望UICollectionView能够填充整个UITableViewCell,所以最初我尝试使用self.frame在UITableViewCell的init方法中调整UICollectionView的大小,如下所示:
var collectionView: UICollectionView? let collectionViewLayout: UICollectionViewFlowLayout! override init(style: UITableViewCellStyle, reuseIdentifier: String?) { self.collectionViewLayout = UICollectionViewFlowLayout() self.collectionViewLayout.sectionInset = UIEdgeInsets(top: 1.0, left: 1.0, bottom: 1.0, right: 1.0) self.collectionViewLayout.scrollDirection = .vertical super.init(style: style, reuseIdentifier: reuseIdentifier) let frame = CGRect(x: 0.0, y: 0.0, width: self.frame.width, height: self.frame.height) self.collectionView = UICollectionView(frame: frame, collectionViewLayout: self.collectionViewLayout) self.collectionView?.dataSource = self self.collectionView?.delegate = self }
但是,我认为此时未设置UITableViewCell的帧(init方法调用),因此UICollectionView的大小不正确。那是对的吗?
接下来,我尝试使用布局锚点,如下所示:
collectionView?.bottomAnchor.constraint(equalTo: self.bottomAnchor).isActive = true
这给了我一个布局约束错误,并说'UICollectionViewProject [63851:2306772] [LayoutConstraints]无法同时满足约束。'我不明白这是怎么回事。我只添加了一个约束,故事板中没有任何内容,它可能会破坏什么约束?
不知何故,我需要使这个UICollectionView与UITableViewCell的大小相同,并且完美地适应它。同样,这必须以编程方式完成,不得使用故事板。请让我知道我需要做什么。谢谢。
答案 0 :(得分:3)
在您的代码中,您只添加了1 constraint
- bottomAnchor
。 Autolayout
不起作用。添加constraints
作为UICollectionView
的{{1}}后,只需添加所有必需的subview
,即
UITableViewCell
答案 1 :(得分:1)
您为集合视图设置的大小将根据自动布局覆盖(从集合视图默认自动调整掩码自动翻译),因此您需要设置相应的约束。
如果您希望收藏视图填满整个单元格,请尝试在init
方法的末尾添加以下代码:
collectionView.translatesAutoresizingMaskIntoConstraints = false
addSubview(collectionView)
let layoutAttributes: [NSLayoutAttribute] = [.top, .bottom, .leading, .trailing]
let constraints = layoutAttributes.map {
NSLayoutConstraint(item: self, attribute: $0, relatedBy: .equal, toItem: collectionView, attribute: $0, multiplier: 1.0, constant: 0.0)
}
NSLayoutConstraint.activate(constraints)
然后,您必须计算集合视图的高度,并在方法tableView(_:, heightForRowAt:)
中告诉您的表格视图委托。