私は、水平方向と垂直方向に中央揃えさUICollectionView
れたを持つ水平方向の を持っています。ラベルには長さの異なるテキストが含まれているため、ラベルの幅をそのように計算します。ここでは、保存側になるように少しマージン (10) を与えます。UICollectionViewCell
UILabel
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
NSString *text = [_collectionViewProvider collectionViewController:self titleForRow:indexPath.row];
CGSize size = CGSizeMake(MIN(_maxWidth, [text sizeWithFont:self.font].width + 16 + 10), CGRectGetHeight(collectionView.bounds));
return size;
}
ユーザーに水平スクロール ホイールの印象を持たせたいので、変換を適用し、中心からの距離に応じてセルの zIndex を調整します。ほぼ期待どおりに機能しますが、変換が左端/右端に適用されるとフレーム幅が縮小されるため、テキストが切り取られてかなり奇妙に見えるという効果があります。
これは、セルが中央にあるときの効果を示す画像です。これを解決する方法を知っている人はいますか?
これがレイアウトを計算するための私のコードです。
- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect
{
NSArray *array = [super layoutAttributesForElementsInRect:rect];
CGRect visibleRect = CGRectZero;
visibleRect.origin = self.collectionView.contentOffset;
visibleRect.size = self.collectionView.bounds.size;
CGFloat activeDistance = floorf(CGRectGetWidth(visibleRect) / 2);
CGFloat midX = ceilf(CGRectGetMidX(visibleRect));
CGFloat baseAngle = M_PI/180 * 40;
for (UICollectionViewLayoutAttributes *attributes in array)
{
if (CGRectContainsRect(visibleRect, attributes.frame)) {
CGFloat distance = midX - attributes.center.x;
attributes.alpha = (activeDistance - ABS(distance))/activeDistance;
CGFloat value = -distance/activeDistance;
value *= baseAngle;
attributes.transform3D = CATransform3DMakeRotation(value, 0, 1, 0);
attributes.zIndex = ABS(distance)/activeDistance * 200;
}
else {
attributes.alpha = 0;
}
}
return array;
}