我一直在玩弄动态 UICollectionViewCell 并注意到在 iOS 8 上调用cell.contentView.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize)
on a UICollectionViewCell
返回不正确的宽度。目前解决此问题的唯一解决方法是显式添加宽度约束以强制单元格的宽度。下面的代码在 Cell 子类中使用:
func calculatePreferredHeightForFrame(frame: CGRect) -> CGFloat {
var newFrame = frame
self.frame = newFrame
let widthConstraint = NSLayoutConstraint(item: contentView, attribute: .Width, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: CGRectGetWidth(frame))
contentView.addConstraint(widthConstraint)
self.setNeedsUpdateConstraints()
self.updateConstraintsIfNeeded()
self.setNeedsLayout()
self.layoutIfNeeded()
let desiredHeight: CGFloat = self.contentView.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize).height
newFrame.size.height = CGFloat(ceilf(Float(desiredHeight)))
contentView.removeConstraint(widthConstraint)
return CGRectGetHeight(newFrame)
}
我知道在 iOS 8 和动态 UICollectionViewFlowLayout 中,UICollectionViewCell 的 contentView 以不同的方式处理约束,但是我在这里缺少什么吗?需要做什么才能确保 systemLayoutSizeFittingSize 在单元格上使用特定宽度?
我也看到了这篇文章(使用自动布局指定 UICollectionView 中单元格的一维 https://stackoverflow.com/questions/26143591/specifying-one-dimension-of-cells-in-uicollectionview-using-auto-layout)并相信这实际上可能使我的问题无效。也许 UICollectionViewFlowLayout 不是为只有一个动态维度的单元格设计的,但这仍然不能解释为什么单元格给出了不寻常的宽度。
我也遇到过同样的问题。关键是在获取systemLayoutSize时使用优先级。
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
if (!self.prototypeCell) {
self.prototypeCell = [TrainingMenuCell new];
self.prototypeCell.contentView.translatesAutoresizingMaskIntoConstraints = NO;
}
[self configureCell:self.prototypeCell forIndexPath:indexPath];
[self.prototypeCell setNeedsLayout];
[self.prototypeCell layoutIfNeeded];
CGFloat width = CGRectGetWidth(collectionView.frame) - 12;
CGSize fittingSize = UILayoutFittingCompressedSize;
fittingSize.width = width;
CGSize size = [self.prototypeCell.contentView systemLayoutSizeFittingSize:fittingSize withHorizontalFittingPriority:UILayoutPriorityRequired verticalFittingPriority:UILayoutPriorityDefaultLow];
return size;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)