Cómo interpolar propiedades UICollectionViewLayoutAttributes personalizadas con UICollectionViewTransitionLayout
Tengo dos personalizadosUICollectionViewLayout
objetos que usan una costumbreUICollectionViewLayoutAttributes
subclase Estos atributos personalizados agregan una sola propiedadtintAlpha
que controla la opacidad de una vista de superposición de tinte adjunta a cada celda de vista de colección.
Ahora quiero hacer la transición entre estos dos diseños, usando unUICollectionViewTransitionLayout
subclase ¿Cómo puedo configurar la subclase de diseño de transición para interpolar el personalizadotintAlpha
propiedad en mis atributos de diseño personalizados?
Podría hacer algo como esto:
- (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;
}
Sin embargo, esto ignorará cualquier cambio aplicado a los atributos eninitialLayoutAttributesForAppearingItemAtIndexPath:
& finalLayoutAttributesForDisappearingItemAtIndexPath:
en el diseño actual o siguiente, por lo que en realidad no es correcto. Por lo que puedo decir, la implementación predeterminada deUICollectionViewTransitionLayout
determina los atributos apropiados de / a y los almacena en caché, ya sea enprepareLayout
olayoutAttributesForItemAtIndexPath:
. Sería muy útil tener alguna API pública enUICollectionViewTransitionLayout
para permitirnos acceder a estos objetos de / a atributos, como si tratara de implementar mi propia lógica sobre si usar los atributos iniciales / finales frente a los atributos estándar, seguramente habrá algunas discrepancias de la implementación predeterminada.
¿Hay una mejor manera de interpolar estos atributos personalizados durante una transición de diseño?
Actualizar:
Acabo de encontrar un problema adicional con este escenario. En el código anterior, al obtenerfromAttr
& toAttr
directamente de los diseños actuales / siguientes, elcollectionView
esnil
para el diseño actual (más allá del primer ciclo de ejecución de la transición al menos). Si el diseño depende en absoluto de los límites de la vista de colección, considere un diseño de flujo de cobertura simple, por ejemplo, entonces elfromAttr
será incorrecto
Estoy realmente ansiando uninterpolatedLayoutAttributesFromLayoutAttributes:toLayoutAttributes:progress:
enUICollectionViewTransitionLayout
eso puede ser anulado por subclases.