ÕªÒª£º±¾ÎÄΪCALayer AnimationϵÁеÚÈýƪ¡£Ê±ÖÁ½ñÈÕ£¬ÎÞÂÛiPhone»úÉíÑùʽÈçºÎ¸Ä±ä£¬ÆÁÄ»³ß´çÈçºÎ¸Ä±ä£¬iOSϵͳÈçºÎ¸Ä±ä£¬Î¨ÓÐËøÆÁµ×²¿ÉÁ˸µÄ»¬¶¯À´½âËø²»±ä¡£ËüµÄ¶¯»Ð§¹ûÊÇÈçºÎʵÏÖµÄÄØ£¿ÕâÆªÎÄÕÂ»á¸æËßÄãÃǴ𰸡£
ÔںܶàÈ˵ÄÐÄÄ¿ÖÐiPhoneµÄ¾µä»úÐÍÓ¦¸ÃÊÇiPhone4£¬¾«Õ¿µÄ¹¤ÒÕ¡¢ÍêÃÀµÄÆÁÄ»ÅäÉϰµÉ«µÄËøÆÁ±ÚÖ½£¬¿´×ÅÆÁÄ»µ×²¿ÉÁ˸µÄslide to unlock×ÖÑù£¬¸ß±Æ¸ñÕÃÏÔÎÞÒÅ¡£Ê±ÖÁ½ñÈÕÎÞÂÛiPhone»úÉíÑùʽÈçºÎ¸Ä±ä£¬ÆÁÄ»³ß´çÈçºÎ¸Ä±ä£¬iOSϵͳÈçºÎ¸Ä±ä£¬Î¨ÓÐËøÆÁµ×²¿ÉÁ˸µÄ»¬¶¯À´½âËø²»±ä¡£ËüµÄ¶¯»Ð§¹ûÊÇÈçºÎʵÏÖµÄÄØ£¬ÕâÆªÎÄÕÂ»á¸æËßÄãÃǴ𰸡£
CAGradientLayer
н¨Ò»¸öÓ¦ÓÃÃûΪGradientAnimation£¬´ò¿ªMain.storyboard£¬½«ViewControllerµÄView±³¾°É«ÉèÖÃΪ»ÒºÚÉ«£¬ÍÏÒ»¸öUIViewµ½ViewControllerÖУ¬½«ÆäÑÕÉ«ÉèÖÃΪÎÞÉ«²¢ÉèÖúò¼¾ÖÔ¼Êø£º

½Ó×ÅÎÒÃÇÍÏÒ»¸öUILabelµ½¸Õ²ÅÍÏÈëµÄUIViewÖУ¬ÉèÖø߿íµÈͬÓÚËüµÄ¸¸ÊÓͼ£º

ÎÒ¶Ô¸ÃUILabelµÄÊôÐÔÉèÖÃÈçÏ£º

Ö®ºó£¬ÎÒÃÇÔÚViewControllerÖÐÌí¼ÓUIViewºÍUILabelµÄOutlet£º

½ÓÏÂÀ´»Øµ½ViewController.swift£¬ÎÒÃÇÌí¼ÓÒ»¸ö³£Á¿ÊôÐÔgradientLayer£º
let gradientLayer = CAGradientLayer() |
ÕâÀï³öÏÖÁËCALayerµÄÁíÒ»¸ö×ÓÀàCAGradientLayer£¬Õâ¸öÀàµÄ×÷ÓþÍÊÇÄÜÔÚLayerÉÏ»æÖƳö½¥±äÑÕÉ«µÄЧ¹û£¬È»ºóÔÚviewDidLoad()ÖÐÌí¼ÓÈçÏ´úÂ룺
gradientLayer.bounds = CGRect(x: 0, y: 0, width: backgroundView.frame.size.width, height: backgroundView.frame.size.height) gradientLayer.position = CGPoint(x: backgroundView.frame.size.width/2, y: backgroundView.frame.size.height/2) |
ÉÏÊöÁ½ÐеĴúÂëÊÇÉèÖÃLayerµÄ´óС¼°Î»Öã¬ÕâÔÚÉÏÁ½ÆªÎÄÕÂÖÐÒѾ½²¹ý£¬ÕâÀï¾Í²»ÔÙÀÛ׸ÁË¡£½Ó×ÅÎÒÃǼÌÐøÌí¼ÓÁ½ÐдúÂ룺
gradientLayer.startPoint = CGPoint(x: 0, y: 0.5) gradientLayer.endPoint = CGPoint(x: 1, y: 0.5) |
¼ÈÈ»CAGradientLayer¿ÉÒÔ»æÖƳö½¥±äÑÕÉ«µÄЧ¹û£¬ÄÇ×ÔÈ»ÓÐÑÕÉ«½¥±äµÄ·½Ïò£¬ËùÒÔÕâÁ½ÐдúÂëµÄ×÷ÓþÍÊÇÉèÖÃÑÕÉ«½¥±äµÄÆðʼµãºÍ½áÊøµã£¬ÕâÁ½¸öÊôÐÔ¹²Í¬¾ö¶¨ÁËÑÕÉ«½¥±äµÄ·½Ïò£º

