
ÈçÄãËùÖª£¬ÎÒÃÇÔÚiOSÓ¦ÓÃÖп´µ½µÄ¶¼ÊÇÊÓͼ£¨view£©£¬°üÀ¨°´Å¥ÊÓͼ¡¢±íÊÓͼ¡¢»¬¶¯ÌõÊÓͼ£¬»¹ÓпÉÒÔÈÝÄÉÆäËûÊÓͼµÄ¸¸ÊÓͼµÈ¡£
µ«Äã»òÐí²»ÖªµÀÔÚiOSÖÐÖ§³ÅÆðÿ¸öÊÓͼµÄÊÇÒ»¸ö½Ð×ö"ͼ²ã£¨layer£©"µÄÀ࣬ȷÇеØËµÊÇCALayer¡£
±¾ÎÄÖÐÄú»áÁ˽âCALayer¼°Æä¹¤×÷ÔÀí£¬»¹ÓÐÓ¦ÓÃCALayer´òÔì¿áìÅЧ¹ûµÄÊ®ÔòʾÀý£¬±ÈÈç»æÖÆÊ¸Á¿Í¼ÐΡ¢½¥±äÉ«£¬ÉõÖÁÊÇÁ£×Óϵͳ¡£
±¾ÎÄÒªÇó¶ÁÕßÊìϤiOSÓ¦Óÿª·¢ºÍSwiftÓïÑԵĻù´¡ÖªÊ¶£¬°üÀ¨ÀûÓÃStoryboard¹¹½¨Óû§½çÃæ¡£
×¢£ºÈç¹ûÄúÉÐÎ´ÕÆÎÕÕâЩ»ù´¡£¬²»±Øµ£ÐÄ£¬ÎÒÃÇÓв»ÉÙÏà¹Ø½Ì³Ì£¬ÀýÈçʹÓÃSwiftÓïÑÔ±àдiOSÓ¦ÓúÍiOSѧͽ¡£
×¼±¸¿ªÊ¼
ÒªÀí½âͼ²ãÊÇʲô£¬×î¼ò±ãµÄ·½Ê½¾ÍÊÇ"ʵµØ¿¼²ì"¡£ÎÒÃÇÕâ¾Í´´½¨Ò»¸ö¼òµ¥µÄÏîÄ¿£¬´ÓÍ·¿ªÊ¼Íæ×ªÍ¼²ã¡£
×¼±¸ºÃд´úÂëÁËÂ𣿺ã¡Æô¶¯Xcode£¬È»ºó£º
1.Ñ¡ÔñFile\New\Project²Ëµ¥Ïî¡£
2.ÔÚ¶Ô»°¿òÖÐÑ¡ÔñiOS\Application\Single View Application¡£
3.µã»÷Next£¬Product NameÌîдCALayerPlayground£¬È»ºóÊäÈëÄã×Ô¼ºµÄOrganization
NameºÍIdentifier¡£
4.LanguageÑ¡Swift£¬DevicesÑ¡Universal¡£
5.È¡ÏûÑ¡ÔñCore Data£¬µã»÷Next¡£
6.°ÑÏîÄ¿±£´æµ½ºÏÊʵÄλÖ㨸öÈËϰ¹ß°ÑÏîÄ¿·ÅÔÚÓû§Ä¿Â¼Ï½¨Á¢µÄSourceÎļþ¼Ð£©£¬µã»÷Create¡£
ºÃ£¬Îļþ×¼±¸¾ÍÐ÷£¬½ÓÏÂÀ´¾ÍÊÇ´´½¨ÊÓͼÁË£º
7.ÔÚÏîÄ¿µ¼º½À¸£¨Project navigator£©ÖÐÑ¡ÔñMain.storyboard¡£
8.Ñ¡ÔñView\Assistant Editor\Show Assistant Editor²Ëµ¥ÏÈç¹ûûÓÐÏÔʾ¶ÔÏó¿â£¨Object
Library£©£¬ÇëÑ¡ÔñView\Utilities\Show Object Library¡£
9.È»ºóÑ¡ÔñEditor\Canvas\Show Bounds Rectangles£¬ÕâÑùÔÚÏò³¡¾°Ìí¼ÓÊÓͼʱ¾Í¿ÉÒÔ¿´µ½ÂÖÀªÁË¡£
10.°ÑÒ»¸öÊÓͼ£¨View£©´Ó¶ÔÏó¿âÍÏÈëÊÓͼ¿ØÖÆÆ÷³¡¾°£¬±£³ÖÑ¡ÖÐ״̬£¬Ôڳߴç¼ì²éÆ÷£¨View\Utilities\Show
Size Inspector£©Öн«xºÍyÉèΪ150£¬WidthºÍHeightÉèΪ300¡£
11.ÊÓͼ±£³ÖÑ¡ÖУ¬µã»÷×Ô¶¯²¼¾Ö¹¤¾ßÀ¸£¨StoryboardÓÒϽǣ©µÄAlign°´Å¥£¬Ñ¡ÖÐHorizontal
Center in ContainerºÍVertical Center in Container£¬ÊýÖµ¾ùΪ0£¬È»ºóµã»÷Add
2 Constraints¡£
12.µã»÷Pin°´Å¥£¬Ñ¡ÖÐWidthºÍHeight£¬ÊýÖµ¾ùÉèΪ300£¬µã»÷Add 2 Constraints¡£
×îºó°´×¡control´Ó¸Õ¸Õ´´½¨µÄÊÓͼÍϵ½ViewController.swiftÎļþÖÐviewDidLoad()·½·¨µÄÉÏ·½£¬ÔÚµ¯¿òÖн«outletÃüÃûΪviewForLayer£¬Èçͼ£º

