Анимация вращения в UIImageView - PullRequest
0 голосов
/ 01 декабря 2010

У меня есть изображение солнечных лучей.Мне нравится помещать его на задний план и заставлять его непрерывно вращаться в замедленном темпе ..

Изображение это ..

alt text

я пробовалвращая его с помощью CABasicAnimation, но он поворачивает весь кадр .. Я хочу, чтобы солнечные лучи вращались на фоне, а не весь кадр.* Обновление:

Вот что я делаю ... пожалуйста, укажите на мои ошибки ...: (

Я не получил, пока вы объяснили..: (

вот что я делаю ...

 - (void)viewDidLoad {
sunraysContainer = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 1024, 768)];
sunraysContainer.clipsToBounds = YES;
[self.view addSubview:sunraysContainer];


sunrays = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 1024, 768)];
[sunrays setImage:[UIImage imageNamed:@"sunlight-background copy2.jpg"]];
[sunraysContainer addSubview:sunrays];

backgroundBuilding = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 1024, 768)];
[backgroundBuilding setImage:[UIImage imageNamed:@"hira-background_fade.png"]];
 [sunraysContainer addSubview:backgroundBuilding];

[UIView beginAnimations:nil context:nil];
 [UIView setAnimationDuration:5];
 CABasicAnimation *rotationAnimation;
 rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
 rotationAnimation.toValue = [NSNumber numberWithFloat:M_PI * 2.0 * 4.0];
 rotationAnimation.duration = 1;
 rotationAnimation.cumulative = YES;
 rotationAnimation.repeatCount = 10;
 rotationAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
 [sunrays.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"];
 [UIView commitAnimations];

 }

Обновление ...

Я сделал то, что ты сказал начо ... спасибо за ответ,но я получаю пустой экран ..: (

я закодировал dis ...

   sunrays = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"sunlight-background copy2.jpg"]];
UIView *container = [[UIView alloc] initWithFrame:CGRectMake(0,0,sunrays.frame.size.height,sunrays.frame.size.height)];
[container setClipsToBounds:YES];
[container addSubview:sunrays];
[sunrays setCenter:CGPointMake(container.bounds.size.width/2, container.bounds.size.height/2)]; 
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:5];
CABasicAnimation *rotationAnimation;
rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
rotationAnimation.toValue = [NSNumber numberWithFloat:M_PI * 2.0 * 4.0];
rotationAnimation.duration = 1;
rotationAnimation.cumulative = YES;
rotationAnimation.repeatCount = 10;
rotationAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
[sunrays.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"];
[UIView commitAnimations];

что не так с кодом ??

Ответы [ 4 ]

3 голосов
/ 24 октября 2012

Ну, я думаю, вы должны сгенерировать разные изображения, а затем попытаться анимировать это

imgLoading.animationImages = [NSArray arrayWithObjects:
                              [UIImage imageNamed:@"Img1.png"]
                              [UIImage imageWithCGImage:
                               [self CGImageRotatedByAngle:
                                [[UIImage imageNamed:@"Img1.png"] CGImage]angle:30.0]],
                              [UIImage imageWithCGImage:
                               [self CGImageRotatedByAngle:
                                [[UIImage imageNamed:@"Img1.png"] CGImage]angle:60.0]],
                              [UIImage imageWithCGImage:
                               [self CGImageRotatedByAngle:
                                [[UIImage imageNamed:@"Img1.png"] CGImage]angle:90.0]],
                              [UIImage imageWithCGImage:
                               [self CGImageRotatedByAngle:
                                [[UIImage imageNamed:@"Img1.png"] CGImage]angle:120.0]],
                              [UIImage imageWithCGImage:
                               [self CGImageRotatedByAngle:
                                [[UIImage imageNamed:@"Img1.png"] CGImage]angle:150.0]],
                              [UIImage imageWithCGImage:
                               [self CGImageRotatedByAngle:
                                [[UIImage imageNamed:@"Img1.png"] CGImage]angle:180.0]],
                              [UIImage imageWithCGImage:
                               [self CGImageRotatedByAngle:
                                [[UIImage imageNamed:@"Img1.png"] CGImage]angle:210.0]],
                              [UIImage imageWithCGImage:
                               [self CGImageRotatedByAngle:
                                [[UIImage imageNamed:@"Img1.png"] CGImage]angle:240.0]],
                              [UIImage imageWithCGImage:
                               [self CGImageRotatedByAngle:
                                [[UIImage imageNamed:@"Img1.png"] CGImage]angle:270.0]],
                              [UIImage imageWithCGImage:
                               [self CGImageRotatedByAngle:
                                [[UIImage imageNamed:@"Img1.png"] CGImage]angle:300.0]],
                              [UIImage imageWithCGImage:
                               [self CGImageRotatedByAngle:
                                [[UIImage imageNamed:@"Img1.png"] CGImage]angle:330.0]],
                              [UIImage imageWithCGImage:
                               [self CGImageRotatedByAngle:
                                [[UIImage imageNamed:@"Img1.png"] CGImage]angle:360.0]], nil];

imgLoading.animationRepeatCount=0;
imgLoading.animationDuration=.5;
[imgLoading startAnimating];

В приведенном выше коде я добавил изображения отдельно, но вы можете заполнить их в цикле.*

{

CGFloat angleInRadians = angle * (M_PI / 180);
CGFloat width = CGImageGetWidth(imgRef);
CGFloat height = CGImageGetHeight(imgRef);

CGRect imgRect = CGRectMake(0, 0, width, height);
CGAffineTransform transform = CGAffineTransformMakeRotation(angleInRadians);
CGRect rotatedRect = CGRectApplyAffineTransform(imgRect, transform);

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

CGContextRef bmContext = CGBitmapContextCreate(NULL,
                                               rotatedRect.size.width,
                                               rotatedRect.size.height,
                                               8,
                                               0,
                                               colorSpace,
                                               kCGImageAlphaPremultipliedFirst);
CGContextSetAllowsAntialiasing(bmContext, YES);
CGContextSetShouldAntialias(bmContext, YES);
CGContextSetInterpolationQuality(bmContext, kCGInterpolationHigh);
CGColorSpaceRelease(colorSpace);
CGContextTranslateCTM(bmContext,
                      +(rotatedRect.size.width/2),
                      +(rotatedRect.size.height/2));
CGContextRotateCTM(bmContext, angleInRadians);
CGContextTranslateCTM(bmContext,
                      -(rotatedRect.size.width/2),
                      -(rotatedRect.size.height/2));
CGContextDrawImage(bmContext, CGRectMake(0, 0,
                                         rotatedRect.size.width,
                                         rotatedRect.size.height),
                   imgRef);



CGImageRef rotatedImage = CGBitmapContextCreateImage(bmContext);
CFRelease(bmContext);
[(id)rotatedImage autorelease];

return rotatedImage;

}

Функция «Выше» может использоваться для получения повернутых изображений ..

1 голос
/ 01 декабря 2010

Я думаю, что вы находитесь на правильном пути;) У вас должен быть контейнер, который зажимает его, чтобы он не выглядел как вращающаяся рама отверстия.

UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"image.png"]];
UIView *container = [UIView alloc] initWithFrame:CGRectMake(0,0,imageView.frame.size.height, image.frame.size.height)]; //i used the height because is the min(height, width).
[container setClipsToBounds:YES];
[container addSubview:imageView];
[imageView setCenter:CGPointMake(container.bounds.size.width/2, container.bounds.size.height/2)];
//animate your image here
...

Также. если возможно, используйте CALayer вместо imageView;)

CALayer *imageLayer = [CALayer layer];
imageLayer.contents = (id)[UIImage imageNamed:@"myimage.png"].CGImage;
// and do basically the same as above,
[container.layer addSublayer:imageLayer];
//...

ПРИМЕЧАНИЕ: приведенный выше код компилируется мозгом, поэтому возможны небольшие ошибки, но идея ясна;)

Надеюсь, это поможет

EDIT:

Привет;) Я думаю, вы забыли добавить контейнер к вашему виду. ;)

И я только что попробовал код и понял, что вычисление фрейма контейнера было неточным (даже если вы этого не сделаете, оно будет работать, но анимация будет выглядеть немного уродливо) Вот код:

    UIImage *image = [UIImage imageNamed:@"sunrays.jpg"];
    UIImageView *sunrays = [[UIImageView alloc] initWithImage:image];
    float side = (MIN(image.size.height, image.size.width)/(2.0*sqrt(2)));
    UIView *container = [[UIView alloc] initWithFrame:CGRectMake(0,0,side,side)];
    [container setClipsToBounds:YES];
    [container addSubview:sunrays];
    [sunrays setCenter:CGPointMake(container.bounds.size.width/2, container.bounds.size.height/2)]; 

    [self.view addSubview:container]; //you forgot this? ;)

    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:5];
    CABasicAnimation *rotationAnimation;
    rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
    rotationAnimation.toValue = [NSNumber numberWithFloat:M_PI * 2.0 * 4.0];
    rotationAnimation.duration = 1;
    rotationAnimation.cumulative = YES;
    rotationAnimation.repeatCount = 10;
    rotationAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
    [sunrays.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"];
    [UIView commitAnimations];
0 голосов
/ 27 июля 2017

Swift 3:

var rotationAnimation = CABasicAnimation()
rotationAnimation = CABasicAnimation.init(keyPath: "transform.rotation.z")
rotationAnimation.toValue = NSNumber(value: (Double.pi))
rotationAnimation.duration = 1.0
rotationAnimation.isCumulative = true
rotationAnimation.repeatCount = 100.0
imageView.layer.add(rotationAnimation, forKey: "rotationAnimation")


Вот функции расширения для UIView, которые обрабатывают запуск и остановку операций вращения:

extension UIImageView {

    func startRotation() {
        let rotation : CABasicAnimation = CABasicAnimation(keyPath: "transform.rotation.z")
        rotation.fromValue = 0
        rotation.toValue = NSNumber(value: Double.pi)
        rotation.duration = 5.0
        rotation.isCumulative = true
        rotation.repeatCount = FLT_MAX
        self.layer.add(rotation, forKey: "rotationAnimation")
    }

    func stopRotation() {
        self.layer.removeAnimation(forKey: "rotationAnimation")
    }
}


Теперь используем закрытие UIView.animation:

UIView.animate(withDuration: 0.5, animations: { 
      imageView.transform = CGAffineTransform(rotationAngle: (CGFloat(Double.pi)) 
}) { (isAnimationComplete) in
    // Animation completed 
}

Посмотреть результат с помощью расширения:

enter image description here

0 голосов
/ 01 января 2014

Я знаю, что это очень старый пост.Одним из решений является сделать ваше изображение прозрачным в желтой части.Вы можете использовать бесплатный инструмент pngweasel.Сделать желтую часть прозрачной - это даст только изображение солнечных лучей.Используйте простой желтый фон для этого изображения.Теперь вы можете легко вращать новое (солнечные лучи) изображение, используя код ниже

CABasicAnimation *rotate;
rotate = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
rotate.fromValue = [NSNumber numberWithFloat:0];
rotate.toValue = [NSNumber numberWithFloat:(0.0175*180)]; //[NSNumber numberWithFloat:deg2rad(10)];
rotate.duration = 0.5;
rotate.repeatCount = 1;
[self.image.layer addAnimation:rotate forKey:@"10"];
...