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