我正在尝试为待办事项列表类型的应用程序制作详细信息屏幕。以下是详细信息屏幕当前的样子:
这是一个UICollectionViewController
, 带有一个标题。标头包含 2 个UILabel
对象和一个UITextView
对象。这些对象的布局由一个垂直的UIStackView
. AUIView
用于设置白色背景。
我UICollectionReusableView
在运行时定义它的高度时遇到了一些困难。任何建议表示赞赏。
我正在尝试为待办事项列表类型的应用程序制作详细信息屏幕。以下是详细信息屏幕当前的样子:
这是一个UICollectionViewController
, 带有一个标题。标头包含 2 个UILabel
对象和一个UITextView
对象。这些对象的布局由一个垂直的UIStackView
. AUIView
用于设置白色背景。
我UICollectionReusableView
在运行时定义它的高度时遇到了一些困难。任何建议表示赞赏。
这有点像黑客,但似乎有效。
// showhere to keep a reference
UICollectionReusableView * _cachedHeaderView;
- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView
viewForSupplementaryElementOfKind:(NSString *)kind
atIndexPath:(NSIndexPath *)indexPath{
if(!_cachedHeaderView){
// dequeue the cell from storyboard
_cachedHeaderView =
[collectionView dequeueReusableCellWithReuseIdentifier:@"header_cell"
forIndexPath:indexPath];
// set captions/images on the header etc...
// tell the collectionview to redraw this section
[self.collectionView reloadSections:[NSIndexSet
indexSetWithIndex:indexPath.section]];
}
return _cachedHeaderView;
}
- (CGSize)collectionView:(UICollectionView *)collectionView
layout:(UICollectionViewLayout*)collectionViewLayout
referenceSizeForHeaderInSection:(NSInteger)section{
// once there is a reference ot the view, use it to figure out the height
if(_cachedHeaderView){
CGSize size =
[_cachedHeaderView systemLayoutSizeFittingSize:collectionView.bounds.size
withHorizontalFittingPriority:UILayoutPriorityRequired
verticalFittingPriority:UILayoutPriorityDefaultLow];
return size;
}
// a placeholder value just to get the dequeueReusableCellWithReuseIdentifier to work
return CGSizeMake(collectionView.bounds.size.width, 100);
}
以下是如何在没有 XIB 文件的情况下使用自动布局处理自定义 UICollectionViewReusableView。
referenceSizeForHeaderInSection
委托方法。setNeedsLayout
和layoutIfNeeded
注意:我不是这个解决方案的忠实拥护者,因为它每次都会将自定义视图添加到 collectionview 的超级视图中,以执行计算。我没有注意到任何性能问题。
注意#2:我将其视为临时解决方案,并在发布后迁移到自调整大小的补充视图。
我将PureLayout用于自动布局。
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {
let header = CustomHeaderView()
header.isHidden = true;
self.view.addSubview(header)
header.autoPinEdge(toSuperviewEdge: .leading)
header.autoPinEdge(toSuperviewEdge: .trailing)
header.autoPin(toTopLayoutGuideOf: self, withInset: 0)
header.setupHeader(withData: self.data)
header.setNeedsLayout()
header.layoutIfNeeded()
header.removeFromSuperview()
return header.frame.size
}