2010-08-17 6 views
1

좋아요. 다음과 같은 매우 간단한 애니메이션이 25 개 프레임으로 구성된 PNG 형식입니다. 각 프레임은 320x360 및 약 170Kb 크기입니다. 나는 참조 콘센트가이 가리키는있는 UIImageView에이 인터페이스 빌더에서startAnimating이 실행 된 후 UIImageView 애니메이션이 시작됩니다.

IBOutlet UIImageView *Animation_Normal_View; 

: 여기

.H를 사용하는 코드입니다. 내 모든 이미지는 ... normal_000_crop.png, normal_001_crop.png, normal_002_crop.png, 이름이 지정됩니다

하는 .m : 시뮬레이터 모두에

Animation_Normal = [[NSMutableArray alloc] initWithCapacity:25]; 
for (int i = 0; i < 25; i++) 
{ 
    [Animation_Normal addObject:[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"normal_%03d_crop.png", i] ofType:nil]]]; 
} 

Animation_Normal_View.animationImages = Animation_Normal; 
Animation_Normal_View.animationDuration = 1; // seconds 
Animation_Normal_View.animationRepeatCount = 0; // 0 = loops forever 
[Animation_Normal release]; 


[self.view addSubview:Animation_Normal_View]; 
[Animation_Normal_View startAnimating]; 

좋은 영상 애니메이션을 loogs

로 soos startAnimating 발행으로 시작 .

그러나 iOS 4.0.2를 실행하는 iPhone 3G에서 visual animation은 startAnimating이 실행 된 후 2 ~ 3 초 후에 시작됩니다.

블로그 나 포럼에서 찾을 수있는 모든 기술을 시도해 보았습니다.

PNG 기반 애니메이션에 완전히 다른 방법이라면 힌트를 얻으실 수 있습니다.

감사합니다.

답변

2

imageWithContentsOfFile : 처리 시간이 오래 걸리는 경향이 있습니다. 특히 많은 파일 (25 개)이 많거나 크기가 큰 경우가 많습니다. 일반적으로 훨씬 빠르지 만 다소 무기한 이미지를 캐시하는 경향이있다 : 당신이 시도 할 수

한 가지 :, imageNamed에 대한 즉

[UIImage imageNamed:[NSString stringWithFormat:@"normal_%03d_crop.png", i]] 

imageNamed을 그것을 전환하는 것입니다.

이미지를 메모리에로드하고 앱 전체에 걸쳐 유지하는 것이 용납되지 않는 경우 적절한 시간에로드하고 사용 후 언로드하는 데 약간의 조정 작업이 필요할 수 있습니다. 이러한 작업은 항상 까다로운 작업이며로드하는 동안 기본 UI를 차단하지 못하도록 멀티 스레딩이 필요합니다. 그러나 할 수있다. 그리고 몇 가지 예가 있습니다.

5

이것은 좋은 질문이며 몇 가지 생각으로 여기에서 다룰 것입니다.

먼저 총 크기가 약 4MB 인 일련의 그래픽을로드하고 있습니다. 특히 느린 (구형) 장치의 경우에는 시간이 걸릴 수 있습니다. 당신의 .H 파일의 @interface 블록에서

사용하면 다음과 같은 두 가지 속성을 선언 할 수 있습니다 :

IBOutlet UIImageView *animationViewNormal; 
NSMutableArray *animationViewNormalImages; 

첫 번째 단지 모범 사례에 대한 이름이 이미 가지고있는 UIImageView (이다)이고 두 번째는 이미지 뷰의 이미지 스택을 유지할 수있는 가변 배열입니다. "정상적인"상태를 의미하는 경우 상태를 나타냅니다. 설명을 위해 다른 주에 대한 추가 이미지 세트를로드하고 있습니까?

.이 헤더에 정의 된 가변 배열 화상 스택을 야기 할 수있는 기능을 제공한다

- (void)loadAnimationImages; 

다음 @interface에서 m 파일은 다음과 같은 방법으로 생성한다. 당신은 내가 normal_ % 03u_crop에 normalCrop % 03u에서로 PNG 파일을 이름에서 볼 수 있듯이

- (void)loadAnimationImages { 
    for (NSUInteger i = 0; i < 23; i++) { 
    NSString *imageName = [NSString stringWithFormat:@"normalCrop%03u", i]; 
    UIImage *image = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:imageName ofType:@"png"]]; 
    if (image) { 
     [animationViewNormalImages addObject:image]; 
    } 
    } 
} 

: 다음 원하는거야 @implementation에서 같은 하는 .m 파일에서

