我想在UICollectionView
的每个单元格中显示图像。图片的宽度应与屏幕相同,但图片的高度取决于图片的大小。我想确保图像限制在宽高比范围内(例如1.91到4/5)。存储在服务器上的图像可以是任何纵横比。因此,它们不受约束。当显示在UICollectionViewCell
中时,如果它们小于或大于边界框范围(即1.91到4/5),则应该填充比例尺。
例如,如果图像的宽高比为2:1,则应将其固定为1.91:1。如果纵横比为1:2,则应将其固定为4:5。我想使用新的UICollectionViewCompositionalLayout
。
为此,我最初想到的是对高度进行预先计算,并将其存储在数据模型中,然后基于此来更新视图高度。参见View height constraints are not set correctly as I scroll UICollectionView up and down,但该方法存在问题。
我的初学者问题是,是否可以为同一个锚定义两个约束以定义范围?
_imageContainer.heightAnchor.constraintGreaterThanOrEqualToAnchor(_imageContainer.widthAnchor, multiplier: 4.0/5).active = true
_imageContainer.heightAnchor.constraintLessThanOrEqualToAnchor(_imageContainer.widthAnchor, multiplier: 1.91).active = true
以上代码的目标是定义范围约束。第二个约束是否会覆盖第一个约束,以便第一个约束不再有效?其次,关于在不同高度显示图像的上述问题,推荐的方法是什么?
是的,与Google在其图像API中一样,将图像尺寸存储在数据库中。
请参阅其自定义搜索API的路线
customsearch / v1
它返回
@"pagemap.cse_thumbnail.width"
@"pagemap.cse_thumbnail.height"
一旦有了这些值,然后在UICollectionView的delgate方法中,特别是sizeForItemAtIndexPath
,您将从服务器查询中拉出这些存储的值,然后将单元格的大小归一化为等于屏幕总宽度和高度的宽度调整以适应。
您将使用像这样的函数以标准化的方式获得像元的大小
static CGFloat CustomFloatCalc(CGFloat value) {
CGFloat scale = [UIScreen mainScreen].scale;
return floor(value * scale) / scale;
}
类似的东西:
CGFloat itemHeight = 0;
if (itemSize.height > 0 && itemSize.width > 0) {
itemHeight = CustomFloatCalc(itemSize.height * itemWidth / itemSize.width);
}
现在您可以在sizeForItemAtIndexPath
中即时计算图像的值,但是这样做会增加设备的内存和CPU负载。最好像Google一样将值存储在后端。
祝你好运