WWDCã«ã³ãã¡ã¬ã³ã¹ã®å€ãã®èšäºããããªãUIKitã®ããã©ãŒãã³ã¹ã«æ§ããããŠãããšããäºå®ã«ããããããããã®ãããã¯ã¯å€ãã®iOSéçºè
ã«ãšã£ãŠæªç解ã§ãã ãã®ãããäž»ã«UIã¢ããªã±ãŒã·ã§ã³ã®é床ãšæ»ãããã«äŸåããæãèå³æ·±ã質åãšåé¡ãåéããããšã«ããŸããã
泚æãæãã¹ãæåã®åé¡ã¯ãè²ã®æ··åã§ãã
翻蚳ã®èè
ãã
ãã®èšäºã§ã¯ãç¹ã«å
ã®ç»åãšã³ãŒãã䜿çšããŸããã 誰ããèå³æ·±ããããã¯ãèŠã€ããæ°ãã
Xcodeãš
Instrumentsã§å®éšãè¡ããããã«ããããã§ãã
è²æ··å
ãã¬ã³ãã¯ããã¯ã»ã«ã®æçµçãªè²ã決å®ãããã¬ãŒã ã¬ã³ããªã³ã°æäœã§ãã åUIViewïŒæ£çŽãªãšãããCALayerïŒã¯ãããšãã°ããã¹ãŠã®ãªãŒããŒã¬ã€ãã¥ãŒã®
alpha ã
backgroundColor ã
opaqueãªã©ã®äžé£ã®ããããã£ãçµã¿åãããå Žåãæçµãã¯ã»ã«ã®è²ã«åœ±é¿ããŸãã
UIView.alphaãUIView.opaqueãUIView.backgroundColorãªã©ãæã䜿çšãããŠããUIViewããããã£ããå§ããŸãããã
äžéæ床ãšéæ床
UIView.opaqueã¯ããžã¥ã¢ã©ã€ã¶ãŒã®ãã³ãã§ããããã«ãããã€ã¡ãŒãžãå®å
šã«äžéæãªè¡šé¢ãšããŠè¡šç€ºã§ãããããã¬ã³ããªã³ã°ã®å質ãåäžããŸãã Opaqueã¯ãã
è¡šé¢ã®äžã«äœããã€ã³ã
ããªãã§ãã ãã ã
ãšããæå³ã§ããUIView.opaqueã䜿çšãããšãç»åã®äžäœã¬ã€ã€ãŒã®ã¬ã³ããªã³ã°ãã¹ãããã§ãããããè²ãæ··ããããšã¯ã§ããŸããã
ã¢ã«ãã¡
alphaã1æªæºã®å Žåã
YESã§ãã£ãŠãäžéæã¯ç¡èŠãããŸãã
- (void)viewDidLoad { [super viewDidLoad]; UIView *view = [[UIView alloc] initWithFrame:CGRectMake(35.f, 35.f, 200.f, 200.f)]; view.backgroundColor = [UIColor purpleColor]; view.alpha = 0.5f; [self.view addSubview:view]; }
ããã©ã«ãã®äžéæ床ãYESã§ããã«ãããããããã¢ã«ãã¡ã1æªæºã«èšå®ããŠç»åãéæã«ãããããçµæã¯è²æ··åã«ãªããŸãã
確èªæ¹æ³
æ³šïŒ å®éã®ããã©ãŒãã³ã¹ã«é¢ããæ£ç¢ºãªæ
å ±ãååŸããã«ã¯ãã·ãã¥ã¬ãŒã¿ãŒã§ã¯ãªããå®éã®ããã€ã¹ã§ã¢ããªã±ãŒã·ã§ã³ããã¹ãããå¿
èŠããããŸãã ããã€ã¹ã®CPUã¯Macããã€ã¹ã®ããã»ããµãããé
ããããéåžžã«ç°ãªããŸããiOSã·ãã¥ã¬ãŒã¿ãŒã®ãããã°ã¡ãã¥ãŒã§ããColor Blended Layersãã¢ã€ãã ãèŠã€ããããšãã§ããŸãã ãããã¬ãŒã¯ãããã€ãã®åéæã®ã¬ã€ã€ãŒãäºãã«éãªãåã£ãŠããç»åã®æ··åã¬ã€ã€ãŒã衚瀺ã§ããŸãã ããã·ã³ã°ãµããŒããæå¹ãªç¶æ
ã§éããŠè¡šç€ºãããç»åã®è€æ°ã®ã¬ã€ã€ãŒã¯èµ€ã§åŒ·èª¿è¡šç€ºãããæ··åããã«è¡šç€ºãããç»åã®è€æ°ã®ã¬ã€ã€ãŒã¯ç·ã§åŒ·èª¿è¡šç€ºãããŸãã
Core AnimationããŒã«ã䜿çšããã«ã¯ãå®éã®ããã€ã¹ãæ¥ç¶ããå¿
èŠããããŸãã
ãã«ã©ãŒãã¬ã³ãã¬ã€ã€ãŒãã«ã€ããŠã¯ããã¡ããã芧ãã ããã