´ÓÉÏÃæµÄʾÒâͼÖпÉÒÔ¿´³ö£¬CAGradientLayerÊÇͨ¹ýÆðʼµãºÍ½áÊøµãµÄ×ø±êλÖÃÀ´¾ö¶¨ÑÕÉ«½¥±äµÄ·½ÏòµÄ£¬ÆðʼµãµÄĬÈÏÖµÊÇ(0.5, 0)£¬½áÊøµãµÄĬÈÏÖµÊÇ(0.5, 1)£¬Ò²¾ÍÊÇ˵ĬÈϵÄÑÕÉ«½¥±ä·½ÏòÊÇÑØ´¹Ö±ÖÐÏß´ÓÉÏÍùϽ¥±äµÄ£¬ÎÒÃÇÔÚÕâÀォËü¸Ä³ÉÁËÑØË®Æ½ÖÐÏß´Ó×óÍùÓÒ½¥±ä¡£
½ÓÏÂÀ´ÎÒÃÇÉèÖÃCAGradientLayerµÄ½¥±äÑÕÉ«£¬½Ó×ÅÌí¼ÓÈçÏ´úÂ룺
gradientLayer.colors = [ UIColor.blackColor().CGColor, UIColor.whiteColor().CGColor, UIColor.blackColor().CGColor ] |
CAGradientLayerµÄcolorsÊôÐÔÀàÐÍÊÇÒ»¸öÊý×é[AnyObject]£¬Õâ¾ÍÒâζ×ÅÎÒÃÇ¿ÉÒÔʵÏÖ¶à¸öÑÕÉ«µÄ½¥±äЧ¹û£¬²¢ÇÒ¿ÉÒԹ涨¸÷¸öÑÕÉ«µÄ˳Ðò¡£²»¹ýÔÚÎÒÃÇÕâ¸öʾÀýÖÐÎÒÃÇÖ»ÐèÒªÁ½ÖÖÑÕÉ«£¬²»¹ýÐèҪעÒâµÄÊÇËäÈ»ÑÕɫֻÓÐÁ½ÖÖ£¬µ«ÊÇÕû¸öÑÕÉ«½¥±äµÄ¹ý³ÌÖÐÓÐÈý¸öÔÉ«µã£¬ÄǾÍÊǺڡ¢°×¡¢ºÚ£¬ËùÒÔÎÒÃÇÔÚÕâ¸öÊý×éÖÐÒ²ÐèÒª°´ÕÕÔÉ«µãµÄÊýÁ¿ºÍ˳ÐòÌí¼ÓÏàÓ¦µÄÑÕÉ«£¬ÄÄÅÂÑÕÉ«¶¼ÊÇÒ»ÑùµÄ¡£
ÎÒÃǼÈÈ»ÉèÖÃÁ˽¥±äµÄÈý¸öÔÉ«£¬ÄÇô¾ÍÒª¶ÔÕâÔÉ«³öÏÖµÄλÖýøÐÐÉèÖ㬽Ó×ÅÌí¼ÓÈçÏ´úÂ룺
gradientLayer.locations = [0.2, 0.5, 0.8] |
´ÓÉÏÊö´úÂëÖв»ÄÑ¿´³ö£¬ÎÒÃǽ«µÚÒ»¸öºÚÉ«ÔÉ«³öÏÖµÄλÖÃÉèÖÃÔÚÁËÕû¸öLayer³¤¶ÈµÄÊ®·ÖÖ®¶þµÄλÖ㬵ڶþ¸ö°×É«ÔÉ«ÔÚÖм䣬µÚÈý¸öºÚÉ«ÔÉ«ÔÚÊ®·ÖÖ®°ËµÄλÖãº

ÉèÖÃÍêCAGradientLayerµÄÏà¹ØÊôÐÔºó£¬ÎÒÃǽ«gradientLayerÌí¼Óµ½backgroundViewµÄLayerÖУº
backgroundView.layer.addSublayer(gradientLayer) |
ÏÖÔÚÎÒÃDZàÒëÔËÐÐһϴúÂë¿´¿´Ð§¹û£º

