2016-11-15 3 views
0

Im пытается сделать всплеск анимации, когда пользователь нажимает на представление. Im разрывает представление на круговые фигуры, когда пользователь нажимает определенное представление. Так что я преобразовал UIView в UIImage следующим образом,UIView Icon Animation

- (UIImage *) imageWithView:(UIView *)view 
    { 
     UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0.0); 
     [view.layer renderInContext:UIGraphicsGetCurrentContext()]; 

     UIImage * img = UIGraphicsGetImageFromCurrentImageContext(); 

     UIGraphicsEndImageContext(); 

     return img; 
    } 

Тогда я нарушил UIImage на куски следующим образом,

-(void)splitImage:(UIImage *)image 
{ 
    CGFloat imgWidth = image.size.width/2; 
    CGFloat imgheight = image.size.height; 
    CGRect leftImgFrame = CGRectMake(0, 0, imgWidth, imgheight); 
    CGRect rightImgFrame = CGRectMake(imgWidth, 0, imgWidth, imgheight); 

    CGImageRef left = CGImageCreateWithImageInRect(image.CGImage, leftImgFrame); 
    CGImageRef right = CGImageCreateWithImageInRect(image.CGImage, rightImgFrame); 

    UIImage* leftImage = [UIImage imageWithCGImage:left]; 
    UIImage* rightImage = [UIImage imageWithCGImage:right]; 

    CGImageRelease(left); 
    CGImageRelease(right); 
} 

Но есть определенные проблемы, стоящие перед IM, делая это.

  1. Im способный разбить uiimage только на две части, но не на динамические части.
  2. Как я могу показать, как тогда uiview разрывается на круговые фигуры с этими сломанными uiimages?

UPDATE: Ниже мой обновленный код ...

-(void)startAnimation{ 


    //Add the initial circle 
// UIView* circleView = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 60, 60)]; 
    UIView *circleView = [[UIImageView alloc] initWithFrame:self.submit.bounds]; 

    circleView.bounds = self.submit.bounds; 

    CAShapeLayer *circleLayer = [CAShapeLayer layer]; 

    //set colors 
    [circleLayer setStrokeColor:[[UIColor redColor] CGColor]]; 
    [circleLayer setFillColor:[[UIColor clearColor] CGColor]]; 
    [circleLayer setPath:[[UIBezierPath bezierPathWithOvalInRect:circleView.bounds] CGPath]]; 
    [circleView.layer addSublayer:circleLayer]; 
    [self.view addSubview:circleView]; 

    //Animate circle 
    [circleView setTransform:CGAffineTransformMakeScale(0, 0)]; 
    [UIView animateWithDuration:0.7 animations:^{ 
     [circleView setTransform:CGAffineTransformMakeScale(1.3, 1.3)]; 
    } completion:^(BOOL finished) { 
     circleView.hidden = YES; 
     //start next animation 
     [self createIconAnimation]; 
    }]; 
} 

-(void)createIconAnimation{ 

    //load icon which pops up 
    UIImageView* iconImage = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"ic_tick"]]; 
    iconImage.frame = CGRectMake(50, 50, 60, 60); 
    iconImage.bounds = self.submit.bounds; 
    [iconImage setTransform:CGAffineTransformMakeScale(0, 0)]; 
    [self.view addSubview:iconImage]; 

    //animate icon 
    [UIView animateWithDuration:0.3/1.5 animations:^{ 
     iconImage.transform = CGAffineTransformScale(CGAffineTransformIdentity, 1.1, 1.1); 
    } completion:^(BOOL finished) { 
     [UIView animateWithDuration:0.3/2 animations:^{ 
      iconImage.transform = CGAffineTransformScale(CGAffineTransformIdentity, 0.9, 0.9); 
     } completion:^(BOOL finished) { 
      [UIView animateWithDuration:0.3/2 animations:^{ 
       iconImage.transform = CGAffineTransformIdentity; 
      }]; 
     }]; 
    }]; 


    //add circles around the icon 
    int numberOfCircles = 20; 
    CGPoint center = iconImage.center; 
    float radius= 35; 
    BOOL isBig = YES;; 
    for (int i = 0; i<numberOfCircles; i++) { 

     float x = radius*cos(M_PI/numberOfCircles*i*2) + center.x; 
     float y = radius*sin(M_PI/numberOfCircles*i*2) + center.y; 

     float circleRadius = 10; 
     if (isBig) { 
      circleRadius = 5; 
      isBig = NO; 
     }else{ 
      isBig = YES; 
     } 

     UIView* circleView = [[UIView alloc] initWithFrame:CGRectMake(x, y, circleRadius, circleRadius)]; 
     CAShapeLayer *circleLayer = [CAShapeLayer layer]; 
     [circleLayer setStrokeColor:[[UIColor redColor] CGColor]]; 
     [circleLayer setFillColor:[[UIColor redColor] CGColor]]; 
     [circleLayer setPath:[[UIBezierPath bezierPathWithOvalInRect:circleView.bounds] CGPath]]; 
     [circleView.layer addSublayer:circleLayer]; 
     [self.view addSubview:circleView]; 

     //animate circles 
     [UIView animateWithDuration:0.8 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{ 
      [circleView setTransform:CGAffineTransformMakeTranslation(radius/3*cos(M_PI/numberOfCircles*i*2), radius/3*sin(M_PI/numberOfCircles*i*2))]; 
      [circleView setTransform:CGAffineTransformScale(circleView.transform, 0.01, 0.01)]; 
     } completion:^(BOOL finished) { 
      circleView.hidden = YES; 
     }]; 


    } 

} 

