انیمیشن یک خطی iOS Swift oneLineCodeAnimation

سلاممن یک برنامه نویس ساده ام که به طراحی علاقه دارم.هسته انیمیشن از نسخه iOS2 برای انیمیشن روی CALayer (لایه های گرافیکی View) پیاده شده، CALayer فرزند هایی مثل CATextLayer , CAShapeLayer , CAGradientLayer و... داره، که اکثر ویژگی های اونها قابلیت انیمیشن داره.برای پیاده سازی انیمیشن روی CALayer ها از آبجکت های مختلفی مثل CABasicAnimation و CAKeyframeAnimation یا CASpringAnimation ... باید استفاده کرد.به طور مثال این یک نمونه ساده از پیاده سازی انیمیشن روی یک لایه استlet animation = CABasicAnimation(keyPath: "transform.scale.y") animation.duration = 0.8 animation.toValue = 100 animation.isRemovedOnCompletion = false animation.fillMode = CAMediaTimingFillMode.forwards layer.add(animation, forKey: nil)اکثر حالتهای انیمیشن (از نوع شتابدار) به این چهار پارامتر نیاز دارن( toValue: , duration: , easingFunction: , delay: )پارامتر مبدا (fromValue) برای هر ویژگی با مقداردهی مستقیم به دست میاد.مثال:layer.position.x = 100شتاب (easingFunction) به میزان تغییر ویژگی در طول زمان گفته میشه.تو این سایت حالت های مختلف شتاب ببینید و برسی کنید https://easings.net شتاب از طریق CAMediaTimingFunction ایجاد میشه که به راحتی با چهار عدد مختصات controlPoints ساخته میشهمثال :let easeInOut = CAMediaTimingFunction(controlPoints: 0.7 , 0 , 0.3 , 1)شما میتونید از این سایت به دقیق ترین اعداد برای شتاب مد نظرتون برسید http://cubic-bezier.com/ من extention ساده ای برای CALayer نوشتم، که برای تقریباً تمام ویژگی های قابل انیمیشن لایه ها یک فانکشن با این پارامترها ( :toValue: , duration: , timingFunction: , delay ) تعریف شدهو شتابهایی با ۶ سرعت برای هر سه حالت (easeIn easeOut easeInOut) که در لیست LayerEasings.timing قابل دسترسیه و شبیه به این از تمامشون میشه استفاده کرد. layer.move(x: 100, duration: 1, easingFunction: LayerEasings.timing.easeInOut, delay: 0)نکته : بعضی از فانکشن ها فقط روی لایه هایی مثل CATextLayer یا CAGradietLayer کار میکنن که کاملا مشخصه و مارک کردم.یک فانکشن برای حالت لرزشی CASpringAnimation تعریف شده, تو این حالت شما نیاز به مقدار دهی damping و velocity دارید, میتونید برای هر ویژگی دیگه ام از CASpringAnimation استفاده کنید.برای کی فریم گذاشتن تو انیمیشن میتونید از همین فانکشن ها با استفاده از delay به بهترین نتیجه برسید و درگیر پیچیده گی های CAKeyframeAnimation نشید.شما میتونید از این فانکشن ها برای تمام View ها با (layer.) دسترسی پیدا کنید، بهتره تو انیمیشن UIView ها از UIViewPropertyAnimator استفاده کنید.با همین ساختار، extension رو برای UIView هم با UIViewPropertyAnimator نوشتم، با این تفاوت که شتاب تو UIViewPropertyAnimator با UICubicTimingParameters ساخته میشه مثال :let curveEaseInOut = UICubicTimingParameters(controlPoint1: CGPoint(x: 0.445, y: 0.05), controlPoint2: CGPoint(x: 0.55, y: 0.95))میتونید برای شتاب انیمیشن های view از لیست ViewEasings.timing استفاده کنیدمثال :view.move(x: 100, duration: 1, easingFunction: ViewEasings.timing.easeInOut, delay: 0)برای انیمیشن ها لرزشی (Spring) به جای easingFunction از ratio استفاده کنیدمثال :view.move(x: 100, duration: 1, ratio: 0.6, delay: 0)بهتره در یک رویداد از انیمیشن های UIView و CALayer همزمان استفاده نکنید.تو ساختار تمام انیمیشن ها completionhandler وجود داره که برای اون از Timer استفاده کنید یا خودتون براش بنویسید. فایل هارو تو xcode کپی کنید و یک بار command + b بزنید https://github.com/aminsadeghian/swift-one-line-code-animation امیدوارم این مطلب بتونه بهتون کمک کنهامین صادقیان