½ÓÏÂÀ´ÎÒÃÇÐèÒªÈÃÑÕÉ«½¥±ä¶¯ÆðÀ´£¬ÏÈ´´½¨Ò»¸ö·½·¨gradinetAnimate()£¬ÔÚ·½·¨ÖÐÌí¼ÓÈçÏ´úÂ룺
let gradient = CABasicAnimation(keyPath: "locations") gradient.fromValue = [0, 0, 0.25] gradient.toValue = [0.75, 1, 1] gradient.duration = 2.5 gradient.repeatCount = HUGE gradientLayer.addAnimation(gradient, forKey: nil) |
Ê×ÏÈ£¬´´½¨ÁËÒ»¸ölocationsÀàÐ͵͝»ÊµÀýgradient£¬½«fromValueÊôÐÔ£¬Ò²¾ÍÊÇÆðʼλÖõÄÊôÐÔÉèÖÃΪ[0, 0, 0.25]£¬ËüµÄÒâ˼ÊǶ¯»¿ªÊ¼Ç°£¬ºÚÉ«¡¢°×É«ÕâÁ½¸öÔÉ«µÄλÖÃÔÚÕû¸öLayerµÄ×îǰ¶Ë£¬µÚ¶þ¸öºÚÉ«ÔÉ«ÔÚ0.25µÄλÖãº

¶ø½áÊøÎ»ÖÃtoValue£¬½«°×É«ºÍµÚ¶þ¸öºÚÉ«ÔɫλÖÃÉèÖÃÔÚÕû¸öLayerµÄÄ©¶Ë£¬µÚÒ»¸öºÚÉ«ÔÉ«ÔÚ0.75µÄλÖãº

´ÓͼÖпÉÒÔ¿´³ö£¬´ËʱÕû¸öLayer¶¼±ä³ÉÁ˺ÚÉ«¡£Ò²¾ÍÊÇ˵£¬ÔÚÕû¸ö¶¯»ÖУ¬µÚÒ»¸öºÚÉ«ÔÉ«´Ó0ÒÆ¶¯µ½0.75µÄλÖ㬰×É«ÔÉ«´Ó0ÒÆ¶¯µ½1µÄλÖ㬵ڶþ¸öºÚÉ«ÔÉ«´Ó0.25ÒÆ¶¯µ½1µÄλÖá£È»ºóÉèÖö¯»Ê±¼äΪ2.5Ã룬ÎÞÏßÖØ¸´´ÎÊý£¬×îºó½«gradient¶¯»Ìí¼Óµ½gradientLayerÖС£ÎÒÃÇÔÚviewDidAppear()·½·¨Öе÷Óøö¯»·½·¨gradientAnimate()£¬±àÒëÔËÐп´¿´Ð§¹û£º

¶¯»Ð§¹û»¹²»Àµ£¬µ«ÊÇÈçºÎ½«ÑÕÉ«½¥±äµÄ¶¯»×÷ÓÃÔÚUILabelµÄÎÄ×ÖÉÏÄØ£¿Æäʵ·Ç³£¼òµ¥£¬¾ÍÊÇÈÃUILabelÉϵÄÎÄ×Ö³ÆÎªCAGradientLayerµÄÕÚÕÖ¼´¿É£¬ÎÒÃÇÏÈÔÚViewControllerÖж¨ÒåÒ»¸ö³£Á¿£º
È»ºóÔÚviewDidAppear()ÖеÄgradientAnimate()·½·¨Ö®Ç°Ìí¼ÓÈçÏ´úÂ룺
textLabel.text = text gradientLayer.mask = textLabel.layer |
ÎÒÃÇÔÙ±àÒëÔËÐдúÂë¿´¿´Ð§¹û£º