µã»÷Connect´´½¨outlet¡£
½«ViewController.swiftÖеĴúÂë¸ÄдΪ£º
import UIKit class ViewController: UIViewController { @IBOutlet weak var viewForLayer: UIView! var l: CALayer { return viewForLayer.layer } override func viewDidLoad() { super.viewDidLoad() setUpLayer() } func setUpLayer() { l.backgroundColor = UIColor.blueColor().CGColor l.borderWidth = 100.0 l.borderColor = UIColor.redColor().CGColor l.shadowOpacity = 0.7 l.shadowRadius = 10.0 } } |
֮ǰÌáµ½iOSÖеÄÿ¸öÊÓͼ¶¼ÓµÓÐÒ»¸ö¹ØÁªµÄͼ²ã£¬Äã¿ÉÒÔͨ¹ýyourView.layer·ÃÎÊͼ²ã¡£Õâ¶Î´úÂëÊ×ÏÈ´´½¨ÁËÒ»¸ö½Ð"l"£¨Ð¡Ð´L£©µÄ¼ÆËãÊôÐÔ£¬·½±ã·ÃÎÊviewForLayerµÄͼ²ã£¬¿ÉÈÃÄãÉÙдһЩ´úÂë¡£
Õâ¶Î´úÂ뻹µ÷ÓÃÁËsetUpLayer·½·¨ÉèÖÃͼ²ãÊôÐÔ£ºÒõÓ°£¬À¶É«±³¾°£¬ºìÉ«´Ö±ß¿ò¡£ÄãÂíÉϾͿÉÒÔÁ˽âÕâЩ¶«Î÷£¬²»¹ýÏÖÔÚ»¹ÊÇÏȹ¹½¨App£¬ÔÚiOSÄ£ÄâÆ÷ÖÐÔËÐУ¨ÎÒÑ¡ÁËiPhone
6£©£¬¿´¿´×Ô¶¨ÒåµÄͼ²ãÈçºÎ¡£

¼¸ÐдúÂ룬Ч¹û»¹²»´í°É£¿»¹ÊÇÄǾ仰£¬Ã¿¸öÊÓͼ¶¼ÓÉͼ²ãÖ§³Å£¬ËùÒÔÄãÒ²¿ÉÒÔ¶ÔAppÖеÄÈκÎÊÓͼ×ö³öÀàËÆÐ޸ġ£ÎÒÃǼÌÐøÉîÈë¡£
CALayer»ù±¾ÊôÐÔ
CALayerÓм¸¸öÊôÐÔ¿ÉÒÔÓÃÀ´×Ô¶¨Íâ¹Û£¬ÏëÏë¸Õ²Å×öµÄ£º
°Ñͼ²ã±³¾°É«´ÓĬÈϵÄÎÞÉ«¸ÄΪÀ¶É«
ͨ¹ý°Ñ±ß¿ò¿í¶È´ÓĬÈϵÄ0¸ÄΪ100À´Ìí¼Ó±ß¿ò
°Ñ±ß¿òÑÕÉ«´ÓĬÈϵĺÚÉ«¸ÄΪºìÉ«
×îºó°ÑÒõӰ͸Ã÷¶È´Ó0£¨È«Í¸Ã÷£©¸ÄΪ0.7£¬²úÉúÒõӰЧ¹û£¬´ËÍ⻹°ÑÒõÓ°°ë¾¶´ÓĬÈϵÄ3¸ÄΪ10¡£
ÒÔÉÏÖ»ÊÇCALayerÖпÉÒÔÉèÖõIJ¿·ÖÊôÐÔ¡£ÎÒÃÇÔÙÊÔÁ½¸ö£¬ÔÚsetUpLayer()ÖÐ×·¼ÓÒÔÏ´úÂ룺
l.contents = UIImage(named: "star")?.CGImage l.contentsGravity = kCAGravityCenter |
CALayerµÄcontentsÊôÐÔ¿ÉÒÔ°Ñͼ²ãµÄÄÚÈÝÉèΪͼƬ£¬ÕâÀïÎÒÃÇÒªÉèÖÃÒ»ÕÅ"ÐÇÐÇ"µÄͼƬ£¬Îª´ËÄãÐèÒª°ÑͼƬÌí¼Óµ½ÏîÄ¿ÖУ¬ÇëÏÂÔØÍ¼Æ¬²¢Ìí¼Óµ½ÏîÄ¿ÖС£
¹¹½¨£¬ÔËÐУ¬ÐÀÉÍÒ»ÏÂЧ¹û£º

