CALayer 연산은 많은 CPU 전력을 사용하여 그립니다.
따라서 가장 좋은 해결책은 핵심 그래픽을 사용하여 이미지를 그리는 것입니다.
이 그의 ABTableViewCell 헤더 (.H) 여기
// Copyright (c) 2008 Loren Brichter
//
// Permission is hereby granted, free of charge, to any person
// obtaining a copy of this software and associated documentation
// files (the "Software"), to deal in the Software without
// restriction, including without limitation the rights to use,
// copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following
// conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
// OTHER DEALINGS IN THE SOFTWARE.
//
// ABTableViewCell.h
//
// Created by Loren Brichter
// Copyright 2008 Loren Brichter. All rights reserved.
//
#import <UIKit/UIKit.h>
// to use: subclass ABTableViewCell and implement -drawContentView:
@interface ABTableViewCell : UITableViewCell
{
UIView *contentView;
}
- (void)drawContentView:(CGRect)r; // subclasses should implement
@end
을 파일에 대한 코드가 구현에서는 정상적 (하는 .m) 파일에 대한 코드입니다 : 로렌 Brichter를 어떻게 우리에게 보여하는 첫번째이었다
// Copyright (c) 2008 Loren Brichter
//
// Permission is hereby granted, free of charge, to any person
// obtaining a copy of this software and associated documentation
// files (the "Software"), to deal in the Software without
// restriction, including without limitation the rights to use,
// copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following
// conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
// OTHER DEALINGS IN THE SOFTWARE.
//
// ABTableViewCell.m
//
// Created by Loren Brichter
// Copyright 2008 Loren Brichter. All rights reserved.
//
#import "ABTableViewCell.h"
@interface ABTableViewCellView : UIView
@end
@implementation ABTableViewCellView
- (void)drawRect:(CGRect)r
{
[(ABTableViewCell *)[self superview] drawContentView:r];
}
@end
@implementation ABTableViewCell
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
if ((self = [super initWithStyle:style reuseIdentifier:reuseIdentifier])) {
contentView = [[ABTableViewCellView alloc]initWithFrame:CGRectZero];
contentView.opaque = YES;
[self addSubview:contentView];
}
return self;
}
- (void)setFrame:(CGRect)f
{
[super setFrame:f];
CGRect b = [self bounds];
b.size.height -= 1; // leave room for the seperator line
[contentView setFrame:b];
}
- (void)setNeedsDisplay
{
[super setNeedsDisplay];
[contentView setNeedsDisplay];
}
- (void)drawContentView:(CGRect)r
{
// subclasses should implement this
}
@end
이제 Core Graphics를 사용하여 drawContentView 메소드에서 셀을 그립니다. 여기
내가 앱 I에서 사용하는 코드의 일부입니다 일하고 있어요 :
:
CALayer *cellLayer = [[CALayer alloc] init];
CGRect cellFrame = self.bounds;
CGRect layerFrame = CGRectInset(cellFrame, 3, 3);
cellLayer.frame = cellFrame;
cellLayer.contentsScale = [[UIScreen mainScreen] scale];
//round corners in Core Graphics (much faster than using the CALayer cornerRadius)
UIGraphicsBeginImageContextWithOptions(self.bounds.size, NO, [[UIScreen mainScreen] scale]);
CGContextRef imgContext = UIGraphicsGetCurrentContext();
CGContextSaveGState(imgContext);
//create the rounded rectangle to draw the image in
CGPathRef clippingPath = [UIBezierPath bezierPathWithRoundedRect:layerFrame cornerRadius:6.0f].CGPath;
CGContextAddPath(imgContext, clippingPath);
CGContextClip(imgContext);
CGDataProviderRef imgDataProvider = CGDataProviderCreateWithCFData((__bridge CFDataRef)[NSData dataWithContentsOfFile:ImageName]);
CGImageRef imageRef = CGImageCreateWithJPEGDataProvider(imgDataProvider, NULL, true, kCGRenderingIntentDefault);
CGDataProviderRelease(imgDataProvider);
CGContextDrawImage (imgContext, layerFrame, imageRef);
CGImageRelease(imageRef);
CGContextRestoreGState(imgContext);
//draw white outline
CGPathRef path = [UIBezierPath bezierPathWithRoundedRect:CGRectInset(cellFrame, 3, 3) cornerRadius:6.0f].CGPath;
CGContextAddPath(imgContext, path);
CGContextSetLineWidth(imgContext, 2.0);
CGContextSetRGBStrokeColor(imgContext,1,1,1,1);
CGContextStrokePath(imgContext);
// Get the image from the context
UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
cellLayer.contents = (__bridge id)img.CGImage;
당신이 당신의있는 tableView CellForRowAtIndexPath 데이터 소스 방법이 방법을 초기화하는 데 필요한 사용자 정의 셀을 사용하려면
static NSString *CellIdentifier = @"TableCell";
ABTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[ABTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
}
또한 사용에 의해 뭔가 자기를 수정할 때 그리기 사용자 정의하고 있기 때문에 당신은 항상 셀보기를 reresfh해야한다는 것을 기억
[cell setNeedsDisplay];
나는 전체 cellforrowatindexpath 데이터 소스 메소드 소스 코드를 보여줄 것을 제안하겠다 – Lefteris