µ½Ä¿Ç°ÎªÖ¹£¬ËøÆÁÖ묶¯À´½âËøµÄ¶¯»Ð§¹û¾ÍÍê³ÉÁË£¬Õâ¸ö¶¯»Ð§¹ûÔÚFacebookµÄPaperÓ¦ÓÃÖÐÒ²ÓÐʹÓá£ÏÂÒ»½Ú£¬ÎÒÃÇÔڸö¯»µÄ»ù´¡É϶ÔÎÄ×ÖÔÙ¼ÓµãС¶¯»¡£
Text Animation
Ê×ÏÈÎÒÃÇ´ò¿ªAppDelegate.swift£¬ÔÚimport UIKitÏÂÃæÌí¼ÓÒ»¸ö·½·¨£º
func delay(seconds seconds: Double, completion:()->()) { let intervalTime = dispatch_time(DISPATCH_TIME_NOW, Int64( Double(NSEC_PER_SEC) * seconds )) dispatch_after(intervalTime, dispatch_get_main_queue(), { completion() }) } |
Õâ¸ö·½·¨µÄ×÷ÓÃÈçÆäÃû³ÆÒ»Ñù£¬ÊÇÒ»¸öÑÓ³Ù·½·¨£¬¸Ã·½·¨µÄµÚÒ»¸ö²ÎÊýÊÇÏëÒªÑÓ³ÙµÄʱ¼ä£¬µÚ¶þ¸ö²ÎÊýÊÇÒ»¸ö±Õ°ü£¬Ò²¾ÍÊÇÑÓ³ÙµÄÖ÷Ìå¡£Õâ¸ö·½·¨Óõ½ÁËGCDµÄ֪ʶ£¬dispatch_timeÖ÷ÒªÊÇÓÃÓÚ´´½¨Ò»¸öÀàÐÍΪdispatch_time_tµÄÏà¶Ôʱ¼ä£¬ËüµÄµÚÒ»¸ö²ÎÊýÖ¸µÄÊÇÆðʼʱ¼ä£¬Ò»°ã¶¼ÊÇÓÃÔ¤¶¨ÒåµÄDISPATCH_TIME_NOW×÷ΪµÚÒ»¸ö²ÎÊýµÄÖµ£¬´ú±íµ±Ç°µÄʱ¼ä¡£µÚ¶þ¸ö²ÎÊý´ú±íʱ¼ä¼ä¸ô£¬×¢ÒâÕâ¸ö²ÎÊýÐèÒªµÄʱ¼äµ¥Î»ÊÇÄÉÃ룬ËùÒÔÎÒÃÇʹÓÃÔ¤¶¨ÒåµÄNSEC_PER_SECÄÉÃ뵥λ³ËÒÔÏ£Íû¼ä¸ôµÄÃëÊý¡£
dispatch_afterÓÃÓÚÔÚ¶ÓÁÐÖж¨Ê±Ö´ÐÐÈÎÎñ£¬µ±ÄãÏëÔÚÒ»¶Îʱ¼äºóÖ´ÐÐÒ»¸öÈÎÎñ£¬ÄÇô¾Í¿ÉÒÔÓÃÕâ¸öº¯Êý¡£¸Ãº¯ÊýµÄµÚÒ»¸ö²ÎÊýÖ¸¶¨ÑÓ³ÙµÄʱ¼ä£¬µÚ¶þ¸ö²ÎÊýÖ¸¶¨Ò»¸ö¶ÓÁУ¬ÓÃÓÚÌí¼ÓÈÎÎñ£¬µÚÈý¸ö²ÎÊýÊÇÒ»¸ö±Õ°ü£¬Ò²¾ÍÊÇÒªÖ´ÐеÄÈÎÎñ¡£
È»ºó»Øµ½ViewController.swift£¬Ìí¼ÓÈçÏ·½·¨£º
func textAnimate(text: String) { if text.characters.count > 0 { textLabel.text = "\(textLabel.text!)\(text.substringToIndex(text.startIndex.successor()))" delay(seconds: 0.4, completion: { self.textAnimate(text.substringFromIndex(text.startIndex.successor())) }) } } |
¸Ã·½·¨µÄ²ÎÊýtext¾ÍÊÇUILabelÖÐÒªÏÔʾµÄÎÄ×ÖÄÚÈÝ¡£substringToIndex(_ to: Int)·½·¨µÄ×÷ÓÃÊÇ´Ó×Ö·û´®µÄ¿ªÍ·Ò»Ö±½ØÈ¡µ½Ö¸¶¨µÄλÖ㬵«²»°üÀ¨¸ÃÖ¸¶¨Î»ÖõÄ×Ö·û¡£text.startIndex.successor()Õâ¾äÒâ˼ÊÇ´ÓtextµÄÆðʼλÖÿªÊ¼È¡ºóÃæµÄÒ»¸ö×Ö·û¡£substringFromIndex(_ from: Int)·½·¨µÄ×÷ÓÃÊÇÒÔÖ¸¶¨Î»Öò¢°üÀ¨Ö¸¶¨Î»ÖõÄ×Ö·û¿ªÊ¼£¬Ò»Ö±½ØÈ¡Ö®ºóµÄÈ«²¿×Ö·û¡£ËùÒÔÕû¸ö·½·¨µÄ×÷ÓÃÊÇÿ¸ô0.4ÃëÏÔʾһ¸ö×Ö·û£¬Ö±µ½½«Õû¸ö×Ö·û´®ÏÔʾÍê¡£×îºóÔÚviewDidAppear()ÖÐ×¢Ê͵ôtextLabel.text = textÕâÐдúÂ룬²¢ÔÚ·½·¨×îºóµ÷ÓÃtextAnimate(text)·½·¨¡£±àÒëÔËÐдúÂë¿´¿´×îÖÕЧ¹û£º

|