ã¢ã«ãã¡ãã£ã³ãã«ç»å
ã¢ã«ãã¡ãã£ãã«ã®å€æŽãUIImageViewã®éæ床ã«ã©ã®ããã«åœ±é¿ããããç解ããããšãããšãåãåé¡ãçºçããŸãïŒã¢ã«ãã¡ããããã£ã®å¹æãèæ
®ããŠãã ããïŒã UIImageã®ã«ããŽãªã䜿çšããŠãã«ã¹ã¿ã ã¢ã«ãã¡ãã£ãã«ãæã€å¥ã®ç»åãååŸããŸãããã
- (UIImage *)imageByApplyingAlpha:(CGFloat) alpha { UIGraphicsBeginImageContextWithOptions(self.size, NO, 0.0f); CGContextRef ctx = UIGraphicsGetCurrentContext(); CGRect area = CGRectMake(0, 0, self.size.width, self.size.height); CGContextScaleCTM(ctx, 1, -1); CGContextTranslateCTM(ctx, 0, -area.size.height); CGContextSetBlendMode(ctx, kCGBlendModeMultiply); CGContextSetAlpha(ctx, alpha); CGContextDrawImage(ctx, area, self.CGImage); UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return newImage; }
4ã€ã®ã±ãŒã¹ãæ€èšããŠãã ããã
- UIImageViewã«ã¯æšæºã®ã¢ã«ãã¡ããããã£å€ïŒ1.0ïŒããããç»åã«ã¯ã¢ã«ãã¡ãã£ãã«ããããŸããã
- UIImageViewã«ã¯æšæºã®ã¢ã«ãã¡ããããã£å€ïŒ1.0ïŒããããç»åã«ã¯0.5ã®ã¢ã«ãã¡ãã£ãã«ããããŸãã
- UIImageViewã«ã¯å€æŽå¯èœãªã¢ã«ãã¡ããããã£å€ããããŸãããç»åã«ã¯ã¢ã«ãã¡ãã£ãã«ããããŸããã
- UIImageViewã«ã¯å€æŽå¯èœãªã¢ã«ãã¡ããããã£å€ããããã€ã¡ãŒãžã®ã¢ã«ãã¡ãã£ãã«ã¯0.5ã§ãã
- (void)viewDidLoad { [super viewDidLoad]; UIImage *image = [UIImage imageNamed:@"flower.jpg"]; UIImage *imageWithAlpha = [image imageByApplyingAlpha:0.5f];
æ··åç»åã¬ã€ã€ãŒã¯ã·ãã¥ã¬ãŒã¿ãŒã«ãã£ãŠè¡šç€ºãããŸãã ãããã£ãŠãUIImageViewã®alphaããããã£ã®ããã©ã«ãå€ã1.0ã§ãç»åã®ã¢ã«ãã¡ãã£ãã«ãå€æãããŠããå Žåã§ããæ··åã¬ã€ã€ãŒãäœæãããŸãã
Appleã®å
¬åŒããã¥ã¡ã³ãã¯ãéçºè
ãè²ã®æ··åã«ãã£ãšæ³šæãæãããšã奚å±ããŠããŸãã
ãã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ã倧å¹
ã«æ¹åããã«ã¯ãè²ãæ··ãããšãã«èµ€ã®éãæžãããŸãã ã«ã©ãŒãã¬ã³ãã䜿çšãããšãã¹ã¯ããŒã«ãé
ããªãããšããããããŸãã
éæãªã¬ã€ã€ãŒãäœæããã«ã¯ãè¿œå ã®èšç®ãå®è¡ããå¿
èŠããããŸãã ã·ã¹ãã ã¯ãè²ã決å®ããŠæç»ããããã«ãæäžå±€ãšæäžå±€ãæ··åããå¿
èŠããããŸãã
ãªãã¹ã¯ãªãŒã³èŠèŠå
ãã¬ãŒã ããšã®ã¬ã³ããªã³ã°ã¯ãGPUã®ããŒããŠã§ã¢ã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ã䜿çšããŠå®è¡ã§ããªãç»åã®ã¬ã³ããªã³ã°ã§ããã代ããã«CPUããã»ããµã䜿çšããå¿
èŠããããŸãã
äœã¬ãã«ã§ã¯ã次ã®ããã«ãªããŸãããªãã¹ã¯ãªãŒã³ã¬ã³ããªã³ã°ãå¿
èŠãªã¬ã€ã€ãŒã®ã¬ã³ããªã³ã°äžãGPUã¯ã¬ã³ããªã³ã°ããã»ã¹ãåæ¢ããCPUã«å¶åŸ¡ãæž¡ããŸãã 次ã«ãCPUã¯å¿
èŠãªãã¹ãŠã®æäœãå®è¡ãïŒããšãã°ããã¡ã³ã¿ãžãŒãDrawRectã«è©°ã蟌ã¿ãŸãïŒããã§ã«æç»ãããã¬ã€ã€ãŒã䜿çšããŠGPUã«å¶åŸ¡ãè¿ããŸãã GPUãã¬ã³ããªã³ã°ããæç»ããã»ã¹ãç¶è¡ãããŸãã
ããã«ãç»é¢å€ã®èŠèŠåã§ã¯ãããããããã¯ã¢ããã¹ãã¬ãŒãžçšã«è¿œå ã®ã¡ã¢ãªãå²ãåœãŠãå¿
èŠããããŸãã åæã«ãããŒããŠã§ã¢ã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ã䜿çšãããã¬ã€ã€ãŒã®æç»ã«ã¯å¿
èŠãããŸããã
ç»é¢ã®èŠèŠå
ãªãã¹ã¯ãªãŒã³èŠèŠå
ãªãã¹ã¯ãªãŒã³ã®èŠèŠåã«ã€ãªããå¹æ/èšå®ã¯äœã§ããïŒ ããããèŠãŠã¿ãŸãããïŒ
ã«ã¹ã¿ã DrawRectïŒïŒä»»æãèæ¯ãè²ã§å¡ãã€ã¶ããŠãïŒ
- CALayerã®äžžãååŸ
- ã«ãªã€ãŒã®åœ±
- CALayerã®ãã¹ã¯
- CGContextã䜿çšããã«ã¹ã¿ã æç»
Color Offscreen-Rendered Yellowãªãã·ã§ã³ãæå¹ã«ãããšãInstrumentsã®Core AnimationããŒã«ã䜿çšããŠãªãã¹ã¯ãªãŒã³ããžã¥ã¢ã©ã€ãŒãŒã·ã§ã³ãç°¡åã«æ€åºã§ããŸãã ãªãã¹ã¯ãªãŒã³ã¬ã³ããªã³ã°ãçºçããå Žæã¯ãé»è²ã®ã¬ã€ã€ãŒã§ç€ºãããŸãã

ããã€ãã®ã±ãŒã¹ãæ€èšããäœæ¥ã®å質ããã¹ãããŸãã ä»äºã®è³ªãåäžããããšåæã«ãåªãããã¶ã€ã³ã®ããžã§ã³ãå®çŸããæé©ãªãœãªã¥ãŒã·ã§ã³ãèŠã€ããããšããŸãã
ãã¹ãç°å¢ïŒ
- ããã€ã¹ïŒiOS 7.1.1ãæèŒããiPhone 4ïŒ11D201ïŒ
- XcodeïŒ5.1.1ïŒ5B1008ïŒ
- MacBook Pro 15 RetinaïŒME294ïŒãšOS X 10.9.3ïŒ13D65ïŒ
è§ãäžžããã
ã«ã¹ã¿ã ã»ã«ã䜿çšããŠç°¡åãªTableviewãäœæããUIImageViewãšUILabelãã»ã«ã«è¿œå ããŸãã ãã¿ã³ãäžžãå€ãè¯ãæ代ãèŠããŠããŸããïŒ Tableviewã§ãã®çŽ æŽãããå¹æãå®çŸããã«ã¯ãCALayer.cornerRadiusããã³CALayer.masksToBoundsã«YESå€ãèšå®ããå¿
èŠããããŸãã
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { NSString *identifier = NSStringFromClass(CRTTableViewCell.class); CRTTableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:identifier]; cell.imageView.layer.cornerRadius = 30; cell.imageView.layer.masksToBounds = YES; cell.imageView.image = [UIImage imageNamed:@"flower.jpg"]; cell.textLabel.text = [NSString stringWithFormat:@"Cell:%ld",(long)indexPath.row]; return cell; }
ç®çã®å¹æãéæãããšããäºå®ã«ãããããããã€ã³ã¹ãã«ã¡ã³ãããªããŠããããã©ãŒãã³ã¹ãæšå¥šããã
60 FPSããéåžžã«é¢ããŠããããšã¯æããã§ãã ããããæªæ€èšŒã®æ°å€çãªçããèŠã€ããããã«æ°Žæ¶çã調ã¹ãŸããã 代ããã«ã
Instrumentsã§ããã©ãŒãã³ã¹ããã¹ãããã ãã§ãã
ãŸãããªãã¹ã¯ãªãŒã³ã¬ã³ããªã³ã°ãããé»è²ã®ã«ã©ãŒãªãã·ã§ã³ãæå¹ã«ããŸãã åUIImageViewã»ã«ã¯é»è²ã®ã¬ã€ã€ãŒã§èŠãããŠããŸãã
ãŸããInstrumentsã§ã¢ãã¡ãŒã·ã§ã³ãšOpenGL ESãã©ã€ããŒã䜿çšããæ¹æ³ã確èªãã䟡å€ããããŸãã
OpenGL ES DriverããŒã«ãšããã°ãããã¯äœããããããŸããïŒ ä»çµã¿ãç解ããããã«ãGPUãå
åŽããèŠãŠã¿ãŸãããã GPUã¯ãã¬ã³ãã©ãŒãšã¿ã€ã©ãŒã®2ã€ã®ã³ã³ããŒãã³ãã§æ§æãããŠããŸãã ã¬ã³ãã©ãŒã®åœ¹å²ã¯ããŒã¿ãæç»ããããšã§ãããé åºãšæ§æã¯Tilerã³ã³ããŒãã³ãã«ãã£ãŠæ±ºå®ãããŸãã ãããã£ãŠãTilerã®ä»äºã¯ããã¬ãŒã ããã¯ã»ã«ã«åå²ãããããã®å¯èŠæ§ã決å®ããããšã§ãã ãã®å Žåã«ã®ã¿ãå¯èŠãã¯ã»ã«ãã¬ã³ãã©ãŒã«æž¡ãããŸãïŒã€ãŸã
ãã¬ã³ããªã³ã°ããã»ã¹ã®é床ãäœäžããŸã ïŒã
ã¬ã³ãã©ãŒäœ¿çšçã®å€ãã50ïŒ
ãè¶
ããå Žåãããã¯ã¢ãã¡ãŒã·ã§ã³åŠçãå
å¡«é床ã«ãã£ãŠå¶éãããå¯èœæ§ãããããšãæå³ããŸãã Tiler Utilizationã50ïŒ
ãè¶
ããå Žåãããã¯ã¢ãã¡ãŒã·ã§ã³ã幟äœåŠçã«å¶éãããå¯èœæ§ãããããšã瀺ããŠããŸããã€ãŸããç»é¢äžã§ã¯ãã¬ã€ã€ãŒãå€ãããŸãã
ç®çã®å¹æãéæãããšåæã«ãçç£æ§ãåäžãããããã«ãå¥ã®ã¢ãããŒããæ¢ãå¿
èŠãããããšã¯æããã§ãã UIImageã®ã«ããŽãªã䜿çšããŠãcornerRadiusããããã£ã䜿çšããã«è§ãäžžãããŸãã
@implementation UIImage (YALExtension) - (UIImage *)yal_imageWithRoundedCornersAndSize:(CGSize)sizeToFit { CGRect rect = (CGRect){0.f, 0.f, sizeToFit}; UIGraphicsBeginImageContextWithOptions(sizeToFit, NO, UIScreen.mainScreen.scale); CGContextAddPath(UIGraphicsGetCurrentContext(), [UIBezierPath bezierPathWithRoundedRect:rect cornerRadius:sizeToFit.width].CGPath); CGContextClip(UIGraphicsGetCurrentContext()); [self drawInRect:rect]; UIImage *output = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return output; } @end
ãããŠãcellForRowAtIndexPathã¡ãœããã®dataSourceã®å®è£
ãå€æŽããŸãã
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { NSString *identifier = NSStringFromClass(CRTTableViewCell.class); CRTTableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:identifier]; cell.myTextLabel.text = [NSString stringWithFormat:@"Cell:%ld",(long)indexPath.row]; UIImage *image = [UIImage imageNamed:@"flower.jpg"]; cell.imageViewForPhoto.image = [image yal_imageWithRoundedCornersAndSize:cell.imageViewForPhoto.bounds.size]; return cell; }
ã¬ã³ããªã³ã°ã³ãŒãã¯ããªããžã§ã¯ããæåã«ç»é¢ã«è¡šç€ºããããšãã«1åã ãåŒã³åºãããŸãã ãªããžã§ã¯ãã¯CALayerã«ãã£ãŠãã£ãã·ã¥ããããã®åŸãè¿œå ã®ã¬ã³ããªã³ã°ãªãã§è¡šç€ºãããŸãã Core Animationã®ã¡ãœãããããåäœãé
ããšããäºå®ã«é¢ä¿ãªãããã®ã¢ãããŒãã«ããããã¬ãŒã ããšã®ã¬ã³ããªã³ã°ãäžåºŠã«å€æã§ããŸãã
ããã©ãŒãã³ã¹ã®æž¬å®ã«æ»ãåã«ããªãã¹ã¯ãªãŒã³ã¬ã³ããªã³ã°ãããäžåºŠç¢ºèªããŸãããã
57-60 FPSïŒ çç£æ§ã2åã«ããTiler UtilizationãšRenderer Utilizationãåæžããæé©ãªæ¹æ³ã§æåããŸããã
drawRectã¡ãœããã®ãªãŒããŒã©ã€ãã®ä¹±çšãé¿ãã
-drawRectã¡ãœããã¯ãèæ¯ãè²ã§å¡ãã€ã¶ãã ãã§ããå Žåã§ãããªãã¹ã¯ãªãŒã³ã¬ã³ããªã³ã°ã«ã€ãªããããšã«æ³šæããŠãã ããã
ç¹ã«ãUIView BackgroundColorããããã£ã䜿çšãã代ããã«ãèæ¯è²ã®èšå®ãªã©ã®åçŽãªæäœã®ããã«DrawRectã¡ãœããã®ç¬èªã®å®è£
ãäœæããå Žåã
ãã®ã¢ãããŒãã¯2ã€ã®çç±ã§éåççã§ãã
ãŸããã·ã¹ãã å
šäœã®UIViewã¯ç¬èªã®ã¬ã³ããªã³ã°ã¡ãœãããå®è£
ããŠã³ã³ãã³ãã衚瀺ã§ããŸããAppleããããã®ããã»ã¹ãæé©åããããšããŠããããšã¯æããã§ãã ããã«ãããã¯ã¢ããã¹ãã¬ãŒãžãèŠããŠããå¿
èŠããããŸããæ°ããããã¯ã¢ããã€ã¡ãŒãžã¯ããã¯ã»ã«ãµã€ãºãã€ã¡ãŒãžã®ãµã€ãºã«contentScaleãæãããã®ã«çããã次ã®ã€ã¡ãŒãžæŽæ°ãŸã§ãã£ãã·ã¥ãããŸãã
第äºã«ãDrawRectã¡ãœããã®æªçšãåé¿ããå Žåãæ°ããã¬ã³ããªã³ã°ãµã€ã¯ã«ãå®è¡ãããã³ã«ããã¯ã¢ããã¹ãã¬ãŒãžã«è¿œå ã®ã¡ã¢ãªãå²ãåœãŠãŠãªã»ããããå¿
èŠã¯ãããŸããã
CALayer.shouldRasterize
ãªãã¹ã¯ãªãŒã³ã¬ã³ããªã³ã°ã®ããã©ãŒãã³ã¹ãåäžãããå¥ã®æ¹æ³ã¯ãCALayer.shouldRasterizeããããã£ã䜿çšããããšã§ãã ã¬ã€ã€ãŒã¯ããã®ã¬ã€ã€ãŒãå床æç»ããå¿
èŠãããç¬éãŸã§ãäžåºŠã¬ã³ããªã³ã°ãããŠãã£ãã·ã¥ãããŸãã
ãã ããããã©ãŒãã³ã¹ãåäžããå¯èœæ§ããããŸãããã¬ã€ã€ãŒãé »ç¹ã«åæç»ããå¿
èŠãããå Žåã¯ãã·ã¹ãã ãæç»ã®ãã³ã«ã¬ã€ã€ãŒãã©ã¹ã¿ã©ã€ãºãããããè¿œå ã®ãã£ãã·ã¥ã³ã¹ããç¡é§ã«ãªããŸãã
æçµçã«ãCALayer.shouldRasterizeã®äœ¿çšã¯ãç¹å®ã®ãŠãŒã¹ã±ãŒã¹ãšã€ã³ã¹ãã¥ã«ã¡ã³ãã«äŸåããŸãã
圱ãšshadowPath
圱ã®å©ããåããŠããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ãããçŸããããããšãã§ããŸãã iOSã§ã¯ãã·ã£ããŠå¹æãç°¡åã«è¿œå ã§ããŸãã
cell.imageView.layer.shadowRadius = 30; cell.imageView.layer.shadowOpacity = 0.5f;
ããªãã¹ã¯ãªãŒã³ã¬ã³ããªã³ã°ãããªã³ã«ãããšãã·ã£ããŠããªãã¹ã¯ãªãŒã³ã¬ã³ããªã³ã°ãè¿œå ããããšãããããŸãããããCoreAnimationããªã¢ã«ã¿ã€ã ã§ã·ã£ããŠã¬ã³ããªã³ã°ãèšç®ãã
FPSãåæžããçç±ã§ãã
Appleã¯äœãšèšã£ãŠããŸããïŒ
»Core Animationã圱ã®åœ¢ç¶ã決å®ã§ããããã«ãããšãã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ã«åœ±é¿ããå¯èœæ§ããããŸãã 代ããã«ãCALayerã®shadowPathããããã£ã䜿çšããŠåœ±ã®åœ¢ç¶ãå®çŸ©ããŸãã shadowPathã䜿çšããå ŽåãCore Animationã¯æå®ããããã©ãŒã ã䜿çšããŠã·ã£ããŠå¹æãã¬ã³ããªã³ã°ããã³ãã£ãã·ã¥ããŸãã ç¶æ
ãå€ãããªããããã£ãã«å€ãããªãã¬ã€ã€ãŒã®å Žåãããã«ãããCore Animationã«ãã£ãŠå®è¡ãããèŠèŠåã®æ°ãæžããããã©ãŒãã³ã¹ã倧å¹
ã«åäžããŸãã
ãããã£ãŠãCoreAnimationã«ã·ã£ããŠãã£ãã·ã³ã°ïŒCGPathïŒãæäŸããå¿
èŠããããŸããããã¯éåžžã«ç°¡åã§ãã
UIBezierPath *shadowPath = [UIBezierPath bezierPathWithRect:cell.imageView.bounds]; [cell.imageView.layer setShadowPath:shadowPath.CGPath];
1è¡ã®ã³ãŒãã§ããªãã¹ã¯ãªãŒã³ã¬ã³ããªã³ã°ãåé¿ããããã©ãŒãã³ã¹ã倧å¹
ã«æ¹åããŸããã
ã芧ã®ãšãããå€ãã®UIããã©ãŒãã³ã¹ã®åé¡ã¯éåžžã«ç°¡åã«è§£æ±ºã§ããŸãã 1ã€ã®å°ããªã³ã¡ã³ã-æé©åã®ååŸã«ããã©ãŒãã³ã¹ã枬å®ããããšãå¿ããªãã§ãã ãã:)
䟿å©ãªãªã³ã¯ãšãªãœãŒã¹
WWDC 2011ãããªïŒUIKitã¬ã³ããªã³ã°ã«ã€ããŠWWDC 2012ãããªïŒiOSã¢ããªã®ããã©ãŒãã³ã¹ïŒã°ã©ãã£ãã¯ã¹ãšã¢ãã¡ãŒã·ã§ã³æ¬ïŒ
iOS Coreã¢ãã¡ãŒã·ã§ã³ã ããã¯ã»ããã¯ãŠããã«ãã
é«åºŠãªãã¯ããã¯iOSç»åãã£ãã·ã¥ã
å³æžé€šã®ãã³ãããŒã¯WWDC 2014ãããªïŒiOSã¢ããªåãã®é«åºŠãªã°ã©ãã£ãã¯ã¹ãšã¢ãã¡ãŒã·ã§ã³