2012-06-02 4 views
0

나는 아이폰/아이 패드를위한 범용 응용 프로그램을 만드는 중이라서 그리고 다음 코드를 사용하여 지연이 많이있을 것 같다 :iPad의 UITableView에서 CALayer setCornerRadius가 지연됩니까?

CALayer *imageLayer = [cell.myImageView layer]; 
[imageLayer setMasksToBounds:YES]; 
[imageLayer setCornerRadius:6.0]; 

어떤 이상한 것은 아이폰 버전은 더 지연 아이 패드 버전은 동안이없는 것입니다은 약간의 지체가있다. 나는 두 장치 사이의 코드에서 차별화를하지 않지만 모든 코드가 두 장치에서 모두 잘된 것 같습니다. 그러나, 나는 여전히 내 UIImageView, "myImageView"에 둥근 모서리를 원한다.

모든 셀이 동일하므로 첫 번째 셀 초기화 중에 만 cellForRowAtIndexPath에 해당 코드 비트를 사용합니다.

왜 이런 일이 일어나는 지 알고 계십니까?

감사합니다.

+0

나는 전체 cellforrowatindexpath 데이터 소스 메소드 소스 코드를 보여줄 것을 제안하겠다 – Lefteris

답변

1

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]; 
+0

흠, 그만큼 도움이되지 않았다. 아직도 많은 지체가 있습니다. Game Center 모달보기를이보기에 표시하더라도 해당 성취보기를 제공하는 애니메이션이 지연됩니다. 내 애플 리케이션에서 다른보기는이 문제가 있으며 정말 이상합니다. 그 밖의 무엇을 최적화 할 수 있습니까? –

+0

셀 이미지를 설정하지 않은 경우 측정하는 FPS의 양은 얼마입니까? 그냥 문제가 어디 있는지보고 싶다 ... 나는 전체 프로필 그림 섹션을 제거하고 측정한다 – Lefteris

+0

내 모든 질문과 원래의 포스트를 다시 보아라, 나는 모든 것을 바꿨다 : P 또한 당신이 친절하고 충분히 제거 할 수 있다면 당신의 대답에있는 코드는 멋지게 될 것입니다. 왜냐하면 결국 앱에 코드가 표시되기 때문에 코드를 쉽게 볼 수 없기 때문입니다! :) –