×¢ÒâÐÇÐǾÓÖУ¬ÕâÊÇÒòΪcontentsGravityÊôÐÔ±»ÉèΪkCAGravityCenter£¬ÈçÄãËùÏë£¬ÖØÐÄÒ²¿ÉÒÔÉèΪÉÏ¡¢ÓÒÉÏ¡¢ÓÒ¡¢ÓÒÏ¡¢Ï¡¢×óÏ¡¢×ó¡¢×óÉÏ¡£
¸ü¸Äͼ²ãÍâ¹Û
½ö¹©ÓéÀÖ£¬ÎÒÃÇÀ´Ìí¼Ó¼¸¸öÊÖÊÆÊ¶±ðÆ÷À´¿ØÖÆÍ¼²ãÍâ¹Û¡£ÔÚXcodeÖУ¬ÏòviewForLayer¶ÔÏóÉÏÍÏÒ»¸öÇá´¥ÊÖÊÆÊ¶±ðÆ÷£¨tap
gesture recognizer£©£¬¼ûÏÂͼ£º

×¢£ºÈç¹ûÄã¶ÔÊÖÊÆÊ¶±ðÆ÷±È½ÏİÉú£¬Çë²ÎÔÄUsing UIGestureRecognizer with Swift¡£
ÒÔ´ËÀàÍÆ£¬ÔÙÌí¼ÓÒ»¸öÄóºÏÊÖÊÆÊ¶±ðÆ÷£¨pinch gesture recognizer£©¡£
È»ºó°´×¡controlÒÀ´Î½«Á½¸öÊÖÊÆÊ¶±ðÆ÷´ÓStoryboard³¡¾°Í£¿¿À¸ÍÏÈëViewController.swift£¬·ÅÔÚsetUpLayer()ºÍÀà×ÔÉíµÄ±ÕºÏ»¨À¨ºÅÖ®¼ä¡£
ÔÚµ¯¿òÖÐÐÞ¸ÄÁ¬½ÓΪAction£¬ÃüÃûÇᴥʶ±ð²Ù×÷ΪtapGestureRecognized£¬ÄóºÏʶ±ð²Ù×÷ΪpinchGestureRecognized£¬ÀýÈ磺

ÈçϸÄдtapGestureRecognized(_:)£º
@IBAction func tapGestureRecognized(sender: UITapGestureRecognizer) { l.shadowOpacity = l.shadowOpacity == 0.7 ? 0.0 : 0.7 } |
µ±ÁîÊÓͼʶ±ð³öÇá´¥ÊÖÊÆÊ±£¬´úÂë¸æÖªviewForLayerͼ²ãÔÚ0.7ºÍ0Ö®¼äÇл»ÒõӰ͸Ã÷¶È¡£
Äã˵ÊÓͼ£¿àÅ£¬Ã»´í£¬ÖØÐ´CALayerµÄhitTest(_:)Ò²¿ÉÒÔʵÏÖÏàͬЧ¹û£¬±¾ÎĺóÃæÒ²»á¿´µ½Õâ¸ö·½·¨£¬²»¹ýÎÒÃÇÕâÀïÓõķ½·¨Ò²ÓеÀÀí£ºÍ¼²ã±¾Éí²¢²»ÄÜÏìÓ¦ÊÖÊÆÊ¶±ð£¬Ö»ÄÜÏìÓ¦µã»÷²âÊÔ£¬ËùÒÔÎÒÃÇÔÚÊÓͼÉÏÉèÖÃÁËÇá´¥ÊÖÊÆÊ¶±ðÆ÷¡£
È»ºóÈçÏÂÐÞ¸ÄpinchGestureRecognized(_:)£º
@IBAction func pinchGestureRecognized(sender: UIPinchGestureRecognizer) { let offset: CGFloat = sender.scale < 1 ? 5.0 : -5.0 let oldFrame = l.frame let oldOrigin = oldFrame.origin let newOrigin = CGPoint(x: oldOrigin.x + offset, y: oldOrigin.y + offset) let newSize = CGSize(width: oldFrame.width + (offset * -2.0), height: oldFrame.height + (offset * -2.0)) let newFrame = CGRect(origin: newOrigin, size: newSize) if newFrame.width >= 100.0 && newFrame.width <= 300.0 { l.borderWidth -= offset l.cornerRadius += (offset / 2.0) l.frame = newFrame } } |
´Ë´¦»ùÓÚÓû§µÄÄóºÏÊÖÊÆ´´½¨Õý¸ºÆ«ÒÆÖµ£¬½è´Ëµ÷Õûͼ²ã¿ò¼Ü´óС¡¢±ßÔµ¿í¶ÈºÍ±ß½Ç°ë¾¶¡£
ͼ²ãµÄ±ß½Ç°ë¾¶Ä¬ÈÏֵΪ0£¬Òâ¼´±ê×¼µÄ90¶ÈÖ±½Ç¡£Ôö´ó°ë¾¶»á²úÉúÔ²½Ç£¬Èç¹ûÏ뽫ͼ²ã±ä³ÉÔ²ÐΣ¬¿ÉÒÔÉè±ß½Ç°ë¾¶Îª¿í¶ÈµÄÒ»°ë¡£
×¢Ò⣺µ÷Õû±ß½Ç°ë¾¶²¢²»»á²Ã¼ôͼ²ãÄÚÈÝ£¨ÐÇÐÇͼƬ£©£¬³ý·Çͼ²ãµÄmasksToBoundsÊôÐÔ±»ÉèΪtrue¡£
¹¹½¨ÔËÐУ¬³¢ÊÔÔÚÊÓͼÖÐʹÓÃÇá´¥ºÍÄóºÏÊÖÊÆ£º