파일 이름의 끝 부분에 색인 레이블을 두는 것이 가장 좋습니다 (대부분의 응용 프로그램은이 방법으로 내용을 출력합니다). 루프는 이미지를로드하고 이미지인지 확인한 다음 변경 가능한 배열의 "이미지 스택"에 이미지를 추가합니다. 초기화에서

는() 다음이 필요합니다

- (id)init { 
    ... 
    animationViewNormalImages = [[NSMutableArray alloc] init]; 
    ... 
} 

이 이미지보기를 된 이미지의 스택을 유지하기 위해 (animationViewNormalImages) 변경 가능한 배열을 할당합니다.

우리는 지금 viewDidLoad에 대한 코드로 이동합니다() :

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    ... 
    [self loadAnimationImages]; 
    [animationViewNormal setAnimationImages:animationViewNormalImages]; 
    [animationViewNormal setAnimationDuration:1.1f]; 
    [animationViewNormal setAnimationRepeatCount:0]; // 0=infinite loop 
    ... 
} 

우리는 가변 배열로 이미지의 스택을로드 후, 이미지 스택과 함께 우리의 이미지 뷰의 속성을 설정 기간 및 반복 횟수.) 이미지 뷰 우리가 viewWillDisappear의 뷰 (떠날 때 처리 할 필요가 무한 루프로 애니메이션되면

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    ... 
    [animationViewNormal startAnimating]; 
    ... 
} 

다음 viewDidAppear에

다음() 우리가 이미지보기에 애니메이션을 시작 :

- (void)viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 
    ... 
    [animationViewNormal stopAnimating]; 
    ... 
} 

마지막으로 변경할 수 ARRA에서 우리가 정리 (우리가 하는 .m 파일을 추가 두 번째 일이 될해야하는) 의 dealloc (에서 Y)는 :

- (void)dealloc { 
    ... 
    [animationViewNormalImages release]; 
    [super dealloc]; 
} 

이것은 우리가 그것을 처리하는 방법이며, 우리를 위해 작동하지만, 다시, 우리가 일반적으로 메모리에 이미지 4MB의를로드하지 않는 것은 애니메이션.

.PNG 파일은 응용 프로그램을 빌드 할 때 압축되며 리소스 번들의 이미지를로드 할 때 즉시 압축이 해제되는지 확실하지 않습니다. 이는 빌드 특성 빌드 설정 (COMPRESS_PNG_FILES)의 부울 값입니다.

성능을 위해 다음과 같은 고려할 수 있습니다 : 내용 불투명 한 부분 투명 합성 한 것보다 훨씬 적은 노력을 필요로하는보기를 합성 :

  • 마크 불투명 등의 전망을 제공합니다.보기를 불투명하게 만들려면 보기 내용에 의 투명도가 포함되어 있지 않아야하며보기의 불투명 속성은
    이 YES로 설정되어야합니다. 불투명 PNG 파일에서
  • 제거 알파 채널 : PNG 이미지 의 모든 픽셀이 불투명 한 경우, 알파 채널을 제거하는 해당 이미지가 포함 된 레이어를 혼합 할 필요를 피할 수 있습니다. 이 은 이미지 의 합성을 간소화하고 드로잉을 향상시키기 위해 성능을 향상시킵니다.

또한 24 개의 프레임 모두 (개별 프레임의 너비만큼 오프셋)로 만든 큰 이미지를 한 번로드하는 것이 좋습니다. 그런 다음 Core Graphics를 CGContextClipToRect으로 사용하면 이미지 컨텍스트가 오프셋됩니다. 이는 더 많은 코드를 의미하지만 표준 스택 방법을 사용하는 것보다 빠를 수 있습니다.

마지막으로, .PNG 파일을 .PVR (PVRTC) 파일로 변환하는 것이 좋습니다. 자세한 내용은 Apple Tech QA, Apple DocsSample Code입니다.

이 정보가 도움이 되었으면 투표 해주세요.

최저

, 케빈 가능 배 소프트웨어

+0

와우 케빈! 이 모든 것을 쓸 시간을내어 주셔서 감사합니다. 아직 모든 것을 소화하지는 않았지만 그것을 아주 조심스럽게 읽을 것입니다. 다시 한 번 감사드립니다. 이것이 바로 소프트웨어 개발자 커뮤니티가 지향하는 것입니다! – user422808

0

로드 방법을 애니메이션 시작을 사용하기 전에 해당 이미지. 나는 더 쉬운 방법으로 advice "applicationDidEnterForeground에서 메소드를 애니 메이팅하는 것을 호출하기 만하면된다.이 함수를 호출하면 UIImageView의 alpha 속성을 잊지 말자 .uiimageiew.alpha = 0.01로 설정하면 시작 애니메이션 메소드가 호출되고 사용자 이 애니메이션을 볼 수 없으므로 더 이상 지연이 발생하지 않습니다.

관련 문제