Preserve Ripple effect over UIImageView

梦想的初衷 提交于 2019-12-09 07:20:20

问题


I want to preserve Ripple effect on my UIImageView. I know we can animate image for ripple effect , but preserve. In other words I want a rippled image.

I know we can animate image using

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:25.0];
[UIView setAnimationTransition:(UIViewAnimationTransition) 110 forView:imgRipple cache:NO]; 
[UIView commitAnimations];

But it animates , doesn't keep the ripple. I think we can get rippled image if we Pause or Stop animation before it ends. Is it possible? how can we Pause or Stop UIView Animation?

If there is any alternate to this trick ,kindly mention it.

Thanks.


回答1:


I got my solution,

used this code

CFTimeInterval pausedTime = [imgRipple.layer convertTime:CACurrentMediaTime() fromLayer:nil];
     imgRipple.layer.speed = 0.0;
     imgRipple.layer.timeOffset = pausedTime;

and it paused




回答2:


I'm not sure if it gives you what you want, but you can stop animations using those:

#import <QuartzCore/QuartzCore.h>

[CATransaction begin];
[myView.layer removeAllAnimations];
[CATransaction commit];

You can get the current state before stopping animation using presentationLayer:

CALayer* myPreLayer = [myView.layer presentationLayer];
CATransform3D currentTransform = [myPreLayer transform];
//if you need some specific info, you can use key-value pairs
float currentAngle = [[myPreLayer valueForKeyPath:@"transform.rotation.z"] floatValue];



回答3:


swift 5

Imageview set ripple animation its working fine......

@IBOutlet weak var imageview: UIImageView!

override func viewDidLoad() {
        super.viewDidLoad()

        imageview.layer.cornerRadius = imageview.bounds.width / 2
        self.animateImage()

    }
    func animateImage() {
            addRippleEffect(to: viewAnimation)
        }

        func addRippleEffect(to referenceView: UIView) {
            /*! Creates a circular path around the view*/
            let path = UIBezierPath(ovalIn: CGRect(x: 0, y: 0, width: referenceView.bounds.size.width, height: referenceView.bounds.size.height))
            /*! Position where the shape layer should be */
            let shapePosition = CGPoint(x: referenceView.bounds.size.width / 2.0, y: referenceView.bounds.size.height / 2.0)
            let rippleShape = CAShapeLayer()
            rippleShape.bounds = CGRect(x: 0, y: 0, width: referenceView.bounds.size.width, height: referenceView.bounds.size.height)
            rippleShape.path = path.cgPath
            rippleShape.fillColor = UIColor.clear.cgColor
            rippleShape.strokeColor = UIColor.black.cgColor
            rippleShape.lineWidth = 5
            rippleShape.position = shapePosition
            rippleShape.opacity = 0

            /*! Add the ripple layer as the sublayer of the reference view */
            referenceView.layer.addSublayer(rippleShape)
            /*! Create scale animation of the ripples */
            let scaleAnim = CABasicAnimation(keyPath: "transform.scale")
            scaleAnim.fromValue = NSValue(caTransform3D: CATransform3DIdentity)
            scaleAnim.toValue = NSValue(caTransform3D: CATransform3DMakeScale(2, 2, 1))
            /*! Create animation for opacity of the ripples */
            let opacityAnim = CABasicAnimation(keyPath: "opacity")
            opacityAnim.fromValue = 1
            opacityAnim.toValue = 0
            /*! Group the opacity and scale animations */
            let animation = CAAnimationGroup()
            animation.animations = [scaleAnim, opacityAnim]
            animation.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeInEaseOut)
            animation.duration = CFTimeInterval(1.0)
            animation.repeatCount = .infinity
            animation.isRemovedOnCompletion = true
            rippleShape.add(animation, forKey: "rippleEffect")
        }


来源:https://stackoverflow.com/questions/9765709/preserve-ripple-effect-over-uiimageview

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!