ºÙ£¬ÔٺúÃ×°°çһ϶¼Äܵ±Í·ÏñÓÃÁË£¡ :]
CALayerÌåÑé
CALayerÖеÄÊôÐԺͷ½·¨ÁÕÀÅÂúÄ¿£¬´ËÍ⻹Óм¸¸ö°üº¬ÌØÓÐÊôÐԺͷ½·¨µÄ×ÓÀà¡£
Òª±éÀúÈç´Ë¿áìŵÄAPI£¬Raywenderlich.comµ¼ÓÎÏÈÉú×îºÃ²»¹ýÁË¡£
½ÓÏÂÀ´£¬ÄãÐèÒªÒÔϲÄÁÏ£º
Layer Player App
Layer Player Ô´´úÂë
¸ÃApp°üº¬Ê®ÖÖ²»Í¬µÄCALayerʾÀý£¬±¾ÎĺóÃæ»áÒÀ´Î½éÉÜ£¬Ê®·Ö·½±ã¡£ÏÈÀ´µõµõ´ó¼ÒµÄθ¿Ú£º

ÏÂÃæÔÚ½²½âÿ¸öʾÀýµÄͬʱ£¬ÎÒ½¨ÒéÔÚCALayerÑÝʾӦÓÃÖÐÇ××Ô¶¯ÊÖÊÔÑ飬»¹¿ÉÒÔ¶Á¶Á´úÂë¡£²»ÓÃд£¬Ö»ÒªÉîºôÎü£¬ÇáËÉÔĶÁ¾Í¿ÉÒÔÁË¡£
:]
ÎÒÏàÐÅÕâЩ¿áìŵÄʾÀý»áÆô·¢ÄúÀûÓò»Í¬µÄCALayerΪ×Ô¼ºµÄApp½õÉÏÌí»¨£¬Ï£Íû´ó¼Òϲ»¶£¡
ʾÀý #1£ºCALayer

Ç°ÃæÎÒÃÇ¿´¹ýʹÓÃCALayerµÄʾÀý£¬Ò²¾ÍÊÇÉèÖø÷ÖÖÊôÐÔ¡£
¹ØÓÚCALayer»¹Óм¸µãûÌ᣺
ͼ²ã¿ÉÒÔ°üº¬×Óͼ²ã¡£¾ÍÏñÊÓͼ¿ÉÒÔ°üº¬×ÓÊÓͼ£¬Í¼²ãÒ²¿ÉÒÔÓÐ×Óͼ²ã£¬ÉÔ¼ÓÀûÓþÍÄÜ´òÔìÆ¯ÁÁµÄЧ¹û£¡
ͼ²ãÊôÐÔ×Ô´ø¶¯»Ð§¹û¡£ÐÞ¸Äͼ²ãÊôÐÔʱ£¬´æÔÚĬÈϵ͝»Ð§¹û£¬ÄãÒ²¿ÉÒÔ×Ô¶¨Ò嶯»ÐÐΪ¡£
ͼ²ãÊÇÇáÁ¿¸ÅÄî¡£Ïà¶ÔÊÓͼ¶øÑÔ£¬Í¼²ã¸ü¼ÓÇáÁ¿£¬Òò´Ëͼ²ã¿ÉÒÔ°ïÖúÌáÉýÐÔÄÜ¡£
ͼ²ãÓдóÁ¿ÊµÓÃÊôÐÔ¡£Ç°ÃæÄãÒѾ¿´¹ý¼¸ÌõÁË£¬ÎÒÃǼÌÐøÌ½Ë÷£¡
¸Õ¸Õ˵CALayerͼ²ãÓкܶàÊôÐÔ£¬ÎÒÃÇÀ´¿´Ò»ÅúʵÓÃÊôÐÔ£ºÓÐЩÊôÐÔÄã¿ÉÄܵÚÒ»´Î¼û£¬µ«ÕæµÄºÜ·½±ã£¡
// 1 let layer = CALayer() layer.frame = someView.bounds // 2 layer.contents = UIImage(named: "star")?.CGImage layer.contentsGravity = kCAGravityCenter // 3 layer.magnificationFilter = kCAFilterLinear layer.geometryFlipped = false // 4 layer.backgroundColor = UIColor(red: 11/255.0, green: 86/255.0, blue: 14/255.0, alpha: 1.0).CGColor layer.opacity = 1.0 layer.hidden = false layer.masksToBounds = false // 5 layer.cornerRadius = 100.0 layer.borderWidth = 12.0 layer.borderColor = UIColor.whiteColor().CGColor // 6 layer.shadowOpacity = 0.75 layer.shadowOffset = CGSize(width: 0, height: 3) layer.shadowRadius = 3.0 someView.layer.addSublayer(layer) |
ÔÚÒÔÉÏ´úÂëÖУº
´´½¨Ò»¸öCALayerʵÀý£¬²¢°Ñ¿ò¼ÜÉèΪsomeView±ß¿ò¡£
½«Í¼²ãÄÚÈÝÉèΪһÕÅͼƬ£¬²¢Ê¹ÆäÔÚͼ²ãÄÚ¾ÓÖУ¬×¢Ò⸳ֵµÄÀàÐÍÊǵײãµÄQuartzͼÏñÊý¾Ý£¨CGImage£©¡£
ʹÓùýÂËÆ÷£¬¹ýÂËÆ÷ÔÚͼÏñÀûÓÃcontentsGravity·Å´óʱ·¢»Ó×÷Ó㬿ÉÓÃÓڸıä´óС£¨Ëõ·Å¡¢±ÈÀýËõ·Å¡¢Ìî³ä±ÈÀýËõ·Å£©ºÍλÖã¨ÖÐÐÄ¡¢ÉÏ¡¢ÓÒÉÏ¡¢Óҵȵȣ©¡£ÒÔÉÏÊôÐԵĸıäûÓж¯»Ð§¹û£¬ÁíÍâÈç¹ûgeometryFlippedδÉèΪtrue£¬¼¸ºÎλÖúÍÒõÓ°»áÉÏϵߵ¹¡£¼ÌÐø£º
°Ñ±³¾°É«ÉèΪRay×î°®µÄÉîÂÌÉ«¡£:] È»ºóÈÃͼ²ã͸Ã÷¡¢¿É¼û¡£Í¬Ê±Áîͼ²ã²»ÒªÕÚÕÖÄÚÈÝ£¬Òâ˼ÊÇÈç¹ûͼ²ã³ß´çСÓÚÄÚÈÝ£¨ÐÇÐÇͼƬ£©£¬Í¼Ïñ²»»á±»²Ã¼õ¡£
ͼ²ã±ß½Ç°ë¾¶ÉèΪͼ²ã¿í¶ÈµÄÒ»°ë£¬Ê¹±ßÔµ±äΪԲÐΣ¬×¢Òâͼ²ãÑÕÉ«¸³ÖµÀàÐÍΪQuartzÑÕÉ«ÒýÓã¨CGColor£©¡£
´´½¨ÒõÓ°£¬ÉèshouldRasterizeΪtrue£¨ºóÎÄ»¹»áÌáµ½£©£¬È»ºó½«Í¼²ã¼ÓÈëÊÓͼ½á¹¹Ê÷¡£
½á¹ûÈçÏ£º

