2009-08-03 5 views
0

저는 일반 검정색 사각형 인 UIImageView 객체를가집니다. 이것은 뷰에서 버튼을 선택하는 데 사용됩니다.서브 뷰 재사용

문제는 내보기에 49 개의 버튼이 있으며 모두 동시에 선택할 수 있습니다.

내가 버튼에 하위 뷰를 추가 사용하는 것은 :

UIImageView* selectedSquareView = [[UIImageView alloc] initWithFrame:CGRectMake(0,0,40,40)]; 
[selectedSquareView setImage:[UIImage imageNamed:@"SelectedSquare.png"]]; 
[button addSubview: selectedSquareView]; 

내가 selectedSquareView이 다른 버튼에 대한 파단으로 여러 번 재사용,하지만 그 중 하나 개 할당을 유지해야하고 싶습니다. 나는이 목적을 위해서 동시에 49 개의 UIImageView를 생성하는 것을 선호하지 않을 것이다. 이것이 가능한가?

그렇지 않은 경우 나중에 쉽게 제거 할 수 있도록 NSMutableArray에 저장해야합니까?

감사

레이몬드

답변

1

을 당신은 49 UIImageViews이 필요합니다, 당신은 단지 하나 개있는 UIImage가 필요합니다. UIImageViews에는 각 버튼에 대한 위치, 크기, is_higlighted 등의 정보가 들어 있습니다. 애플이 자신의 문서에 설명으로

이있는 UIImage의 많이했다하더라도 말했다되고 그건

가있는 UIImage 이러한 것들에 대해 매우 지능 있어야하는데 : 메모리 부족 상황에서

, 이미지 데이터를 제거 할 수있다 UIImage 객체에서 시스템의 메모리를 비 웁니다. 이 퍼지 동작은 UIImage 객체에 의해 내부적으로 저장된 이미지 데이터에만 영향을 미치며 객체 자체에는 영향을 미치지 않습니다. 데이터가 제거 된 이미지를 그릴 때 이미지 객체는 원본 파일의 데이터를 자동으로 다시로드합니다. 그러나이 추가로드 단계는 성능 저하를 초래할 수 있습니다.

크기가 1024 x 1024보다 큰 UIImage 개체를 만들지 마십시오. 그러한 이미지가 소비하는 많은 양의 메모리 외에도 OpenGL ES에서 이미지를 텍스처로 사용하거나 뷰 또는 레이어에 이미지를 그릴 때 문제가 발생할 수 있습니다. 이 크기 제한은 1024 x 1024 픽셀보다 큰 이미지의 크기를 비트 맵 기반 그래픽 컨텍스트로 그려서 크기를 조정하는 등 코드 기반 조작을 수행하는 경우에는 적용되지 않습니다. 실제로 이미지를이 방식으로 크기를 조정하거나 여러 개의 작은 이미지로 분할하여 뷰 중 하나에 이미지를 그릴 필요가 있습니다. 삭제해야처럼

또는 당신이 정말로 느끼는 경우있는 UIImageView의 당신이 배열에 저장하고 viewDidDisappear에 그들을 석방하고 viewWillAppear에 그들 모두를 다시 제안으로 사용하기에 당신은 할 수없는 경우.

0

각 UIView는 한 번만 표시되므로 확실히 49 개의 사본을 만들어야합니다.

UIImageView* selectedSquareView = [[UIImageView alloc] initWithFrame:CGRectMake(0,0,40,40)]; 
static UIImage* kSelectedSquareImage = [UIImage imageNamed:@"SelectedSquare.png"] retain]; 
[selectedSquareView setImage:kSelectedSquareImage]; 

그렇지 않은 경우 :

현재 코드가있는 UIImage 아마 이미지를 캐시하지만 당신이 뭔가를 한 번만 이미지를 생성 한 후 각 시간을 설정하는 것 같아서 때문에, 아마 괜찮습니다 나중에 쉽게 제거 할 수 있도록 NSMutableArray에 저장해야합니까?

컨테이너보기에 다른보기가 있는지에 따라 다릅니다. 그렇지 않은 경우 container.subviews를 사용하여보기 배열을 얻을 수 있으므로 NSMutableArray에 저장할 필요가 없습니다. 그렇지 않으면 NSMutableArray에 NSMutableArray를 저장하고 제거 할 수 있습니다. 배열에서 배열을 제거하거나 배열도 해제해야합니다 (배열에 저장되기 때문에 단순히 메모리에 남게됩니다).

관련 문제