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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
SwiftÓïÑÔiOS¿ª·¢£ºCALayerÊ®ÔòʾÀý(ÉÏ)
 
×÷ÕߣºRaywenderlich À´Ô´£º51CTO ·¢²¼ÓÚ 2015-04-07
  2652  次浏览      27
 

ÈçÄãËùÖª£¬ÎÒÃÇÔÚ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

¾ø´ó¶àÊýÊÓÆµ¶¼Ö§³ÖÒÔ²»Í¬ËÙÂÊÕýÏò²¥·Å£¬¿ÉÒÔ·´Ïò²¥·ÅµÄÊÓÆµÏà¶ÔÉÙһЩ¡£ÑÝʾӦÓÃÒ²°üº¬Á˲¥·Å¿Ø¼þ£º

   
2652 ´Îä¯ÀÀ       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ÄÚºËÇý¶¯
°¬Ä¬Éú ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ
Î÷ÃÅ×Ó Ç¶Èëʽ¼Ü¹¹Éè¼Æ