CALayer»¹ÓÐÁ½¸ö¸½¼ÓÊôÐÔÓÐÖúÓÚ¸ÄÉÆÐÔÄÜ£ºshouldRasterizeºÍdrawsAsynchronously¡£
shouldRasterizeĬÈÏΪfalse£¬ÉèΪtrue¿ÉÒÔ¸ÄÉÆÐÔÄÜ£¬ÒòΪͼ²ãÄÚÈÝÖ»ÐèÒªÒ»´ÎäÖȾ¡£Ïà¶Ô»ÃæÖÐÒÆ¶¯µ«×ÔÉíÍâ¹Û²»±äµÄ¶ÔÏóЧ¹û°ÎȺ¡£
drawsAsynchronouslyĬÈÏÖµÒ²ÊÇfalse¡£ÓëshouldRasterizeÏà¶Ô£¬¸ÃÊôÐÔÊÊÓÃÓÚͼ²ãÄÚÈÝÐèÒª·´¸´ÖØ»æµÄÇé¿ö£¬´ËʱÉè³Étrue¿ÉÄÜ»á¸ÄÉÆÐÔÄÜ£¬±ÈÈçÐèÒª·´¸´»æÖÆ´óÁ¿Á£×ÓµÄÁ£×Ó·¢ÉäÆ÷ͼ²ã£¨¿ÉÒԲο¼ºóÃæµÄCAEmitterLayerʾÀý£©¡£
½÷¼Ç£ºÈç¹ûÏ뽫ÒÑÓÐͼ²ãµÄshouldRasterize»òdrawsAsynchronouslyÊôÐÔÉèΪtrue£¬Ò»¶¨ÒªÈý˼¶øºóÐУ¬¿¼ÂÇ¿ÉÄÜÔì³ÉµÄÓ°Ï죬¶Ô±ÈtrueÓëfalseµÄÐÔÄܲîÒ죬±æÃ÷ÊôÐÔÉèÖÃÊÇ·ñÓлý¼«Ð§¹û¡£ÉèÖò»µ±ÉõÖÁ»áµ¼ÖÂÐÔÄÜ´ó·ùϽµ¡£
ÎÞÂÛÈçºÎ»¹ÊÇÏȻص½Í¼²ãÑÝʾӦÓã¬ÆäÖÐÓÐЩ¿Ø¼þ¿ÉÒÔÓÃÀ´µ÷ÕûCALayerµÄÊôÐÔ£º

