2012-02-05 2 views
0

이미지에 포함 된 PinView라는 UIView의 하위 클래스가 있습니다. 기본적으로 PinView는 내 앱에 여러 번 추가 된 다음 PinView 객체에 대한 변환을 수행합니다. 문제는 많은 PinView를 추가 할 때 각 PinView를 변환하기 때문에 내 앱이 느려지 게된다는 것입니다.여러보기에 개체 추가

이상적으로, 나는 하나의 '고정'PinView UIView 여러 번 추가되지만 가져 오려면 한 번만 변환해야합니다. 현재 이것은 작동하지 않는 것 같습니다. 정적 PinView 내 UIView 추가 할 때마다 UIView 한 번만 (그것 때문에 유일한 superview 내가 짐작하고있을 수있게되기 때문에) 나타납니다.

이 문제를 해결하는 가장 좋은 방법을 찾으려면 어떻게해야합니까? PinView에 단일 포인터를 사용하고 UIView에 여러 번 추가하고 통과 한 PinView에서 변환을 수행 할 수 있습니까? 내 UIView에 표시 PinViews에? (그런데 변환은 항상 모든 PinView에서 동일합니다).

임 성능 개선을위한 최선의 방법이라고 가정합니다. 그렇지 않은 경우 알려 주시기 바랍니다.

UPDATE :

- (void)layoutSubviews 
{ 
    CGAffineTransform transform = CGAffineTransformMakeScale(1.0/self.zoomValue, 1.0/self.zoomValue); 
    NSMutableArray *mut = nil; 
    PinView *pinView = nil; 
    CallOutView *callOut = nil; 

    //get all dictionary entries 
    for(NSString *identifier in self.annotationsDict.allKeys){ 
    //get the array from dictionary 
     mut = [(NSArray *)([self.annotationsDict objectForKey:identifier]) mutableCopy];   
     //change layout if not nil 
     if([[mut objectAtIndex:PIN] isKindOfClass:[PinView class]]){ 
      pinView = ((PinView *)[mut objectAtIndex:PIN]); 
      pinView.transform = transform; 
      [mut replaceObjectAtIndex:PIN withObject:pinView];    
     } 
     if([[mut objectAtIndex:CALL_OUT] isKindOfClass:[CallOutView class]]){ 
      callOut = ((CallOutView *)[mut objectAtIndex:CALL_OUT]); 
      callOut.transform = transform; 
      [mut replaceObjectAtIndex:CALL_OUT withObject:callOut]; 
      if(pinView !=nil)callOut.center = CGPointMake(pinView.center.x, pinView.center.y - pinView.frame.size.height); 
     } 

     [self updateAnnotationsKey:identifier forObject:[NSArray arrayWithArray:mut]]; 

     mut = nil; 
     pinView = nil; 
     callOut = nil; 

    } 


} 

UPDATE :

위를 제거하고 지금 막이 :

- (void)layoutSubviews 
{ 
    CGAffineTransform transform = CGAffineTransformMakeScale(1.0/self.zoomValue, 1.0/self.zoomValue); 

    for(UIView *view in self.subviews){ 
     view.transform = transform; 
    } 


} 

답변

2

이것은 난 두려워 할 수 없습니다. 각 UIView 인스턴스는 한 번만 화면에 추가 할 수 있습니다.

모든보기의 변환이 비슷한 경우 CAReplicatorLayer와 같은 것을 사용하면 행운이 생길 수 있습니다. CAReplicatorLayer는 서로 다른 변환으로 CALayers의 복사본을 자동으로 만드는 시스템입니다.

귀하의 의견이 모두 그리드 나 원 또는 어떤 것으로 정렬되어있는 경우에만 작동합니다. 그들이 무작위로 점선으로 나타나면 도움이되지 않습니다.

100 개가 넘는 뷰를 그리려는 경우 iOS의 Core Animation의 기본 성능 한도를 상상해 볼 수 있습니다.

아마도 (그것은 다른 UIKit 컨트롤이 더 나은 통합으로 나는 참새를 권하고 싶습니다 OpenGL을 여러 변형 이미지를 그리기 단순화하기 위해 Sparrow 또는 Cocos2D 같은 라이브러리를 사용하여 핀을 끌기 위해 OpenGL을 사용하는 것입니다 시도하는 다음 방법 - 코코스는 게임에 더 적합합니다).

UPDATE :

이 코드는 불필요 :

mut = [(NSArray *)([self.annotationsDict objectForKey:identifier]) mutableCopy]; 

    if([[mut objectAtIndex:PIN] isKindOfClass:[PinView class]]){ 
     pinView = ((PinView *)[mut objectAtIndex:PIN]); 
     pinView.transform = transform; 
     [mut replaceObjectAtIndex:PIN withObject:pinView];    
    } 

가있는 개체를 업데이트 할 것이다, 그래서이 객체에 포인터를 수정하지 않습니다 변환 설정 때문에 아래의 코드는 충분하다 배열이 변경 가능하지 않더라도 배열 객체는 'id'로 선언되므로 알려진 유형의 변수에 할당하면 캐스트 할 필요가 없습니다.

mut = [self.annotationsDict objectForKey:identifier]; 

    if([[mut objectAtIndex:PIN] isKindOfClass:[PinView class]]){ 
     pinView = [mut objectAtIndex:PIN]; 
     pinView.transform = transform; 
    } 

은 또한 당신이 오직 그 개체 유형에 대한 그 배열 인덱스를 사용하는 경우가 isKindOfClass: 체크를 제거 할 수 있다고 생각합니다. 그것은 좋은 예방책처럼 보일지도 모르지만 반복적으로 반복해서 수행하는 경우 성능 저하가 발생합니다.

그러나 10 회의 조회수로, 나는 이것이 전혀 느리지 않을 것이라고 기대하지 않을 것입니다. 콜 아웃 센터를 옮기지 않고 시도해 보셨습니까? 그게 더 잘됩니까? 그렇다면 현재 표시되어있는 설명 선으로 ​​만 제한 할 수 있고 중심을 설정하는 대신 CGAffineTransformTranslate를 사용하여 이동할 수 있습니다 (약간 더 빠름).

+0

서브 클래 싱 및 정적 변수가 생각하는대로 작동하지 않는다고 생각합니다. 여러보기에 대해 동일한 변형이있는 경우 동일한보기를 여러 번 추가 할 수있는 경우에도 화면의 모든 위치가 동일한 위치에 표시됩니다. 그들이 다른 장소에 있다면 다른 물건이어야합니다. –

+0

또 다른 옵션은 이미지를 drawRect : 또는 유사한 방법으로 직접 그립니다. –

+0

변환을 적용하면 병목 현상이 발생하지 않을 것입니다. 실제로 시간이 걸리는 변형 된 뷰를 렌더링합니다. 변환이 매우 복잡한 경우 틀릴 수도 있습니다. 변환을 한 번만 생성하고 정적 CSTransform3D 또는 CGAffineTransform 변수로 설정해보십시오.하지만 내가 말하는 것은 그것이 느린 것 같습니다. 보다 구체적인 도움말을 얻기 위해 질문에 코드 예제를 추가 할 수 있습니다. –