Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
CALayer Animationʵ¼ù£¨Èý£©£ºiPhone¾­µä»¬¶¯½âËø¶¯»­
 
×÷Õߣº¸¶ÓîÐù À´Ô´£ºCSDN ·¢²¼ÓÚ£º 2015-09-24
  3723  次浏览      27
 

ÕªÒª£º±¾ÎÄΪ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Öж¨ÒåÒ»¸ö³£Á¿£º

var text = "DevTalking" 

È»ºóÔÚ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)·½·¨¡£±àÒëÔËÐдúÂë¿´¿´×îÖÕЧ¹û£º

   
3723 ´Îä¯ÀÀ       27
 
Ïà¹ØÎÄÕÂ

ÊÖ»úÈí¼þ²âÊÔÓÃÀýÉè¼ÆÊµ¼ù
ÊÖ»ú¿Í»§¶ËUI²âÊÔ·ÖÎö
iPhoneÏûÏ¢ÍÆËÍ»úÖÆÊµÏÖÓë̽ÌÖ
AndroidÊÖ»ú¿ª·¢£¨Ò»£©
 
Ïà¹ØÎĵµ

Android_UI¹Ù·½Éè¼Æ½Ì³Ì
ÊÖ»ú¿ª·¢Æ½Ì¨½éÉÜ
androidÅÄÕÕ¼°ÉÏ´«¹¦ÄÜ
Android½²ÒåÖÇÄÜÊÖ»ú¿ª·¢
Ïà¹Ø¿Î³Ì

Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
Androidϵͳ¿ª·¢
AndroidÓ¦Óÿª·¢
ÊÖ»úÈí¼þ²âÊÔ
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

androidÈË»ú½çÃæÖ¸ÄÏ
AndroidÊÖ»ú¿ª·¢£¨Ò»£©
AndroidÊÖ»ú¿ª·¢£¨¶þ£©
AndroidÊÖ»ú¿ª·¢£¨Èý£©
AndroidÊÖ»ú¿ª·¢£¨ËÄ£©
iPhoneÏûÏ¢ÍÆËÍ»úÖÆÊµÏÖ̽ÌÖ
ÊÖ»úÈí¼þ²âÊÔÓÃÀýÉè¼ÆÊµ¼ù
ÊÖ»ú¿Í»§¶ËUI²âÊÔ·ÖÎö
ÊÖ»úÈí¼þ×Ô¶¯»¯²âÊÔÑо¿±¨¸æ


Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
AndroidÓ¦Óÿª·¢
Androidϵͳ¿ª·¢
ÊÖ»úÈí¼þ²âÊÔ
ǶÈëʽÈí¼þ²âÊÔ
AndroidÈí¡¢Ó²¡¢ÔÆÕûºÏ


ÁìÏÈIT¹«Ë¾ android¿ª·¢Æ½Ì¨×î¼Ñʵ¼ù
±±¾© Android¿ª·¢¼¼Êõ½ø½×
ijÐÂÄÜÔ´ÁìÓòÆóÒµ Android¿ª·¢¼¼Êõ
ijº½Ì칫˾ Android¡¢IOSÓ¦ÓÃÈí¼þ¿ª·¢
°¢¶û¿¨ÌØ LinuxÄÚºËÇý¶¯
°¬Ä¬Éú ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ
Î÷ÃÅ×Ó Ç¶Èëʽ¼Ü¹¹Éè¼Æ