µ÷½ÚÊÔÊÔ¿´£¬¸ÐÊÜһϣ¬ÀûÓÃCALayer¿ÉÒÔʵÏÖÔõÑùµÄЧ¹û¡£
×¢£ºÍ¼²ã²»ÊôÓÚÏìÓ¦Á´£¨responder chain£©£¬ÎÞ·¨ÏñÊÓͼһÑùÖ±½ÓÏìÓ¦´¥ÃþºÍÊÖÊÆ£¬ÎÒÃÇÔÚCALayerPlaygroundÖмûʶ¹ý¡£²»¹ýͼ²ãÓеã»÷²âÊÔ£¬ºóÃæµÄCATransformLayer»áÌáµ½¡£ÄãÒ²¿ÉÒÔÏòͼ²ãÌí¼Ó×Ô¶¨Ò嶯»£¬CAReplicatorLayerÖлá³öÏÖ¡£
ʾÀý #2£ºCAScrollLayer
CAScrollLayerÏÔʾһ²¿·Ö¿É¹ö¶¯Í¼²ã£¬¸Ãͼ²ãÊ®·Ö»ù´¡£¬ÎÞ·¨Ö±½ÓÏìÓ¦Óû§µÄ´¥Ãþ²Ù×÷£¬Ò²²»ÄÜÖ±½Ó¼ì²é¿É¹ö¶¯Í¼²ãµÄ±ß½ç£¬¹Ê¿É±ÜÃâÔ½½çÎÞÏÞ¹ö¶¯¡£
UIScrollViewÓõIJ»ÊÇCAScrollLayer£¬¶øÊÇÖ±½Ó¸Ä¶¯Í¼²ã±ß½ç¡£
CAScrollLayerµÄ¹ö¶¯Ä£Ê½¿ÉÉèΪˮƽ¡¢´¹Ö±»òÕß¶þά£¬ÄãÒ²¿ÉÒÔÓôúÂëÃüÁîÊÓͼ¹ö¶¯µ½Ö¸¶¨Î»Öãº
// In ScrollingView.swift import UIKit class ScrollingView: UIView { // 1 override class func layerClass() -> AnyClass { return CAScrollLayer.self } } // In CAScrollLayerViewController.swift import UIKit class CAScrollLayerViewController: UIViewController { @IBOutlet weak var scrollingView: ScrollingView! // 2 var scrollingViewLayer: CAScrollLayer { return scrollingView.layer as CAScrollLayer } override func viewDidLoad() { super.viewDidLoad() // 3 scrollingViewLayer.scrollMode = kCAScrollBoth } @IBAction func tapRecognized(sender: UITapGestureRecognizer) { // 4 var newPoint = CGPoint(x: 250, y: 250) UIView.animateWithDuration(0.3, delay: 0, options: .CurveEaseInOut, animations: { [unowned self] in self.scrollingViewLayer.scrollToPoint(newPoint) }, completion: nil) } } |
ÒÔÉÏ´úÂ룺
¶¨ÒåÒ»¸ö¼Ì³ÐUIViewµÄÀà£¬ÖØÐ´layerClass()·µ»ØCAScrollLayer£¬¸Ã·½·¨µÈͬÓÚ´´½¨Ò»¸öÐÂͼ²ã×÷Ϊ×Óͼ²ã£¨CALayerʾÀýÖÐ×ö¹ý£©¡£
Ò»¸öÓÃÒÔ·½±ã¼ò»¯·ÃÎÊ×Ô¶¨ÒåÊÓͼ¹ö¶¯Í¼²ãµÄ¼ÆËãÊôÐÔ¡£
Éè¹ö¶¯Ä£Ê½Îª¶þά¹ö¶¯¡£
ʶ±ð³öÇá´¥ÊÖÊÆÊ±£¬Èùö¶¯Í¼²ãÔÚUIView¶¯»Öйöµ½Ð½¨µÄµã¡££¨×¢£ºscrollToPoint(_:)ºÍscrollToRect(_:)²»»á×Ô¶¯Ê¹Óö¯»Ð§¹û¡££©
°¸ÀýÑо¿£ºÈç¹ûScrollingViewʵÀý°üº¬´óÓÚ¹ö¶¯ÊÓͼ±ß½çµÄͼƬÊÓͼ£¬ÔÚÔËÐÐÉÏÊö´úÂë²¢µã»÷ÊÓͼʱ½á¹ûÈçÏ£º

