UiCollectionViewCell随机图像翻转

时间:2013-08-28 13:06:19

标签: ios objective-c uicollectionview uicollectionviewcell

我一直在这里寻找一个没有成功的答案,所以现在我自己试一试。

我试图用包含图像的不同单元格制作一个UicollectionView +带有单元格的动画。

我希望细胞能够“随机翻转”我的图像(5张不同的图像)

  

UIViewAnimationOptionTransitionFlipFromLeft

在一个延迟5-6秒的循环中。

我现在拥有的动画是:

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {

    UICollectionViewCell *cell = [collectionView cellForItemAtIndexPath:indexPath];
    [cell.superview bringSubviewToFront:collectionView];

    [UIView transitionWithView:cell
                      duration:1.0
                      options:UIViewAnimationOptionTransitionFlipFromLeft
                      animations:^{
                      [UICollectionViewCell commitAnimations];
                      cell.transform = CGAffineTransformMakeRotation(0.0);
                    }
                    completion:^(BOOL finished) {}];


    }

我知道我不应该使用didSelectItemAtIndexPath,但我只是用它来看动画是否正确。

如果您查看此视频,您可以在Windows 8手机上看到我的意思。 Youtube video

2 个答案:

答案 0 :(得分:0)

好的,我对这个想法感兴趣,所以我制作了一些代码原型。我需要根据您的需求量身定制,但这可能是一个良好的开端。首先,您需要将UICollectionViewCell子类化,以便将IBOutlet连接到单元格内的imageView。然后,您可以参考我的代码段来帮助您入门。

- (void)viewDidLoad
{
  [super viewDidLoad];
  self.imageList = @[@"img1.png", @"img2.png", @"img3.png", @"img4.png"];  
}

// This assumes your images are inside your Bundle.

- (void)viewDidAppear:(BOOL)animated
{
  [super viewDidAppear:animated];

  [NSTimer scheduledTimerWithTimeInterval:4.0
                                   target:self
                                 selector:@selector(updateCells:)
                                 userInfo:nil
                                  repeats:YES];

}

- (void)updateCells:(NSTimer *)timer
{
  NSArray *visibleIndexPaths = [self.collectionView indexPathsForVisibleItems];
  for (NSIndexPath *indexPath in visibleIndexPaths) {
    SubclassCollectionViewCell *cell = (SubclassCollectionViewCell *)[self.collectionView cellForItemAtIndexPath:indexPath];
    [UIView transitionWithView:cell
                      duration:1.0f
                       options:UIViewAnimationOptionTransitionFlipFromLeft
                    animations:^{
                      cell.imageView.image = [self randomImage];
                    } completion:nil];
  }
}

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
  return 1;
}

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
  UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath];

  return cell;
}

- (UIImage *)randomImage
{
  NSInteger randomNumber = arc4random() % [self.imageList count];
  return [UIImage imageNamed:[self.imageList objectAtIndex:randomNumber]];
}

更新

如果您希望一次只有一个单元格随机翻转,则需要在for方法中取出updateCells循环。相反,试试这个:

- (void)updateCells:(NSTimer *)timer
{
  NSArray *visibleIndexPaths = [self.collectionView indexPathsForVisibleItems];
  NSInteger randomIndex = arc4random() % [visibleIndexPaths count];
  NSindexPath *randomIndexPath = [NSIndexPath indexPathForItem:randomIndex inSection:0];

  SubclassCollectionViewCell *cell = (SubclassCollectionViewCell *)[self.collectionView cellForItemAtIndexPath:indexPath];

  [UIView transitionWithView:cell
                    duration:1.0f
                     options:UIViewAnimationOptionTransitionFlipFromLeft
                  animations:^{
                    cell.imageView.image = [self randomImage];
                  } 
                  completion:nil
  ];
}

答案 1 :(得分:0)

编辑后的帖子:

- (void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];

int interval = 5+(rand() % 6);


int section = 0;
int row = (arc4random() % self.cellList.count);


NSIndexPath *indexPath = [NSIndexPath indexPathForRow:row inSection:section];


CollectionCell *cell = (CollectionCell *)[self.collectionView cellForItemAtIndexPath:indexPath];
[NSTimer scheduledTimerWithTimeInterval:interval
                                 target:self
                               selector:@selector(updateCells:)
                               userInfo:cell
                                repeats:NO];

    NSLog(@"seconds: %d", interval);
    NSLog(@"row: %d", row);
    }

- (void)updateCells:(NSTimer *)timer{
CollectionCell* cell = [timer userInfo];
[UIView transitionWithView:cell
                  duration:1.0f
                   options:UIViewAnimationOptionTransitionFlipFromLeft
                animations:^{
                    cell.collectionImageView.image = [self randomImage];
                } completion:nil];



int interval = 5+(rand() % 5);

NSLog(@"speed: %d", interval);

int section = 0;
int row = (arc4random() % self.cellList.count);

NSLog(@"row: %d", row);

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:row inSection:section];
CollectionCell *newCell = (CollectionCell *)[self.collectionView cellForItemAtIndexPath:indexPath];
[NSTimer scheduledTimerWithTimeInterval:interval
                                 target:self
                               selector:@selector(updateCells:)
                               userInfo:newCell
                                repeats:NO];}
-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
    return self.cellList.count;
}

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath


{
    CGRect frame = self.collectionView.frame;
    [collectionView setFrame:frame];

    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"ReuseID" forIndexPath:indexPath];

        [collectionView setNeedsDisplay];
    [self cellTitleAndBackground:cell indexPath:indexPath];


    return cell;

}



- (void)cellTitleAndBackground:(CollectionCell *)cell indexPath:(NSIndexPath *)indexPath {

    // Get title
    NSString *name = [[NSString alloc] initWithFormat:@"%@", self.cellList[indexPath.row]];

    // Create title background
    UILabel *titleBackground = [[UILabel alloc] initWithFrame:CGRectMake(5, 70, 70, 30)];
    titleBackground.backgroundColor = [UIColor blackColor];
    titleBackground.alpha = 0.6f;
    titleBackground.tag = 70;
    [self removeReusedLabel:cell tag:70];
    [cell addSubview:titleBackground];


    // Create titleLabel
    UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(5, 70, 70, 30)];
    titleLabel.textColor = [UIColor whiteColor];
    titleLabel.font = [UIFont boldSystemFontOfSize:12];
    titleLabel.text = name;
    titleLabel.backgroundColor = [UIColor clearColor];
    titleLabel.textAlignment = NSTextAlignmentCenter;
    titleLabel.tag = 72;
    [self removeReusedLabel:cell tag:72];
    [cell addSubview:titleLabel];
}

-(void)removeReusedLabel:(CollectionCell *)cell tag:(int)tag {
    UILabel *foundLabelBackground = (UILabel *)[cell viewWithTag:tag];
    if (foundLabelBackground) [foundLabelBackground removeFromSuperview];
}



- (UIImage *)randomImage
{
    // Random image for cells
    NSInteger randomNumber = arc4random() % [self.imageList count];
    return [UIImage imageNamed:[self.imageList objectAtIndex:randomNumber]];
}