У меня есть два пользовательских объекта UICollectionViewLayout
, которые используют пользовательский подкласс UICollectionViewLayoutAttributes
. Эти настраиваемые атрибуты добавляют одно свойство tintAlpha
, которое управляет непрозрачностью отображения оверлей оттенка, прикрепленного к каждой ячейке просмотра коллекции.
Теперь я хочу перейти между этими двумя макетами, используя подкласс UICollectionViewTransitionLayout
. Как настроить подклассу макета перехода для интерполирования пользовательского свойства tintAlpha
на мои собственные атрибуты макета?
Я мог бы сделать что-то вроде этого:
- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath
{
CustomLayoutAttributes *attr = [super layoutAttributesForItemAtIndexPath:indexPath];
CustomLayoutAttributes *fromAttr = (CustomLayoutAttributes *)[self.currentLayout layoutAttributesForItemAtIndexPath:indexPath];
CustomLayoutAttributes *toAttr = (CustomLayoutAttributes *)[self.nextLayout layoutAttributesForItemAtIndexPath:indexPath];
CGFloat t = self.transitionProgress;
attr.tintAlpha = (1.0f - t) * fromAttr.tintAlpha + t * toAttr.tintAlpha;
return attr;
}
Однако это игнорирует любые изменения, применяемые к атрибутам в initialLayoutAttributesForAppearingItemAtIndexPath:
и finalLayoutAttributesForDisappearingItemAtIndexPath:
в текущем или следующем макете, и на самом деле это не так. Насколько я могу судить, реализация по умолчанию UICollectionViewTransitionLayout
определяет соответствующие атрибуты/атрибуты и кэширует их, либо в prepareLayout
, либо layoutAttributesForItemAtIndexPath:
. Было бы так полезно иметь некоторый публичный API на UICollectionViewTransitionLayout
, чтобы позволить нам получить доступ к этим объектам атрибутов/в атрибуты, как если бы я попытался реализовать свою собственную логику о том, следует ли использовать начальные/конечные атрибуты и стандартные атрибуты связаны с некоторыми отличиями от реализации по умолчанию.
Есть ли лучший способ интерполировать эти пользовательские атрибуты во время перехода макета?
Update:
Я только что столкнулся с дополнительной проблемой в этом сценарии. В приведенном выше коде при получении fromAttr
и toAttr
непосредственно из текущего/следующего макетов, collectionView
является nil
для текущего макета (за исключением первого цикла цикла перехода, по крайней мере). Если макет вообще зависит от границ просмотра коллекции - рассмотрим, например, простой шаблон потока обложки - тогда будет неверно fromAttr
.
Я действительно выгляжу для interpolatedLayoutAttributesFromLayoutAttributes:toLayoutAttributes:progress:
на UICollectionViewTransitionLayout
, который может быть переопределен подклассами.