iOSアイコンジグルアルゴリズム



Ios Icon Jiggle Algorithm



解決:


@ Vic320の答えは良いですが、個人的には翻訳が好きではありません。私は彼のコードを編集して、個人的には踏み台のぐらつき効果のように見えるソリューションを提供しました。ほとんどの場合、翻訳なしで、少しランダム性を追加し、回転に焦点を当てることによって達成されます。

#definedegreesToRadians(x)(M_PI *(x)/ 180.0)#define kAnimationRotateDeg 1.0-(void)startJiggling {NSInteger randomInt = arc4random_uniform(500); float r =(randomInt / 500.0)+0.5; CGAffineTransform leftWobble = CGAffineTransformMakeRotation(degreesToRadians((kAnimationRotateDeg * -1.0)-r)); CGAffineTransform rightWobble = CGAffineTransformMakeRotation(degreesToRadians(kAnimationRotateDeg + r)); self.transform = leftWobble; //開始点[[自己層] setAnchorPoint:CGPointMake(0.5、0.5)]; [UIView animateWithDuration:0.1 delay:0 options:UIViewAnimationOptionAllowUserInteraction | UIViewAnimationOptionRepeat | UIViewAnimationOptionAutoreverseアニメーション:^ {[UIView setAnimationRepeatCount:NSNotFound]; self.transform = rightWobble; }完了:nil]; }-(void)stopJiggling {[self.layer removeAllAnimations]; self.transform = CGAffineTransformIdentity; }


ただし、クレジットが必要な場合は、@ Vic320の回答がこのコードの基礎を提供したため、+ 1になります。




OK、それで、openspringboardコードは私にとっては完全にはうまくいきませんでしたが、私は少し良いと思うコードを作成することを許可しましたが、それでも完璧ではありませんが、より良いです。誰かがこれをより良くするための提案を持っているなら、私はそれらを聞いてみたいです...(あなたが揺り動かしたいビューのサブクラスにこれを追加してください)

#definedegreesToRadians(x)(M_PI *(x)/ 180.0)#define kAnimationRotateDeg 1.0 #define kAnimationTranslateX 2.0 #define kAnimationTranslateY 2.0-(void)startJiggling:(NSInteger)count {CGAffineTransform leftWobble = CGAffineTransformMakeRotation(degreesToRadian 2?+1:-1))); CGAffineTransform rightWobble = CGAffineTransformMakeRotation(degreesToRadians(kAnimationRotateDeg *(count%2?-1:+1))); CGAffineTransform moveTransform = CGAffineTransformTranslate(rightWobble、-kAnimationTranslateX、-kAnimationTranslateY); CGAffineTransform conCatTransform = CGAffineTransformConcat(rightWobble、moveTransform); self.transform = leftWobble; //開始点[UIViewanimateWithDuration:0.1 delay:(count * 0.08)options:UIViewAnimationOptionAllowUserInteraction | UIViewAnimationOptionRepeat | UIViewAnimationOptionAutoreverseアニメーション:^ {self.transform = conCatTransform; }完了:nil]; }-(void)stopJiggling {[self.layer removeAllAnimations]; self.transform = CGAffineTransformIdentity; //まっすぐに設定します} 

@mientus Swift4の元のAppleJiggleコード。期間(速度)、変位(位置の変更)、度​​(回転量)を調整するためのオプションのパラメーターが含まれています。



private funcdegreesToRadians(_ x:CGFloat)-> CGFloat {return .pi * x / 180.0} func startWiggle(duration:Double = 0.25、displacement:CGFloat = 1.0、degreesRotation:CGFloat = 2.0){letnegativeDisplacement = -1.0 *変位let position = CAKeyframeAnimation.init(keyPath: 'position')position.beginTime = 0.8 position.duration = duration position.values = [NSValue(cgPoint:CGPoint(x:negativeDisplacement、y:negativeDisplacement))、NSValue(cgPoint:CGPoint( x:0、y:0))、NSValue(cgPoint:CGPoint(x:negativeDisplacement、y:0))、NSValue(cgPoint:CGPoint(x:0、y:negativeDisplacement))、NSValue(cgPoint:CGPoint(x: negativeDisplacement、y:negativeDisplacement))] position.calculationMode = 'linear' position.isRemovedOnCompletion = false position.repeatCount = Float.greatestFiniteMagnitude position.beginTime = CFTimeInterval(Float(arc4random())。truncatingRemainder(dividingBy:Float(25))/ Float(100))position.isAdditive = true let transform = CAKeyframeAnimation.init(keyPath: ' transform ')transform.beginTime = 2.6 transform.duration = duration transform.valueFunction = CAValueFunction(name:kCAValueFunctionRotateZ)transform.values = [degreesToRadians(-1.0 * degreesRotation)、degreesToRadians(degreesRotation)、degreesToRadians(-1.0 * degreesRotation)]変換.calculationMode = 'linear' transform.isRemovedOnCompletion = false transform.repeatCount = Float.greatestFiniteMagnitude transform.isAdditive = true transform.beginTime = CFTimeInterval(Float(arc4random())。truncatingRemainder(dividingBy:Float(25))/ Float(100) )self.layer.add(position、forKey:nil)self.layer.add(transform、forKey:nil)}