анимация должна быть на верхней части кнопки self.submit, но она не находится на нем

+0

Вы можете привести примеры того, как это должно выглядеть? Задача, которую вы ищете, выполнить нелегко, так как может потребоваться 3d-функции, если вы хотите фантастический взрыв или что-то еще. Я когда-то пробовал это с помощью воронной узоров. Он работал достаточно хорошо, но эффект 3d был больно – ben

+0

https://raw.githubusercontent.com/ChadCSong/ShineButton/master/demo_shine_others.gif –

+0

Im пытается сделать это, как показано выше. –

ответ

1

Здесь вы идете, просто добавьте этот код в свой контроллер. Это дает этот результат:

http://imgur.com/a/PhcIv

Просто играть вокруг с цветами и анимации, чтобы получить желаемый результат.

#import "ViewController.h" 

@interface ViewController() 

@end 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 

    [self startAnimation]; 

} 

-(void)startAnimation{ 

    //Add the initial circle 
    UIView* circleView = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 60, 60)]; 
    CAShapeLayer *circleLayer = [CAShapeLayer layer]; 

    //set colors 
    [circleLayer setStrokeColor:[[UIColor redColor] CGColor]]; 
    [circleLayer setFillColor:[[UIColor clearColor] CGColor]]; 
    [circleLayer setPath:[[UIBezierPath bezierPathWithOvalInRect:circleView.bounds] CGPath]]; 
    [circleView.layer addSublayer:circleLayer]; 
    [self.view addSubview:circleView]; 

    //Animate circle 
    [circleView setTransform:CGAffineTransformMakeScale(0, 0)]; 
    [UIView animateWithDuration:0.7 animations:^{ 
     [circleView setTransform:CGAffineTransformMakeScale(1.3, 1.3)]; 
    } completion:^(BOOL finished) { 
     circleView.hidden = YES; 
     //start next animation 
     [self createIconAnimation]; 
    }]; 
} 

-(void)createIconAnimation{ 

    //load icon which pops up 
    UIImageView* iconImage = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Untitled"]]; 
    iconImage.frame = CGRectMake(50, 50, 60, 60); 
    [iconImage setTransform:CGAffineTransformMakeScale(0, 0)]; 
    [self.view addSubview:iconImage]; 

    //animate icon 
    [UIView animateWithDuration:0.3/1.5 animations:^{ 
     iconImage.transform = CGAffineTransformScale(CGAffineTransformIdentity, 1.1, 1.1); 
    } completion:^(BOOL finished) { 
     [UIView animateWithDuration:0.3/2 animations:^{ 
      iconImage.transform = CGAffineTransformScale(CGAffineTransformIdentity, 0.9, 0.9); 
     } completion:^(BOOL finished) { 
      [UIView animateWithDuration:0.3/2 animations:^{ 
       iconImage.transform = CGAffineTransformIdentity; 
      }]; 
     }]; 
    }]; 


    //add circles around the icon 
    int numberOfCircles = 20; 
    CGPoint center = iconImage.center; 
    float radius= 35; 
    BOOL isBig = YES;; 
    for (int i = 0; i<numberOfCircles; i++) { 

     float x = radius*cos(M_PI/numberOfCircles*i*2) + center.x; 
     float y = radius*sin(M_PI/numberOfCircles*i*2) + center.y; 

     float circleRadius = 10; 
     if (isBig) { 
      circleRadius = 5; 
      isBig = NO; 
     }else{ 
      isBig = YES; 
     } 

     UIView* circleView = [[UIView alloc] initWithFrame:CGRectMake(x, y, circleRadius, circleRadius)]; 
     CAShapeLayer *circleLayer = [CAShapeLayer layer]; 
     [circleLayer setStrokeColor:[[UIColor redColor] CGColor]]; 
     [circleLayer setFillColor:[[UIColor redColor] CGColor]]; 
     [circleLayer setPath:[[UIBezierPath bezierPathWithOvalInRect:circleView.bounds] CGPath]]; 
     [circleView.layer addSublayer:circleLayer]; 
     [self.view addSubview:circleView]; 

     //animate circles 
     [UIView animateWithDuration:0.8 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{ 
      [circleView setTransform:CGAffineTransformMakeTranslation(radius/3*cos(M_PI/numberOfCircles*i*2), radius/3*sin(M_PI/numberOfCircles*i*2))]; 
      [circleView setTransform:CGAffineTransformScale(circleView.transform, 0.01, 0.01)]; 
     } completion:^(BOOL finished) { 
      circleView.hidden = YES; 
     }]; 


    } 

} 



@end 
+0

Спасибо, что вы..и попробуете и сообщите, если я сталкиваюсь с любыми осложнениями –

+0

, пожалуйста, дайте мне исходный код? потому что круги не появляются bro –

+0

im, используя его с uiview –