0

iOS でカスタム アニメーションを作成したいと考えています。SubViews を表示する UIView があるとします。そのスクリーンショットを取り、それを中央から左上、右上、左下、右下の 4 つの部分に分割し、すべての部分をそれらのコーナーに移動します。 UIViewの上隅と右上は右上隅などに移動する必要があります。

4

2 に答える 2

0

これが私の答えです。現在の画面表示のスクリーンショットを撮り、中央から4等分し、アニメーション化してそれぞれのコーナーに移動します。

- (IBAction)animate:(id)sender
{
    NSLog(@"animation called ");
    UIGraphicsBeginImageContext(self.view.window.bounds.size);
    [self.view.window.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    CGImageRef imgref=[image CGImage];
    NSArray *arrayOfImages= [[NSArray alloc]initWithArray:[self splitImageIntoRects:imgref]];

    NSLog(@"array of images are %@",arrayOfImages);


    for (CALayer *layer in arrayOfImages) {
        [self.view.layer addSublayer:layer];
    }

    [self animateLayers:arrayOfImages];
}

-(void)animateLayers:(NSArray*)array
{
    for (int i=0;i<array.count;i++)
    {
        CALayer *layer=[array objectAtIndex:i];
        CGRect rect=[layer frame];
        CGPoint newPt;

        switch (i) {
            case 0:
                newPt=CGPointMake(-rect.size.width, -rect.size.height);
                break;
            case 1:
                newPt=CGPointMake(rect.origin.x-rect.size.width, rect.origin.y+rect.size.height);
                break;
            case 2:
                newPt=CGPointMake(rect.origin.x+rect.size.width, rect.origin.y-rect.size.height);
                break;
            case 3:
                newPt=CGPointMake(rect.origin.x+rect.size.width, rect.origin.y+rect.size.height);
                break;
        }
        [self moveLayer:layer to:newPt];
    }
}

-(void)moveLayer:(CALayer*)layer to:(CGPoint)point
{
    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"];
    animation.duration=1;
    animation.fromValue = [layer valueForKey:@"position"];

    animation.toValue = [NSValue valueWithCGPoint:point];
    layer.position = point;
    [layer addAnimation:animation forKey:@"position"];
}

- (NSArray*)splitImageIntoRects:(CGImageRef)anImage{

    CGSize imageSize = CGSizeMake(CGImageGetWidth(anImage), CGImageGetHeight(anImage));

    NSMutableArray *splitLayers = [NSMutableArray array];

    int kXSlices = 2;
    int kYSlices = 2;

    for(int x = 0;x < kXSlices;x++) {
        for(int y = 0;y < kYSlices;y++) {
            CGRect frame = CGRectMake((imageSize.width / kXSlices) * x,
                                      (imageSize.height / kYSlices) * y,
                                      (imageSize.width / kXSlices),
                                      (imageSize.height / kYSlices));

            CALayer *layer = [CALayer layer];
            layer.frame = frame;
            CGImageRef subimage = CGImageCreateWithImageInRect(anImage, frame);
            layer.contents = (__bridge id)subimage;
            CFRelease(subimage);
            [splitLayers addObject:layer];
        }
    }

    return splitLayers;
}
于 2013-03-04T04:35:38.387 に答える
0

これが役立つかもしれませんが、確かではありませんが、最初にフレーム位置を設定してから、フレームの位置を自由に変更してください。デフォルトでは、私は取っています

                 top.frame=CGRectMake(0,0,320,120);
                 bottom.frame=CGRectMake(0,315,320,145);
                 left.frame=CGRectMake(0,113,151,202);
                 right.frame=CGRectMake(175,113,151,202);

[NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(tranform) userInfo:nil repeats:NO];

3 秒後にこのメソッドが呼び出され、

-(void)tranform{
     [UIView animateWithDuration:0.4 delay:0.0 options:UIViewAnimationTransitionCurlUp
                     animations:^{
                         top.frame=CGRectMake(0,-120,320,120);
                         bottom.frame=CGRectMake(0,480,320,145);
                         left.frame=CGRectMake(-151,113,151,202);
                         right.frame=CGRectMake(320,113,151,202);



                     }
                     completion:nil];
}

上記のコードでは、上、下、左、右が 4 つのビューであり、それらすべてを self.view に追加しています。特定のものをクリックすると、それぞれのフレームに関してアニメーションが発生します。

于 2013-03-02T07:38:47.630 に答える