无论如何将UIImageView的contentMode从aspectFill动画到aspectFit?

时间:2013-04-03 02:05:00

标签: ios animation uiimageview

[UIView animateWithDuration:30.0f delay:0.0f options:UIViewAnimationOptionCurveEaseInOut animations:^{
    v.contentMode = UIViewContentModeScaleAspectFit;
    v.frame = v.superview.bounds;
} completion:^(BOOL finished) {
    [v removeFromSuperview];
}];

我希望UIImageView调整大小并更改contentMode,但上面的代码不起作用。它在动画开始时立即更改了contentMode。

有没有办法给它制作动画?

8 个答案:

答案 0 :(得分:8)

正如其他人所说,无法为contentMode制作动画。

这个库的存在是为了解决这个问题! https://github.com/patrickbdev/PBImageView

imageView.contentMode = .scaleAspectFit

UIView.animateWithDuration(1) {
    self.imageView.contentMode = .scaleAspectFill
}

答案 1 :(得分:5)

基于“What Can Be Animated”,您无法直接为contentmode制作动画。但是,您可以尝试设置框架的动画,以获得与contentmode相同的行为。动画完成后,您可以将contentmode和frame设置回原始状态。

答案 2 :(得分:2)

要实现这一点,您可以在github上使用此组件:https://github.com/VivienCormier/UIImageViewModeScaleAspect

答案 3 :(得分:1)

UIImageViewcontentMode继承其UIView属性。它不是您可以设置动画的属性之一。有关详细信息,请参阅View Programming Guide

答案 4 :(得分:0)

MishieMoo是对的。 contentMode不能动画。我认为你可以改变视图的界限来实现你想要的。

答案 5 :(得分:0)

是的,contentMode不能动画,但是" center"可以 - 在帧或边界动画不符合条件的情况下,将其用于contentMode动画模拟

答案 6 :(得分:0)

我认为你需要这个:https://github.com/vitoziv/VICMAImageView

您可以像使用UIImageView一样使用VICMAImageView,并在动画块中为contentMode设置动画:

[UIView animateWithDuration:0.3
                 animations:^{
                     imageView.contentMode = UIViewContentModeScaleAspectFill;
                 }];

答案 7 :(得分:0)

我认为自iOS 4.0起,您可以按照this post中所述使用UIView.transition(...)为过渡设置动画。在Swift 5中,它看起来像这样:

let contentMode: UIView.ContentMode = imageView.contentMode == .scaleAspectFit ? .scaleAspectFill : .scaleAspectFit
UIView.transition(with: imageView, duration: 0.5,
                  options: .transitionFlipFromBottom,
                  animations: {
                    self.imageView.contentMode = contentMode
                  },
                  completion: nil)