ͼ²ãÑÝʾӦÓÃÖÐÓпÉÒÔËø¶¨¹ö¶¯·½Ïò£¨Ë®Æ½»ò´¹Ö±£©µÄ¿ª¹Ø¡£
ÒÔϾÑ鹿ÂÉÓÃÓÚ¾ö¶¨ÊÇ·ñʹÓÃCAScrollLayer£º
Èç¹ûÏëʹÓÃÇáÁ¿¼¶µÄ¶ÔÏó£¬Ö»ÐèÓôúÂë²Ù×÷¹ö¶¯£º¿ÉÒÔ¿¼ÂÇCAScrollLayer¡£
Èç¹ûÏëÈÃÓû§²Ù×÷¹ö¶¯£¬UIScrollView´ó¸ÅÊǸüºÃµÄÑ¡Ôñ¡£ÒªÁ˽â¸ü¶à£¬Çë²Î¿¼ÎÒÃǵÄÊÓÆµ½Ì³Ì¡£
Èç¹ûÊǹö¶¯´óÐÍͼƬ£º¿¼ÂÇʹÓÃCATiledLayer£¨¼ûºóÎÄ£©¡£
ʾÀý #3£ºCATextLayer
CATextLayerÄܹ»¶ÔÆÕͨÎı¾»òÊôÐÔ×Ö´®½øÐмòµ¥¿ìËÙµÄäÖȾ¡£ÓëUILabel²»Í¬£¬CATextLayerÎÞ·¨Ö¸¶¨UIFont£¬Ö»ÄÜʹÓÃCTFontRef»òCGFontRef¡£
ÏñÏÂÃæÕâÑùµÄ´úÂëÍêÈ«¿ÉÒÔÕÆ¿ØÎı¾µÄ×ÖÌå¡¢×ÖÌå´óС¡¢ÑÕÉ«¡¢¶ÔÆë¡¢ÕÛÐУ¨wrap£©ºÍ½Ø¶Ï£¨truncation£©¹æÔò£¬Ò²Óж¯»Ð§¹û£º
// 1 let textLayer = CATextLayer() textLayer.frame = someView.bounds // 2 var string = "" for _ in 1...20 { string += "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce auctor arcu quis velit congue dictum. " } textLayer.string = string // 3 let fontName: CFStringRef = "Noteworthy-Light" textLayer.font = CTFontCreateWithName(fontName, fontSize, nil) // 4 textLayer.foregroundColor = UIColor.darkGrayColor().CGColor textLayer.wrapped = true textLayer.alignmentMode = kCAAlignmentLeft textLayer.contentsScale = UIScreen.mainScreen().scale someView.layer.addSublayer(textLayer) |
ÒÔÉÏ´úÂë½âÊÍÈçÏ£º
´´½¨Ò»¸öCATextLayerʵÀý£¬Áî±ß½çÓësomeViewÏàͬ¡£
ÖØ¸´Ò»¶ÎÎı¾£¬´´½¨×Ö·û´®²¢¸³¸øÎı¾Í¼²ã¡£
´´½¨Ò»¸ö×ÖÌ壬¸³¸øÎı¾Í¼²ã¡£
½«Îı¾Í¼²ãÉèΪÕÛÐС¢×ó¶ÔÆë£¬ÄãÒ²¿ÉÒÔÉè×ÔÈ»¶ÔÆë£¨natural£©¡¢ÓÒ¶ÔÆë£¨right£©¡¢¾ÓÖÐ¶ÔÆë£¨center£©»òÁ½¶Ë¶ÔÆë£¨justified£©£¬°´ÆÁÄ»ÉèÖÃcontentsScaleÊôÐÔ£¬È»ºó°Ñͼ²ãÌí¼Óµ½ÊÓͼ½á¹¹Ê÷¡£
²»½öÊÇCATextLayer£¬ËùÓÐͼ²ãÀàµÄäÖȾËõ·ÅϵÊý¶¼Ä¬ÈÏΪ1¡£ÔÚÌí¼Óµ½ÊÓͼʱ£¬Í¼²ã×ÔÉíµÄcontentsScaleËõ·ÅϵÊý»á×Ô¶¯µ÷Õû£¬ÊÊÓ¦µ±Ç°»Ãæ¡£ÄãÐèҪΪÊÖ¶¯´´½¨µÄͼ²ãÃ÷È·Ö¸¶¨contentsScaleÊôÐÔ£¬·ñÔòĬÈϵÄËõ·ÅϵÊý1»áÔÚRetinaÏÔʾÆÁÉϲúÉú²¿·ÖÄ£ºý¡£
Èç¹û´´½¨µÄÎı¾Í¼²ãÌí¼Óµ½ÁË·½ÐεÄsomeView£¬Ð§¹û»áÏñÕâÑù£º

Äã¿ÉÒÔÉèÖýضϣ¨Truncation£©ÊôÐÔ£¬ÉúЧʱ±»½Ø¶ÏµÄ²¿·ÖÎı¾»áÓÉÊ¡ÂԺŴúÌæÏÔʾ¡£Ä¬ÈÏÉ趨ΪÎ޽ضϣ¬Î»ÖÿÉÉèΪ¿ªÍ·¡¢Ä©Î²»òÖÐ¼ä½Ø¶Ï£º

ͼ²ãÑÝʾӦÓÃÖУ¬Äã¿ÉÒÔËæÐÄËùÓûµØÐ޸ĺܶàCATextLayerÊôÐÔ£º

