2012-07-04 6 views
2

UIView의 하위 클래스는 MyView입니다. 사람이 다음과 같은 방식으로 최우선 setFrame의 가능한 모든 바람직하지 않은 부작용을 식별 할 수UIView setFrame 사용자 정의 구현

- (void) setFrame:(CGRect)newFrame { 

    CGPoint newCentre; 

    newCentre.x = newFrame.origin.x + newFrame.size.width/2.f; 
    newCentre.y = newFrame.origin.y + newFrame.size.height/ 2.f; 

    [super setCenter:newCentre]; 

    newFrame.origin = CGPointZero; 
    if (CGSizeEqualToSize(newFrame.size, self.bounds.size) == NO) { 
     [super setBounds:newFrame]; 
    }  
} 

을 나는 위의 아주 이상한 구현 알고에 대한 [super setFrame]를 사용하고 있지 않다 토론에 들어갈하지 않으 -하지만 슈퍼 구현을 사용하지 않아서 어떤 파급 효과가 있는지 알고 싶습니다.

+1

afaik'setCenter :'는 ('setFrame :'내부적으로 호출하는 것을 의미하는) 프레임을 수정하므로,보기의 중심 설정을 제외하고 구현시'[super setFrame :]'을 사용합니다. 그것 이외에 - 나는 "파급 효과"그 자체를 볼 수 없다. 그러나 나는'CGRectGet *'메소드를 사용할 것이다. IMHO 코드를 더 읽기 쉽게 만듭니다. – Eimantas

+0

나는 [super setCenter :]가'[super setFrame :]'을 암묵적으로 호출한다고 확신하지 않는다. 중앙의 "문서"(http://bit.ly/Na5QJ2)는 "이 속성 설정 **"에 따라 프레임 속성의 값 **을 변경합니다. " 'frame' 문서는 "이 속성을 설정하면 ** center 속성에 지정된 점과 경계 사각형의 크기가 그에 따라 바뀝니다 **". 이 설명은 여러분이 말하는 것이 사실이라면 무한 재귀를 얻을 수 있음을 의미합니다. 하나를 변경하면 다른 값의 ** 값 **이 변경되지만 문제의 setter 메소드를 호출하는 것은 아닙니다. – Barjavel

+0

이것을 확인하려면 위에있는'setFrame' 구현과'setFrame'의 수퍼 구현을 호출하는 작은 프로젝트 (git : //github.com/ryanggrey/UIViewSetFrameSetCenterTest.git의 GitHub에서)를 설정하십시오. . 나는 위의 구현이 차이를 보여주기 위해'if' 문으로 이익을 얻을 수 있도록 의도적으로 프레임의 '원점'을 변경하지만 매 반복마다 '크기'를 변경하지 않습니다. CPU 프로필을 작성하면 위의 구현이 훨씬 빠릅니다. 'setCenter'가'setFrame'을 호출했다면, 두 구현 모두 거의 같은 시간이 걸리지 않을까요? – Barjavel

답변

1

transform을 고려하지 않았습니다. 범위 크기를 프레임 크기로 설정하면 변환이 "ID"(CGAffineTransformIdentity) 인 경우에만 적용됩니다.

또한 관찰 방법 (KVO)이 호출되는지 확인합니다. 당신은 관찰 가능한 세터에 의해 centerbounds을 변경하고 있습니다.