कई (और बल्कि हैकी) समाधानों को आजमाने के बाद, मैंने इसे अपना UICollectionView
लेआउट लिखकर हल किया। पिछला समाधान मैं का प्रयास किया:
- बनाने एक नया बिना
UICollectionView
और नकली का प्रयास ज़्यादा होना एक कस्टम UIView जोड़े मूल कोशिका यह डालने, पृष्ठभूमि मंद, और नए UIView
- एनिमेट से आगे बढ़ सेल एनिमेट लेआउट
मैं इसे से बचने के लिए कोशिश कर रहा था, लेकिन उसके बाद मैं इसे कोडिंग में मिल गया है, यह एक बहुत कम दर्दनाक की तुलना में मैं मूल रूप से सोचा था।
ज:
@interface FMStackedLayout : UICollectionViewLayout
@property(nonatomic,assign) CGPoint center;
@property(nonatomic,assign) NSInteger cellCount;
-(id)initWithSelectedCellIndexPath:(NSIndexPath *)indexPath;
@end
मीटर:
#define ITEM_WIDTH 128.0f
#define ITEM_HEIGHT 180.0f
static NSUInteger const RotationCount = 32;
static NSUInteger const RotationStride = 3;
static NSUInteger const PhotoCellBaseZIndex = 100;
@interface FMStackedLayout()
@property(strong,nonatomic) NSArray *rotations;
@property(strong,nonatomic) NSIndexPath *selectedIndexPath;
@end
@implementation FMStackedLayout
#pragma mark - Lifecycle
-(id)initWithSelectedCellIndexPath:(NSIndexPath *)indexPath{
self = [super init];
if (self) {
self.selectedIndexPath = indexPath;
[self setup];
}
return self;
}
-(id)initWithCoder:(NSCoder *)aDecoder{
self = [super init];
if (self){
[self setup];
}
return self;
}
-(void)setup{
NSMutableArray *rotations = [NSMutableArray arrayWithCapacity:RotationCount];
CGFloat percentage = 0.0f;
for (NSUInteger i = 0; i < RotationCount; i++) {
// Ensure that each angle is different enough to be seen
CGFloat newPercentage = 0.0f;
do {
newPercentage = ((CGFloat)(arc4random() % 220) - 110) * 0.0001f;
} while (fabsf(percentage - newPercentage) < 0.006);
percentage = newPercentage;
CGFloat angle = 2 * M_PI * (1.0f + percentage);
CATransform3D transform = CATransform3DMakeRotation(angle, 0.0f, 0.0f, 1.0f);
[rotations addObject:[NSValue valueWithCATransform3D:transform]];
}
self.rotations = rotations;
}
#pragma mark - Layout
-(void)prepareLayout{
[super prepareLayout];
CGSize size = self.collectionView.frame.size;
self.cellCount = [self.collectionView numberOfItemsInSection:0];
self.center = CGPointMake(size.width/2.0, size.height/2.0);
}
-(CGSize)collectionViewContentSize{
return self.collectionView.frame.size;
}
-(UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath{
UICollectionViewLayoutAttributes *attributes = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath];
attributes.size = CGSizeMake(ITEM_WIDTH, ITEM_HEIGHT);
attributes.center = self.center;
if (indexPath.item == self.selectedIndexPath.item) {
attributes.zIndex = 100;
}else{
attributes.transform3D = [self transformForPersonViewAtIndex:indexPath];
}
return attributes;
}
-(NSArray *)layoutAttributesForElementsInRect:(CGRect)rect{
NSMutableArray *attributes = [NSMutableArray array];
for (NSInteger i = 0; i < self.cellCount; i++) {
NSIndexPath *indexPath = [NSIndexPath indexPathForItem:i
inSection:0];
[attributes addObject:[self layoutAttributesForItemAtIndexPath:indexPath]];
}
return attributes;
}
#pragma mark - Private
-(CATransform3D)transformForPersonViewAtIndex:(NSIndexPath *)indexPath{
NSInteger offset = (indexPath.section * RotationStride + indexPath.item);
return [self.rotations[offset % RotationCount] CATransform3DValue];
}
@end
फिर, अपने UICollectionView पर, आप
फोन
यहाँ रुचि किसी के लिए, मेरे कोड है
MyLayout *stackedLayout = [[MyLayout alloc] initWithSelectedCellIndexPath:indexPath];
[stackedLayout invalidateLayout];
[self.collectionView setCollectionViewLayout:stackedLayout
animated:YES];
सेल के बीच एनिमेशन कस्टम लेआउट द्वारा संभाला जाएगा।
स्रोत
2013-05-06 19:01:29
यह एक उत्तर नहीं है। ऐसा लगता है कि आपके पास जवाब है लेकिन साझा करने में रुचि नहीं है। – Fiveagle
@ मार्क स्ट्रुज़िंस्की क्या आप अपना समाधान साझा कर सकते हैं? –
यह कोड का एक छोटा सा हिस्सा है, लेकिन मैं किसी विशेष कारण के लिए वापस नहीं रोक रहा था। मैंने इसे किसी भी रुचि के लिए ऊपर पोस्ट कर दिया है। निश्चित नहीं है कि यहां डाउनवॉट क्यों थे। अंतिम समाधान ने एक विधि का उपयोग किया जो कि एप्पल दस्तावेज़ों में पूरी तरह से प्रलेखित है: http://developer.apple.com/library/ios/#documentation/uikit/reference/UICollectionViewLayout_class/Reference/Reference.html। मैं इसे टालने की कोशिश कर रहा था क्योंकि यह काफी काम है। –