ʾÀý #4£ºAVPlayerLayer
AVPlayerLayerÊǽ¨Á¢ÔÚAVFoundation»ù´¡ÉϵÄʵÓÃͼ²ã£¬³ÖÓÐÒ»¸öAVPlayer£¬ÓÃÀ´²¥·ÅÒôÊÓÆµÃ½ÌåÎļþ£¨AVPlayerItems£©£¬¾ÙÀýÈçÏ£º
override func viewDidLoad() { super.viewDidLoad() // 1 let playerLayer = AVPlayerLayer() playerLayer.frame = someView.bounds // 2 let url = NSBundle.mainBundle().URLForResource("someVideo", withExtension: "m4v") let player = AVPlayer(URL: url) // 3 player.actionAtItemEnd = .None playerLayer.player = player someView.layer.addSublayer(playerLayer) // 4 NSNotificationCenter.defaultCenter().addObserver(self, selector: "playerDidReachEndNotificationHandler:",
name: "AVPlayerItemDidPlayToEndTimeNotification", object: player.currentItem) } deinit { NSNotificationCenter.defaultCenter().removeObserver(self) } // 5 @IBAction func playButtonTapped(sender: UIButton) { if playButton.titleLabel?.text == "Play" { player.play() playButton.setTitle("Pause", forState: .Normal) } else { player.pause() playButton.setTitle("Play", forState: .Normal) } updatePlayButtonTitle() updateRateSegmentedControl() } // 6 func playerDidReachEndNotificationHandler(notification: NSNotification) { let playerItem = notification.object as AVPlayerItem playerItem.seekToTime(kCMTimeZero) } |
ÉÏÊö´úÂë½âÊÍ£º
н¨Ò»¸ö²¥·ÅÆ÷ͼ²ã£¬ÉèÖÿò¼Ü¡£
ʹÓÃAV asset×ÊÔ´´´½¨Ò»¸ö²¥·ÅÆ÷¡£
¸æÖªÃüÁî²¥·ÅÆ÷ÔÚ²¥·ÅÍê³ÉºóÍ£Ö¹¡£ÆäËûÑ¡ÏÓÐÔÝÍ£»ò×Ô¶¯²¥·ÅÏÂÒ»¸öýÌå×ÊÔ´¡£
×¢²áAVPlayer֪ͨ£¬ÔÚÒ»¸öÎļþ²¥·ÅÍê±Ïºó·¢ËÍ֪ͨ£¬²¢ÔÚÎö¹¹º¯ÊýÖÐɾ³ý×÷Ϊ¹Û²ìÕߵĿØÖÆÆ÷¡£
µã»÷²¥·Å°´Å¥Ê±£¬´¥·¢¿Ø¼þ²¥·ÅAV asset²¢ÉèÖð´Å¥ÎÄ×Ö¡£
×¢ÒâÕâÖ»ÊǸöÈëÃÅʾÀý£¬ÔÚʵ¼ÊÏîÄ¿ÖÐÍùÍù²»»á²ÉÓÃÎÄ×Ö°´Å¥¿ØÖƲ¥·Å¡£
AVPlayerLayerºÍÆäÖд´½¨µÄAVPlayer»áÏñÕâÑùÏÔʾΪAVPlayerItemʵÀýµÄµÚÒ»Ö¡£º

AVPlayerLayer»¹ÓÐһЩ¸½¼ÓÊôÐÔ£º
videoGravityÉèÖÃÊÓÆµÏÔʾµÄËõ·ÅÐÐΪ¡£
readyForDisplay¼ì²âÊÇ·ñ×¼±¸ºÃ²¥·ÅÊÓÆµ¡£
ÁíÒ»·½Ã棬AVPlayerÒ²Óв»ÉÙ¸½¼ÓÊôÐԺͷ½·¨£¬ÓÐÒ»¸öÖµµÃ×¢ÒâµÄÊÇrateÊôÐÔ£¬¶ÔÓÚ0µ½1Ö®¼äµÄ²¥·ÅËÙÂÊ£¬0´ú±íÔÝÍ££¬1´ú±í³£ËÙ²¥·Å£¨1x£©¡£
²»¹ýrateÊôÐÔµÄÉèÖÃÊÇÓë²¥·ÅÐÐΪÁª¶¯µÄ£¬Ò²¾ÍÊÇ˵µ÷ÓÃpause()·½·¨ºÍ°ÑrateÉèΪ0Êǵȼ۵쬵÷ÓÃplay()Óë°ÑrateÉèΪ1Ò²Ò»Ñù¡£
ÄÇ¿ì½ø¡¢Âý¶¯×÷ºÍ·´Ïò²¥·ÅÄØ£¿½»¸øAVPlayerLayer°Ñ¡£rate´óÓÚ1ʱ»áÁî²¥·ÅÆ÷ÒÔÏàÓ¦±¶ËÙ½øÐв¥·Å£¬ÀýÈçrateÉèΪ2¾ÍÊǶþ±¶ËÙ¡£
ÈçÄãËùÏ룬rateΪ¸ºÊ±»áÈò¥·ÅÆ÷ÒÔÏàÓ¦±¶ËÙ·´Ïò²¥·Å¡£
È»¶ø£¬ÔÚÒԷdz£¹æËÙÂʲ¥·Å֮ǰ£¬AVPlayerItemÉÏ»áµ÷ÓÃÊʵ±·½·¨£¬ÑéÖ¤ÊÇ·ñÄܹ»ÒÔÏàÓ¦ËÙÂʽøÐв¥·Å£º
canPlayFastForward()¶ÔÓ¦´óÓÚ1
canPlaySlowForward()¶ÔÓ¦0µ½1Ö®¼ä
canPlayReverse()¶ÔÓ¦-1
canPlaySlowReverse()¶ÔÓ¦-1µ½0Ö®¼ä
canPlayFastReverse()¶ÔӦСÓÚ-1
¾ø´ó¶àÊýÊÓÆµ¶¼Ö§³ÖÒÔ²»Í¬ËÙÂÊÕýÏò²¥·Å£¬¿ÉÒÔ·´Ïò²¥·ÅµÄÊÓÆµÏà¶ÔÉÙһЩ¡£ÑÝʾӦÓÃÒ²°üº¬Á˲¥·Å¿Ø¼þ£º

|