CALayer在横向模式下中断

时间:2012-07-02 06:27:19

标签: ios calayer transition

我正在根据Shutter转换教程编写自定义转换。它非常简单,第一个视图控制器意味着分成几百个然后一次淡出一个,然而问题是它在横向模式下不起作用。显然,CALayer的“contentsRect”方法(应该在标准化的图像空间上工作)只能在纵向模式下工作。我已经把我的文件附在这里,如果有人需要看看,请你帮我。

http://tinyurl.com/88669oy

问候

这里也是我的反码:

CALayer*        viewLayer;

- (void)transitWithImageView:(UIImageView *)imgView inView:(UIView *)view withImage:(UIImage *)img
{
     viewLayer = [imgView layer];
    [view.layer addSublayer:viewLayer];


    CGSize layerSize = viewLayer.bounds.size;


    // BEGINING OF MAKE ARRAY OF TRANSITIONS
    NSMutableArray* allTransitionsArr = [[NSMutableArray alloc] init]; 
       for ( int i = 0; i < BLOCK_COUNT; i++ )
    {
        CABasicAnimation *fade = [CABasicAnimation animationWithKeyPath:@"opacity"];
        fade.toValue =   [NSNumber numberWithFloat:-1-sqrt(i)];
        fade.autoreverses = NO;
        fade.duration = DURATION;
        [allTransitionsArr addObject: fade];
    }
    // END OF MAKE ARRAY OF TRANSITIONS



    NSMutableArray *blocks = [[NSMutableArray alloc] init];     
    [viewLayer removeFromSuperlayer];
        [CATransaction begin];

    [CATransaction setCompletionBlock:^(void) 
     {
         [blocks enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) 
          {
              [obj setDelegate:nil];
              [obj removeFromSuperlayer];
          }];
         [view.layer addSublayer:viewLayer];
     }];

    CGFloat bandWidth   = layerSize.width / sqrt(BLOCK_COUNT);
    CGFloat bandHeight  = layerSize.height / sqrt(BLOCK_COUNT);


    int yVal = -1;
     for(int i = 0; i < BLOCK_COUNT; i++)
    {
        CALayer *block = [[CALayer alloc] init];
        block.masksToBounds = YES;
        CGFloat xOffset = 1.f / sqrt(BLOCK_COUNT);
        CGFloat yOffset = 1.f / sqrt(BLOCK_COUNT);
        block.bounds = CGRectMake(0, 0, bandWidth, bandHeight);
        block.bounds = CGRectMake(0.f, 0.f, bandWidth, bandHeight);
        block.contents = (id)[img CGImage];
        block.contentsGravity = kCAGravityCenter;

        CGPoint bandOrigin = viewLayer.frame.origin;
        bandOrigin.x = bandOrigin.x + (bandWidth * (i % (int)sqrt(BLOCK_COUNT)));

        if (i % (int)sqrt(BLOCK_COUNT) == 0 )
            yVal++;

        bandOrigin.y = bandOrigin.y + (bandHeight * yVal);

        // PROBLEM IS GOT TO BE HERE
        block.contentsRect = CGRectMake(xOffset * (i % (int)sqrt(BLOCK_COUNT)) ,yOffset * yVal, xOffset, yOffset);

        [block setValue:[NSValue valueWithCGPoint:bandOrigin] forKeyPath:@"frame.origin"];

        [view.layer addSublayer:block];
        [block addAnimation:[allTransitionsArr objectAtIndex: BLOCK_COUNT - i - 1] forKey:nil];
        [blocks addObject:block];
        [block release];
    }
    [CATransaction commit];
    [blocks release];
}

0 个答案:

没有答案