我有一個集合視圖與子類,UICollectionViewFlow佈局。 我要做的效果是旋轉(透視,繞y軸)和運動縮放。 我的收藏視圖設置爲分頁模式ON,水平滾動,每個單元都有全屏,也就是說,它們的框架等於收集視圖的邊界。每個單元格都有一個表格視圖。自定義UICollectionViewFlowLayout問題
問題是我越來越奇怪的行爲。目前在屏幕上的單元格內的表格很好。當我平移到另一個單元格時出現問題。單元格內的表格似乎完全錯誤!它只填滿了一半的細胞,即使細胞更大。在界面生成器中,我將表格設置爲將其邊緣粘貼到其超級視圖(單元格)邊緣(Autolayout)。
經過一段時間,我認爲[cell layoutsubviews]在視圖實例化後僅被調用一次。由於我在下面的代碼中直接設置了UICollectionViewLayoutAttributes,所以可以在初始旋轉的情況下佈置表視圖(由於透視旋轉嚴重,超級視圖的框架會縮小),並且由於[cell layoutsubiews]永遠不會再次調用它只是保持這種方式?
第二個怪癖是佈局的回調沒有意義。 collectionView:didEndDisplayingCell:forItemAtIndexPath: 例如,告訴我索引路徑上的視圖已經停止顯示,甚至在它出現在屏幕上之前!
有人可以嘗試這種佈局,也許告訴我我做錯了什麼?
-(BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds
{
return YES;
}
-(NSArray*)layoutAttributesForElementsInRect:(CGRect)rect
{
NSArray* array = [super layoutAttributesForElementsInRect:rect];
CGRect visibleRect;
visibleRect.origin = self.collectionView.contentOffset;
visibleRect.size = self.collectionView.bounds.size;
for (UICollectionViewLayoutAttributes* attributes in array)
{
if (CGRectIntersectsRect(visibleRect, attributes.frame) &&
ABS(CGRectGetMidX(visibleRect) - attributes.center.x) <= self.collectionView.frame.size.width)
{
CGFloat distance = CGRectGetMidX(visibleRect) - attributes.center.x;
CGFloat absoluteDistance = ABS(distance);
CGFloat angle = [self normalizeFromMin:0
fromMax:self.collectionView.frame.size.width
toMin:0
toMax:90
value:absoluteDistance];
CGFloat scale = [self normalizeFromMin:0
fromMax:self.collectionView.frame.size.width
toMin:0.7
toMax:1
value:absoluteDistance];
CATransform3D transform = CATransform3DIdentity;
transform.m34 = 1.0/-1800;
if(distance > 0)
{
transform = CATransform3DRotate(transform, radians(angle), 0.0, 1.0, 0.0);
}
else
{
transform = CATransform3DRotate(transform, -radians(angle), 0.0, 1.0, 0.0);
}
transform = CATransform3DScale(transform, 1.0 - scale, 1.0 - scale, 0.0);
attributes.transform3D = transform;
attributes.alpha = 1.0;
if(distance == 0)
{
attributes.zIndex = 1;
attributes.transform3D = CATransform3DIdentity;
}
else
{
attributes.zIndex = 0;
}
}
}
return array;
}
-(CGFloat)normalizeFromMin:(CGFloat)fromMin
fromMax:(CGFloat)fromMax
toMin:(CGFloat)toMin
toMax:(CGFloat)toMax
value:(CGFloat)toNormalize
{
CGFloat toBeDivided = toMin + (toNormalize - fromMin) * (toMax - toMin);
CGFloat result = toBeDivided/(fromMax - fromMin);
return result;
}
編輯:
加入
attributes.frame = attributes.frame
似乎排序的幫助下,在寬度方面,但表內似乎不正確的佈局。它看起來像大小是正確的,但在旋轉時的電池只是有點夾桌子,但表本身只是看起來怪異,像有適用於它沒有旋轉,